一、 进程及其相关概念
进程:进程可以理解为程序执行的一个实例,它包括可执行程序以及与其相关的系统资源,比如打开的文件、挂起的信号、内核内部数据、处理器状态、内存地址空间及包含全局变量的数据段等。从内核的角度看,进程也可以称为任务。
进程状态包括以下五种:
(1)task_running(运行态:R):进程是可执行的;或者正在执行,或者在运行队列中等待执行。
(2)task_interruptible(可中断睡眠态:S):进程被阻塞,等待某些条件的完成。一旦完成这些条件,内核就会将该进程的状态设置为运行态。
(3)task_uninterruptible(不可中断睡眠态:D):进程被阻塞,等待某些条件的完成。与可中断睡眠态不同的是,该状态进程不可被信号唤醒。
(4)task_zombie(僵死态:Z):该进程已经结束,但是其父进程还没有将其回收。
(5)task_stop(终止态:T):进程停止执行。通常进程在收到sigstop、sigttin、sigttou等信号的时候会进入该状态。
进程的整个生命周期如下:
一个进程被fork出来后,进入就绪态;当被调度到获得CPU执行时,进入执行态;如果时间片用完或被强占时,进入就绪态;资源得不到满足时,进入睡眠态(深度睡眠或浅度睡眠),比如一个网络程序,在等对方发包,此时不能占着CPU,进入睡眠态,当包发过来时,进程被唤醒,进入就绪态;如果被暂停,进入停止态;执行完成后,资源释放,此时父进程wait4还未收到它的信号,进入僵死态。即整个周期可能会涉及的状态有:就绪态,执行态,僵死态,停止态,睡眠态。
进程控制块PCB
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息。Linux内核的进程控制块是task_struct结构体。task_struct是Linux内核的一种数据结构,它会被装载到RAM并且包含着进程的信息。每个进程都把它的信息放在task_struct这个数据结构里,task_struct包含了许多内容:
标示符:描述本进程的唯一标示符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文环境:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等。
保存在进程信息的数据结构叫做task_struct,并且可以在include/linux/sched.h里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
二、进程管理命令
1、ps命令
ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。
(1)语法
ps [参数]
(2)常用参数
(3)au(x) 输出格式:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
(4)示例:
<1>查找指定进程格式,例如显示 php 的进程: # ps -ef | grep php <2>显示进程信息: # ps -A <3>显示指定用户信息: #ps -u root //显示root进程用户信息 <4>显示所有进程信息,连同命令行: # ps -ef //显示所有命令,连带命令行 <5>根据CPU使用率来升序排序: #ps -aux --sort -pcpu | less
2、pstree命令
pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程。
使用权限:所有使用者。
(1)语法:
pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>]
(2)常用参数:
(3)示例:
    <1>显示完成的树形结构:       #pstree –a
init NetworkManager--pid-file=/var/run/NetworkManager/NetworkManager. pid -dhclient-d-4-sf/usr/libexec/nm-dhcp-client.action-pf/var/run/dhclient-eth0.pid ... L-{NetworkManager} --VBoxClient --clipboard L-VBoxClient --clipboard Hx--1024
<2>显示进程号:
#pstree -p
init(1)---NetworkManager(6362)---dhclient(6377) L-{NetworkManager} (6379) --VBoxClient(7869)---VBoxClient(7870)---{VBoxClient}(7872) --VBoxClient(7882)---VBoxClient(7883) -VBoxClient(7890)--VBoxClient(7891)-{VBoxClient}(7894) -VBoxClient(7898)---VBoxClient(7899)--{VBoxClient}(7901) L-{VBoxClient}(7903) Hx--1024
3、nice命令
nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的 adjustment 为 10,范围为 -20(最高优先序)到 19(最低优先序)。
使用权限:所有使用者。
(1)语法:
nice [参数]
(2)参数:
n:指定进程的优先级(整数)。
(3)示例:
<1>若不带任何参数运行命令nice,则显示出当前的程序运行优先级:
#nice 0
<2>优先级范围为-20~19,当调整后的优先级小于-20时,以优先级-20 来运行程序;当调整后的优先级大于19时,则以19的优先级运行程序;如下
#nice -n -21 nice -20 #nice –n 20 nice 19
4、kill命令
kill 命令用于删除执行中的程序或工作。
kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。
(1)语法: kill[参数][进程号]
(2)常用参数:
(3)示例:
<1>列出所有信号名称
#kill -l
SIGHUP 2) SIGINT SIGQUIT SIGILL 5) SIGTRAP 3) 4) 6) SIGABRT 7) SIGBUS 8) SIGFPE SIGKILL 10) SIGUSR1 9) 11) SIGSEGV 12)SIGUSR2 13)SIGPIPE 14)SIGALRM 15)SIGTERM 16) SIGSTKFLT 17)SIGCHLD 18)SIGCONT 19)SIGSTOP 20) SIGTSTP 21) SIGTTIN 22)SIGTTOU 23)SIGURG 24)SIGXCPU 25)SIGXFSZ 26)| SIGVTALRM 27)SIGPROF 28)SIGWINCH 29)SIGIO 30) SIGPWR 31) SIGSYS 34)SIGRTMIN 35)SIGRTMIN+1 36) SIGRTMIN+2 37)SIGRTMIN+3 38) SIGRTMIN+4 39)SIGRTMIN+5 40)SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+944) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49)SIGRTMIN+15 50)SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60)1 SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX Hx--1024
说明:只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线、INT 2 中断(同 Ctrl + C)、QUIT 3 退出(同 Ctrl + \)、TERM 15 终止、KILL 9 强制终止、CONT 18 继续(与STOP相反, fg/bg命令)、STOP 19 暂停(同 Ctrl + Z)
<2>得到指定信号的数值
#kill -I KILL9 # kill -I TERM15
<3>先用ps查找进程,然后用kill杀掉
#ps -ef arep vim root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log root3370 2822 0 16:21 pts/000:00:00 grep vim# kill 3268
<4>彻底杀死进程
#kill –9 3268
<5>杀死指定用户所有进程
#kill -9 $(ps -ef | grep peidalinux) #kill -u peidalinux