引言
任何计算机系统都包含一个基本的程序集合,成为操作系统(OS)。操作系统包括:
(1)内核:进程管理、内存管理、文件管理、驱动管理……
(2)其他程序:函数库、shell程序……
那么计算机是如何管理进程的呢?
总结起来就是先把进程描述起来,用struct结构体,再把进程组织起来,用链表或者更高效的数据结构。
什么是进程呢?
概念
- 课本内容:程序的一个执行实例,正在执行的程序等;
- 内核观点:担当分配系统资源(CPU时间,内存)的实体;
描述进程的PCB
进程信息被放在一个叫做进程控制块的数据结构中,可理解为进程属性的集合,课本上叫做PCB(process control block),Linux操作系统下的PCB是:task_struct。
task_struct内容分类
- 标识符:与进程相关的唯一标识符,用来区别正在执行的进程和其他进程。
- 状态:描述进程的状态,因为进程有挂起,阻塞,运行等好几个状态,所以都有个标识符来记录进程的执行状态。
- 优先级:如果有好几个进程正在执行,就涉及到进程被执行的先后顺序的问题,这和进程优先级这个标识符有关。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:程序代码和进程相关数据的指针。
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。
- 记账信息:包括处理器的时间总和,记账号等等。
- 其他信息
每一个PCB都包含这些信息,它定义在下图文件的sched.h中。
下面让我们来看一下sched.h中对task_struct的结构体成员们:
进程状态
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
上面这个变量就是描述进程状态的成员,其中volatile关键字是降低编译器对代码的优化,使得state变量一直从变量的内存中读取内容而不是寄存器;从而保证对操作系统状态实时访问的稳定性。
state成员的可能取值如下:
/*
* Task state bitmask. NOTE! These bits are also
* encoded in fs/