1.进程定义
进程是操作系统的核心和基础,所有多道程序操作系统,它们的创建都围绕着进程的概念。因此操作系统必须满足的大多数需求表示都涉及进程。
进程的定义:
- 正在执行的程序。
- 正在计算机上执行的程序实例。
- 能分配给处理器并由处理器执行的实体。
2.进程分类
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。
- 交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
- 批处理进程——需要用户交互,一般在后台运行。所以不需要非常快的反应,他们经常被调度期限制。典型的批处理进程:编译器,数据库搜索引擎和科学计算。
- 监控进程(也称守护进程)——Linux系统启动时启动的进程,并在后台运行。
上述三种进程各有各的作用,使用场合也有所不同。
3.进程控制块(PCB)
Linux系统需要对进程进行管理操作,就需要一个进程的各种信息,而进程控制块就是进程的描述。
那么系统是怎么保存这些信息的呢?
Linux的进程控制块为一个结构task_struct所定义的数据结构, 在创建一个新进程时,系统在内存中申请一个空的task_struct区,即空闲PCB块,并填入所需信息。并且将该结构存入tast[]数组中。
task_struct在/include/linux/sched.h中,其中包括管理进程所需的各种信息。Linux系统的所有进程控制块组织成结构数组形式。
task_struct 结构中包含了许多字段,按照字段功能,可分成如下几类:
- 标识符(Identifiers):每个进程都有一个进程标识号(PID)和一个父进程标识号(PPID),其中PID唯一标识一个进程。另外,一个进程还有自己的用户标识号(UID)和组标识号(GID),系统通过这两个标识号判断进程对文件或设备的访问权。
- 进程状态(State) : Linux 进程可有如下几种状态:运行、等待、停止和僵死。
- 优先级:相对于其他进程的优先级
- 进程调度信息:系统通过调度信息实现进程间通讯。
- 进程链接信息(Links):Linux系统中,除了初始化进程init,任何进程都具有父进程同时也可能有兄弟进程或子进程。所以系统有必要记录这些关系,所以每个进程的PCB中都记录着该进程的父进程、子进程以及兄弟进程。每个进程的task_struct结构有许多指针,通过这些指针,系统中所有进程的task_struct结构就构成了一棵进程树,这棵进程树的根就是初始化进程init的task_struct结构(init进程是Linux内核建立起来后人为创建的一个进程,是所有进程的祖先进程)。
- 时间和定时器信息(Times and Timers):进程在其生存期内使用CPU的时间,内核都要进行记录,以便进行统计、计费等有关操作。
- 文件系统信息(File System):进程可以打开或关闭文件,文件属于系统资源,Linux内核要对进程使用文件的情况进行记录。task_struct结构中有两个数据结构用于描述进程与文件相关的信息。其中,fs_struct中描述了两个VFS索引节点(VFS inode),这两个索引节点叫做root和pwd,分别指向进程的可执行映象所对应的根目录(home directory)和当前目录或工作目录。
- 虚拟内存信息(Virtual Memory):每个进程都拥有自己的地址空间(也叫虚拟空间),用mm_struct来描述,内核随时了解和控制进程的内存空间,PCB中必须保存进程内存空间的相关信息。
- 上下文数据:进程执行时处理器的寄存器中数据。当进程暂时停止运行时,处理机状态必须保存在进程的task_struct结构中,当进程被调度重新运行时再从中恢复这些环境,也就是恢复这些寄存器和堆栈的值。