一、进程概念
- 对正在运行的程序的一种抽象
- 可以分配处理器,并由处理器执行
- 内核观点:进程是分配系统资源(cpu时间、内存)的实体
进程的两个基本元素是程序代码(可能被执⾏行相同程序的其他进程共享)和代码相关联的数据集。进程是一种动态描述,但是并不代表所有的进程都在运⾏行。(进程在内存中因策略或调度需求,会处于各种状态)
二、进程的描述–PCB
进程的所有信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
进程控制块
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息;Linux内核的进程控制块是一个叫做task_struct结构体
task_struct是Linux内核的一种数据结构,每个进程都把它的信息放在 task_struct 这个数据结构⾥里
task_struct 包含了这些内容:
标⽰示符 : 描述本进程的唯⼀一标⽰示符,⽤用来区别其他进程。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执⾏行的下⼀一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下⽂文数据:进程执⾏行时处理器的寄存器中的数据。
I/O状态信息:包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤用的⽂文件列表。
所有运⾏在系统⾥里的进程都以 task_struct 链表的形式存在内核⾥里。
三、查看进程
查看一个终端(窗口)下的进程,打开另一个终端用ps查看
可以看到两个关于进程./a.out的进程信息文件分别在pts/0和pts/1下
反向过滤掉grep a.out,剩下的就是我们想要查看的pts/0终端下的进程信息
四、僵尸、孤儿进程
僵尸进程就是父进程还在,子进程已死
当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。
僵尸进程会以终⽌止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
僵尸进程:⼀个子进程在其⽗进程没有调⽤用wait()或waitpid()的情况下退出。这个⼦进程就是僵⼫进程。如果其⽗进程还存在而一直不调wait,则该僵尸进程将无法回收,等到其⽗进程退出后该进程将被init回收。
孤儿进程就是子进程还在,父进程已死
孤儿进程:一个⽗进程退出,而它的⼀个或多个子进程还在运行,那么那些⼦进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。