linux进程管理及工具的讲解

首言

计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找某个地址等等。这些最基础的计算机动作被称为指令。所谓的程序,就是这样一系列指令所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。
进程是程序的一个具体实现,同一个程序可以被执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程号可以拥有各自独立的IO接口。操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空间,管理进程的相关信息等等。
linux是一种动态系统,能够适应不断变化的计算需求。linux计算需求的表现是以进程的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得极为重要。
在用户空间,进程是由进程标识符(PID)表示的。从用户的角度来看,一个PID是一个数字值,可唯一标识一个进程。一个PID在进程的整个生命期间不会更改,单PID可以在进程销毁后被重新使用。

程序:保存在硬盘,光盘等介质中的可执行代码和数据;是静态保存的代码
进程:在cpu及内存中运行的动态执行的程序代码
同一个程序可能对应多个进程
线程:有时被称为轻量级进程,时程序执行流的最小单位
每个运行中的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程。

一 进程和线程的区别

他们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
(1)地址空间和其它资源(如打开文件):进程间互相独立,同一进程的各线程间共享。
(2)通信:进程间通信:共享内存,信号等;线程间通信可以直接读写进程数据段(如全局变量)来通信–需要进程同步和互斥手段的辅助,以保证数据的一致性。
(3)调度和切换:线程上下文切换要比进程上下文切换快的多。
(4)在多线程的OS中,进程不是一个可执行的实体。????

进程被存放在叫做任务链表(task list)的双向循环链表中,linux内核存储进程信息的固定格式:task struct
进程上下文切换:指多任务系统中,CPU的控制权由运行任务,转移到另外一个就绪任务时所发生的时间;当前运行任务转为就绪(或者挂起,删除)状态,另外一个被选定的就绪任务成为当前任务。
这里写图片描述
这里写图片描述

二 进程创建

在linux系统中,所有进程都是PID为1的init进程的后代。内核在启动的最后阶段启动init进程。该进程读取系统的初始化脚本,并执行其他的相关程序,最终完成系统启动的整个进程。
进程是系统中基本的执行单位(线程是最小的调度单位),可以利用fork函数创建一个新的进程。

pid_t fork(void)

fork()函数不需要参数,但返回两次,返回值有三种情况:
(1)对于父进程,fork函数返回新的子进程ID。
(2)对于子进程,fork函数执行成功返回0
(3)如果出错,fork函数返回-1

内核采用写时复制技术,fork函数创建一个新的进程,并从内核中为此进程得到一个新的可用进程ID,之后,为这个新进程分配进程空间,并将父进程的进程空间中的内容复制到子进程的进程空间中,包括父进程的数据段+堆栈段,并与父进程共享代码段。
fork函数之后,子进程从等待fork返回开始执行,而不是从头开始。
注意:子进程完全复制了父进程的地址空间的内容,包括堆栈段+数据段的内容。但是,子进程并没有复制代码段,而是和父进程共享代码段。代码段是只读的,不存在修改的问题,因此可以共用。在创建一个子进程后,子进程的地址空间和父进程分开,父子进程是两个独立的进程。

linux环境下提供一个和fork函数类似的函数,可以用来创建一个共用父进程地址空间的子进程

pid_t vfork();

(1)vfork产生的子进程和父进程完全共享地址空间,包括代码段+数据段+堆栈段。子进程对共享资源进行的修改,也会影响到父进程。
(2)vfork函数产生的子进程一定比父进程先运行。即父进程调用了vfork函数后会等待子进程运行后再运行。

三 进程优先级

PRI(0-139:)
    1-99:实时优先级;
    100-139:静态优先级;数字越小,优先级越高;
        Nice值:-2019,表示进程可被执行的优先级的修正数值。加入nice值后,
        将会使得PRI变为:PRI(new)=PRI(old)+nice。普通用户只能使用+nice,
        系统管理员可以使用所有。

四 内存划分为:用户空间和内核空间

在用户空间里运行的进程,就是用户进程,所属的状态为用户态
在内核空间里运行的进程,就是内核进程,所属的状态为内核态
例:执行内核里的代码的时候,就是数与内核态。
linux的kernel其实就是一个软件,比较核心而已。
内核作用:进程管理,文件系统,网络功能,内存管理,驱动程序,安全功能

五 linux内核:抢占式多任务

进程类型:
  守护进程:在系统引导过程中启动的进程,跟终端无关的进程;
  前台进程:跟终端相关,通过终端启动的进程
    注意:也可把再前台启动的进程送往后后台,以守护进程模式运行;

进程状态:
  运行态:running
  就绪态:ready
  睡眠态:
    可中断:interruptable
    不可中断:uninterruptable
  停止态:stopped,暂停于内存中,但不会被调度,除非手动启动;
  僵死态:zombie

进程的分类:
  CPU-Bound
  IO-Bound

六 Linux进程查看及管理的工具

pstree
pstree - display a tree of process
pstree -p :显示其pid

注意:使用{}的是进程的线程

这里写图片描述

ps: process state
ps - report a snapshot of the current process
查看静态的进程统计信息
linux系统各进程相关信息均保存再/proc/PID目录下的各文件中;

ps [options]...
  常用组合:aux
    u:以用户为中心组织进程状态信息显示;
    a:与终端相关的进程;
    x:与终端无关的进程;
    p]# ps aux
    USER  PID %CPU %MEM  VSZ  RSS TTY  STAT START  TIME COMMAND
      VSZ:Virtual memry SiZe,虚拟内存集
      RSS:ReSident Size,常驻内存集
      STAT:进程状态
        R:running  S:interruptable sleeping
        D: uninteruptable sleeping  T:stopped  Z:zombie
        +:前台进程  l:多线程进程  N:低优先级进程
        <:高优先级进程  s:session leader

  常用组合:-ef
    -e:显示所有进程
    -f:显示完整格式程序信息

  常用组合:-eFH
    -F:显示完整格式的进程信息
    -H:以进程层级结构格式显示进程相关信息

  常用组合: -eo ,axo 自定义显示项
    -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
    0axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
      ni:nice值
      pri:priority,优先级
      psr:processor,CPU
      rtprio:实时优先级

这里写图片描述

pgrep pkill
pgrep [options] pattern
pkill [options] pattern
  -u uid: effective user
  -U uid: real user
  -t terminal: 与指定终端相关的进程
  -l:显示进程名
  -a:显示完整格式的进程名
  -P pid:显示其父进程为此处指定的进程的进程列表
pidof

根据进程名获取其PID;
这里写图片描述

top
排序:  P:以占据CPU百分比;
       M:占据内存百分比;
       T:累积占据CPU时长;

首部信息提示: uptime信息: l命令
             tasks及cpu信息:t命令
                CPU分别显示:1
             memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k

这里写图片描述

解析:load average0.06,0.60,0.48
表示系统负载,即任务队列的平均长度。
三个数值分别为1分钟,5分钟,15分钟前到现在的平均值。

w和uptime也可以查看top的顶头信息

这里写图片描述

htop

下载地址:https://mirrors.aliyun.com/epel/

选项:
  -d #:指定延迟时间;
  -u UserName:仅显示指定用户的进程;
  -s COLOMN:以指定字段进行排序;
命令:
  s:跟踪选定进程的系统调用;
  l:显示选定进程打开的文件列表;
  a:将选定的进程绑定至某指定CPU核心;
  t:显示进程树

这里写图片描述

vmstat命令

显示虚拟内存状态
用法: vmstat [options] [delay [count]]

procs:  r:等待运行的进程的个数;
        b:处于不可终端睡眠态的进程的个数;
memory:  swpd:交换内存的使用总量;
          free:空闲物理内存总量;
          buffer:用于buffer的内存总量
          cache:用于cache的内存总量
swap:  si:数据进入swap中的数据速率(kb/s)
        so:数据离开swap中的数据速率(kb/s)
io:   bi:从块设备读入数据到系统的速率;
       bo:保存数据至块设备的速率;
system: in:interrupts,中断速率;
         cs:context switch,进程切换速率;

选项: -s:显示内存的统计数据 /proc/meminfo
这里写图片描述

kill命令
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:
  # kill -l
  # man 7 signal

常用信号: 
  1)SIGHUP:无须关闭进程而让其重度配置文件;
  2)SIGINT:终止正在运行的进程,相当于Ctrl+c
  9)SIGKILL:杀死正在运行的进程;
  15)SIGTERM:终止正在运行的进程;

指定信号的方法:
  (1)信号的数字标示:1292)信号完整名称:SIGHUP
  (3)信号的简写名称:HUP

向进程发信号:
  kill [-SIGNAL] PID...

终止“名称“之下的所有进程:
  killall [-SIGNAL] Program

猜你喜欢

转载自blog.csdn.net/qq_36462472/article/details/80231536
今日推荐