文章目录
什么是进程
进程的描述
- 进程是程序的一个执行实例;
- 进程是正在执行的程序;
- 进程是能占用处理资源(被分配)并由处理器执行的实体。
从内核来看,进程是分配系统资源(CPU时间、内存等)的实体。
进程的两个基本要素
- 程序代码–可能被执行相同程序的其他进程共享
- 代码相关联的数据集–数据段和进程控制块
虽然进程是一种动态描述,并不代表所有的进程都在实时运行–进程因调度需求(内核有不同的调度策略),可能会处于不同的状态(5个互斥状态、2个终止状态)。
操作系统执行程序的过程说明
-
通过虚拟内存,有效利用CPU与内存资源。参考
-
前面有提到进程是正在执行的程序,但并不是所有进程都在运行。这两句话看似矛盾(0.0),实则不然。–在用户看来所有的进程都是在实时运行的,但是在内核层面,程序被夹在到内存后,它的执行有进程的状态和调度算法来决定。
进程的描述
操作系统管理进程,实则是将进程的有效信息提取出来然后通过管理这些信息来管理进程,而所有的进程信息被存放在一个叫做进程控制块(PCB)的数据结构中(可以理解为进程属性的集合–即下面提到的进程描述符)。
进程描述符(process descriptor)概念
为了管理进程,内核必须知道每个进程的信息与其所做的事情(进程优先级、分配的地址空间、访问权限etc.)。 这正是通过 进程描述符 的作用。
进程描述符的类型结构
进程描述符都是task_struct
类型结构, 它的字段包含了与一个进程相关的所有信息(内核还定义了task_t
数据类型来等同struct task_struct
)。
进程描述符都是task_struct
类型的结构,它的字段包含了与一个进程相关的所有信息。因为进程描述符中存放了那么多信息,所以它是非常复杂的,它不仅仅包括了很多进程属性的字段,还有一些字段包括了指向其他数据结构的指针,如下图:
图中右边的六个数据结构涉及进程所拥有的特殊资源。( 目前还不是很了解这六个数据结构的内容及定义,有兴趣可查阅相关资料。)
task_struct 包含以下内容
- 标示符 : 描述本进程的唯一标识符,用来区别其他进程;
- 状态 :任务状态,退出代码,退出信号等;
- 优先级 :相对于其他进程的优先级;
- 程序计数器:程序中即将被执行的下一条指令的地址;
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针;
- 上下文数据:进程执行时处理器的寄存器中的数据。;
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表;
- 记账信息:可能包含处理器时间总和,使用的时钟数总和,时间限制,记账列表等。
关于进程信息你还需要了解的是
-
保存进程信息的数据结构叫做 task_struct,可以在 include/linux/sched.h 中找到它;
-
所有运行在系统中的进程都以 task_struct 链表的形式存在内核中;
-
进程的信息可以通过 /proc 系统文件夹查看。要获取PID为400的进程信息,你需要查看 /proc/400 这个文件夹。大多数进程信息同样可以使用top和ps这些用户级工具来获取,例如: