linux 进程管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


什么是进程?

Linux内核通常把进程叫作任务,进程控制块(PCB Processing Control Block)用struct task_struct表示。

线程是轻量级进程,是操作系统做小调度单元,一个进程可以拥有多个线程。

线程之所以被称为轻量级,是因为共享进程的资源空间。线程和进程使用相同的进程PCB数据结构。

进程的状态

在一个cpu上,可以存在多个进程,但是同一个时间段内,只能有一个进程工作。操作系统使用一定的算法管理所有进程,使进程进行切换;所以进程有多种状态;

Linux进程有六种状态:

  1. R (TASK_RUNNING),可执行状态。
  2. S (TASK_INTERRUPTIBLE),可中断的睡眠状态。
  3. D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。
  4. T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态。
  5. Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。
  6. X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。

R (TASK_RUNNING):

只有在该状态的进程才可能在CPU上运行。

而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。

进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

S (TASK_INTERRUPTIBLE):

处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。

这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

D (TASK_UNINTERRUPTIBLE):

进程是不可中断的,不可以被信号打断(并不是CPU不响应外部硬件的中断),必须等到等待的条件满足时才被唤醒。这个状态通常在进程必须等待时不受干扰或所等待的事件很快发生时使用。
绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则,kill -9就杀不死一个正在睡眠的进程了!

TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行。
而TASK_UNINTERRUPTIBLE只能被wake_up()唤醒。

 

T (TASK_STOPPED or TASK_TRACED)

向进程发送一个SIGSTOP信号,就会进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。

向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态;

“正在被跟踪”指的是进程暂停,等待跟踪它的进程对它进行操作。比如gdb调试,在断点处停下来的时候就处于TASK_TRACED状态;

Z (TASK_DEAD - EXIT_ZOMBIE)

当子进程退出并且父进程没有读取到子进程退出的返回代码,就会产生僵死(尸)进程,

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,父进程没有读取进程状态,子进程进入Z状态;

  

问题1:为什么要有僵尸进程?

因为我们必须得保证一个进程跑完,父进程或是操作系统必须得知道这个进程退出时,把我们交代得任务完成得怎么样了,成功还是失败了。必须要知道子进程得运行结果。当子进程退出的时候,它的信息不会立即释放,会存在PCB中,没有人读取,这个状态不会被释放掉,这个状态就是僵尸状态;

问题2:僵尸进程有什么危害?

  1. 子进程会一直处于僵尸状态
  2. task_struct会一直需要维护;
  3. 内存泄漏;

孤儿进程:

孤儿进程,当一个进程的父进程结束时,但自己还没有结束,那么这个进程将会成为孤儿进程。

孤儿进程会被init进程(1号进程)的进程收养,当然在子进程结束时也会由init进程完成对它的状态收集工作,因此一般来说,孤儿进程并不会有什么危害.

X (TASK_DEAD - EXIT_DEAD)

这个状态只是一个返回状态,你不会在任务列表里看到这个状态。当父进程读取子进程的返回结果时,子进程立刻释放资源。

进程的状态切换

 

进程只有是R状态才可被调度,其他状态要先转为R状态,才能被系统调度;

Linux可以管理512个进程,每个进程的进程控制块指针都存放在一个数组中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值