基本概念
狭义定义:进程是正在运行的程序的实例。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
task_struct
在Linux中描述进程的结构体叫做task_struck。
task_struck是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_struct内容分类:
标识符:描述本进程的唯一标识符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示当地I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息。
僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
模拟实现僵尸进程
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6 pid_t id = fork();
7 if(id < 0)
8 {
9 perror("fork");
10 return 1;
11 }
12 else if(id > 0)
13 {
14 printf("father[%d] is sleeping...\n",getppid());
15 sleep(30);
16 }
17 else
18 {
19 printf("child[%d] is begin Z..\n",getpid());
20 sleep(5);
21 exit(EXIT_SUCCESS);
22 }
23 return 0;
24 }
孤儿进程
父进程如果提前退出,那么子进程后推出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程“。
孤儿进程被1号init进程领养,当然要有init进程回收。
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 pid_t id = fork();
8 if(id < 0)
9 {
10 perror("fork");
11 return 1;
12 }
13 else if(id == 0)
14 {
15 printf("I am child,pid: %d\n",getpid());
16 sleep(10);
17 }
18 else
19 {
20 printf("I am father,pid: %d\n",getppid());
21 sleep(3);
22 exit(0);
23 }
24 return 0;
25 }