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值:-20,19,表示进程可被执行的优先级的修正数值。加入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 average:0.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)信号的数字标示:1,2,9
(2)信号完整名称:SIGHUP
(3)信号的简写名称:HUP
向进程发信号:
kill [-SIGNAL] PID...
终止“名称“之下的所有进程:
killall [-SIGNAL] Program