进程(2)
结构性
PCB,即进程控制块
操作系统为每一个进程创建一个进程控制块来以便于管理进程,把进程相关的一些重要的信息放在PCB里面
进程控制块的作用
- 控制进程;
- 是进程存在的唯一标识。(因为里面包含一个进程标识数,那个东西可以称作进程的 ID)
进程控制块的主要内容
-
进程标识数
进程的唯一标识
在windows系统和linux系统中都是一个整数,下图中的PID就是进程标识数
-
进程的状态、调度、存储器管理信息
这里的表述让我感觉有一点蒙,原作的意思应该是状态管理+调度管理+存储器管理
其中包括:进程目前所处的状态(就绪态啥的)、进程优先级、程序在主存的入口地址、在外存的地址、信息允许的存取保护方式和进程所在队列的指针等调度信息 -
进程正在使用的资源信息
比如分配给进程的I\O设备,或者正在打开的文件 -
记账信息
比如CPU使用时间,还有账户 -
进程之间的家族关系
linux系统中每个进程会有父进程,也可能会有子进程 -
CPU现场保护区
当进程由于某种原因不能继续运行时,要将其CPU运行的现场信息保存起来,以便下次调度运行时恢复现场继续运行 -
进程的链接指针
操作系统把状态相同的进程的PCB通过链表串在一起来管理,这个链接指针会指向链表中下一个进程
这一块感觉很容易出简答题or填空,但是应该不会单独拿出来细考
本来不想写这一段的,但是发现自己记不住上面的点
举一个不太严谨的例子,想象自己是一个linux操作系统,现在我们收到小A的委托要去管理她创建的进程MyProcess:
假设MyProcess正在CPU里面执行,它现在已经创建了一个子进程,并且它已经打开了一些文件开始读,小A非常无聊,想把它从CPU里面弄出来一下在放回去运行一段时间再把它和它的子进程销毁,现在想想我们需要什么。
首先是不是得给她一个唯一标识符进程标识数,不然这么多进程我们会分不清。
它已经打开了一个文件,那再次执行的时候也应该打开之前的文件,所以需要记录它正在使用的资源信息。
除了使用资源,它还有可能正在进行一些运算,这些运算产生的中间结果会放在CPU的寄存器里面,为了使MyProcess再次执行的时候能够正常的继续它的运算,我们需要把这些关键的信息记录在CPU现场保护区里面。
把MyProcess从CPU里面拿出来之后,这台计算机上肯定不止它一个处于就绪态的进程,要管理这么多进程我们需要一个数据结构:链表。
MyProcess作为链表的一个节点,自然而然的就需要一个指向下一个节点的指针,即进程的链表指针。
作为一个重视优先级的系统,在MyProcess处于就绪态的时候,如果此时有更加重要优先级更高的进程也处于就绪态,我们会选择后者,而不是MyProcess 。 为此需要在PCB中记录优先级等信息,即进程状态、调度、存储器管理信息
小A希望把它和它的子进程一起销毁,所以我们要能够从MyProcess找到它的子进程,所以PCB还要记录进程家族关系。
linux是允许多个用户同时操作的,为了防止粗心的小B不小心打乱我们的计划,我们需要标识当前的进程是属于小A的,把她的账户记在PCB里面,即记账信息。
并发性、独立性
进程调度
进程调度最终是由操作系统的进程调度程序来实现的,粗暴的理解,
当有很多进程都要执行的时候操作系统的进程调度要决定先执行哪一个,并且有这么多进程在CPU不断的切换的时候,进程调度程序还要保证切换不会导致出错
进程调度的功能
这一部分就是在讲进操作系统的程调度程序做了哪些事。
要决定现在要执行哪一个进程,至少得先知道现在哪些进程就绪了,哪些进程阻塞了吧,所以要 “记录系统中各个进程的执行情况”;
知道了进程的状态和情况之后,要在就绪的进程中选出一个来执行,即“选择就绪进程占有CPU”;
选好了以后就得把选好的进程弄到CPU里面去执行了,这一步就是“进程上下文切换”。