Linux进程
进程是程序的一个执行实例,正在执行的程序等。 在内核的角度看 : 担当分配系统资源(CPU时间,内存)的实体。
文章目录
一、PCB(进程控制块)
PCB (process control block)
进程的信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。是一个C语言的结构体 task_struct
task_struct 内容
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
-
标示符:描述本进程的唯一标示符,用来区别其他进程。状态:任务状态,退出代码,退出信号等。
-
优先级:相对于其他进程的优先级。
-
程序计数器:程序中即将被执行的下一条指令的地址。
-
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
-
上下文数据:进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
-
l/O状态信息:包括显示的I/O请求,分配给进程的l/o设备和被进程使用的文件列表。
-
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。·其他信息
二、查看进程
Linux 中,万物皆文件,/proc 文件夹下就存储的进程信息。 可以用ps 或 top命令查看进程信息。
使用系统调用接口获取PID
通过fork创建进程
fork是一个系统调用接口,通过它创建一个子进程。
- fork有两个返回值,它为子进程返回0,为父进程返回子进程的pid。
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
fork创建的子进程和父进程共享一份用户代码,而用户数据都是独立私有的,所有进程都有独立性,例如多开几个QQ,一个崩溃了不会影响其他进程。
父进程和子进程的执行顺序是不确定的。
fork为子进程返回0,为父进程返回子进程pid,通过fork不同的返回值使两个执行流进行不同的操作,这就是并发。
三、进程状态
在Linux内核中,进程一共有以下几种状态。
-
R(runing) : 运行,并不是正在运行的进程才处于运行态,只要处于运行队列中的进程都是R状态。
-
S (sleeping) :浅度休眠,这种状态可以被外部信号唤醒。
-
D (disk sleep) :深度休眠,这种状态的进程操作系统也无法杀死,例如往硬盘写入数据时,此进程就处于D状态。
-
T (stopped) : 例如用kill -19 6198 命令停止 pid为6198的进程。
(还可以通过kill -18 使进程继续运行) -
t (tracing stop) : 程序在debug时,程序执行到断点处此时就处于 t 状态。
-
Z (zombie) : 僵死状态(Zombies),是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态 -
X (dead) : 进程一处于这个状态,操作系统就立即回收该进程资源。
僵尸进程的危害
进程的退出状态必须一直被维持下去,因为他要告知其进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态,操作系统还需要继续维护该进程的PCB,就会造成内存泄露。
孤儿进程
父进程如果提前退出子进程还在运行,那么子进程就会成为孤儿进程,孤儿进程会被pid为1 (init进程)的进程领养,如果子进程进入Z状态那么回收工作也就由 init 进程执行。
无法被kill的进程
处于D状态的进程和僵尸进程,是无法被杀死的。
进程优先级
- PRI∶代表这个进程可被执行的优先级,其值越小越早被执行
- Nl︰代表这个进程的nice值
linux中的进程优先级由 priority值 和 nice 值确定,数值越小,优先级越高。
PRI & NI
PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先居顺序,此值越小进程的优先级别越高
那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRl(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别。
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正修正数据