进程的状态
- 就绪
- 运行
- 僵尸
- 暂停
- 睡眠
- 深度睡眠
- 浅度睡眠
为了加深印象,我自己画了一个图:
进程是什么?进程是 Linux 系统的最小资源分配单元。
这里面有一个关键字是“资源”,一台计算机的资源有哪些呢?有一下几个:
- cup
- memory
- file
- I/O 设备
所有一定会有一种数据结构来描述这些资源。这就是 task_struct
task_struct {
pid ,
...
mm , -- 内存地址
fs , -- 和进程相关的路径
files -- 文件资源
}
为了加深对线程状态的理解,举个小例子。
第一个小练习:
main()
{
while(1){
printf("hello\n");
}
}
在这个例子中,我们使用 kill 的来改变进程的状态。ctrl+z
让进程进入停止状态,ctrl+c
让进程进入终止状态。然后使用 fg 或者 bg 让进程在起来。
fork
第一个练习:
main()
{
fork();
printf("hello\n");
fork();
printf("hello\n");
while(1);
}
这个小程序的运行时序图如下图:
第二个小练习:
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid,wait_pid;
int status;
pid = fork();
if (pid==-1) {
perror("Cannot create new process");
exit(1);
} else if (pid==0) {
printf("a\n");
} else {
printf("b\n");
}
printf("c\n");
while(1);
}
总结一下
- 就绪状态:等待执行的进程,此时进程的没有获取到 cpu 资源。其他的内存资源应该有。
- 运行态: 排队,排上了,获得了 cpu 的资源。
- 睡眠态: 也可以叫阻塞,因为进程没有除 cpu 以外的资源了,进程有不能站着茅坑不拉屎,那就先去睡一觉,等资源来再接着执行。
- 僵尸态:处在僵尸态的进程已经是死了,用 kill -9 也杀不死,不是杀不死,而是只剩下一具尸体了,这具尸体就是 task_struct 。处在僵尸态的进程,只有等着它的父进程收尸。才能在进程列表中消失。主要是要返回给父进程一个死亡原因。给人家一个交代。
- 停止态:是人为的让进程停下来,让其进入停止态。明显的例子就是 cpulimit 的例子,周期性的发 ctrl+z 这种信号,然后再发 fg bg 这种信号。