操作系统——进程(1)什么是进程和对进程状态的理解

在操作系统中满足的大多数需求都涉及进程,在有了应用程序、系统软件和资源的概念,就需要一种有序的方式管理应用程序的执行,从而能够让资源对多个应用程序是可用的、能够让所有程序得以执行、充分利用所有设备。
进程如此重要那么进程是什么?首先进程是一个正在计算机上执行的程序实例,即程序是静态的而程序是动态的,这么说有一些抽象,换一个说法进程是一个运动的过程这个过程能被交给处理机去执行,也就是一个应用程序运行的时间段。那么从操作系统的角度来说进程是什么呢?首先进程是由数据集、程序代码和进程控制块组成,但操作系统的眼中只有进程控制块,可以说系统是通过进程控制块来感知进程是否存在,所以进程控制块已经成为进程存在于系统的唯一标志。对于系统来说进程就是一个名为进程控制块的数据结构,并且这个数据结构可以被分配调度。
通过程序代码段和数据集以及进程控制块(PCB)组成的实体,具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源。

进程控制块的数据结构内存储的信息,充分到可以中断一个进程的执行并且恢复的时侯就像从未中断过一样。在一个进程控制块内具有以下信息等:
(1)标识符:分为内部标志符和外部标志符,内部标识符是方便系统对进程的使用由系统创建,外部标识符由创建者提供方便用户对进程的访问。
(2)状态:表明进程所处的环境。
(3)优先级:相对于其他进程的优先级。
(4)程序计数器:程序中即将被执行的下一条指令的地址。
(5)内存指针:包括程序代码和进程相关数据的指针,和其他进程共享内存块的指针。
(6)上下文数据(处理器寄存器):进程执行时处理器寄存器中的数据。
(7)I/O状态信息:包括显示I/O请求、分配给进程的I/O设备、被进程使用的文件列表。
(8)记账信息:包括处理器的时间总和、使用的时钟数总和、时间限制、记账号等等。

当进行中断时,操作系统会把程序计数器和处理器寄存器保存到进程控制块中的相应位置,然后进程状态会改变其他的值,就可以让其他进程设置为运行态开始执行。也就是说PCB需要保存处理机状态信息、进程标志信息、进程控制信息三大部分。
处理机状态信息通过各种寄存器的内容组成包括:通用寄存器、程序计数器、条件码、程序状态字、栈指针。
进程控制信息包括:进程状态,进程优先级、等待事件、调度所需信息、程序和数据的地址、进程同步和通信机制的各种标记和信号、资源的所有权和使用情况、存储管理、链接指针。

上面说过对一个被执行的程序不同的角色看到的结果是不同的,从系统看它会为其创建一个进程或者任务;从处理器看它在指令序列中根据程序计数器变化的值去执行某种顺序的指令;从程序自身看它的执行涉及程序中的一系例指令。这些进程执行的指令序列可以描述单个进程的行为,这样的序列称为进程的轨迹。
操作系统的基本职责是控制进程的执行,一个进程可以处于以下两种状态:运行态和未运行态,操作系统必须用某种方式来表示进程使得其可以被追踪,这就是进程控制块,未运行的进程必须保持在某种类型的队列里并等待执行的时机,进程的生存周期围绕着创建和终止,当一个新进程被添加到正在被管理的进程集合中时操作系统需要建立用于管理改进程的数据结构,并在内存中分配地址。而进程终止,任何一个计算机系统都必须为进程提供表示其完成的方法,在不同的系统中结束的方法不相同比如说作业中的Halt指令、用户的行为、中端的关闭或者服务请求等等。

在创建之后如果进程做好了执行准备,对于可运行的进程处理器以一种轮转方式操作,这时出现了一个问题队列里除了存在可以直接运行的进程,还存在了等待I/O操作结束的进程,所以不能只考虑队列中最老的进程,而是未被阻塞且在队列中时间最长的进程。所以需要将非运行状态分为就绪状态和阻塞状态,同时为了解决在成百上千的进程中去遍历整个阻塞队列搜索等待响应该事件的进程,拥有多个队列是有效的,一个事件一个队列也可以按照优先级方案分配进程维护多个就绪队列面,每个优先级一个队列。而为了更好的与创建和终止进行衔接出现了新建态和退出态,还有一直存在的运行态,这个五个状态组成了进程的无状态模型。
现在说一下新建态和退出态对于起到的作用:
首先新建态可以分两步定义新进程
(1)先执行一些必须的辅助工作,将标识符关联到进程,分配和创建管理进程所需要的所有表,这一步处于新建态虽然操作系统已经执行了创建进程的必须操作但是没有执行进程,没有执行是操纵系统基于性能或者内存容量的原因会限制进程的数量,在进程处于新建态时,虽然已经创建了进程表并且将关于该进程的信息保存到内存的进程表中但是进程本身并没有进入内存。当进程处于新建态时该进程的执行的代码还没有进入内存也没有为这个程序相关的数据分配空间。
(2)当操作系统准备好在接受一个进程时,进程从新建态转换到就绪态的时候,程序代码和数据被加载到虚拟内存中。同时确保活跃的程序不会过多。

同理进程退出系统也分为两步
(1)当一个进程被终止的时候,终止使进程转换到退出态,进程不再被执行但是它的表信息及其他信息,因为一些辅助程序和支持程序会提取信息分析性能和利用率。
(2)一旦提取结束就不需要在保留任何与该进程相关的数据了,该进程从系统中删除。

在之前五种状态进行的活动模型,它的建立是因为在之前的I/O活动要比计算速度慢很多,所以内存中等待I/O的情况很常见,因此处理器大多时候是空闲的,即使是多道程序处理器仍然处于空闲状态,内存保有大量的等待I/O进程,一种解决办法是内存可以被扩充以适应更多的进程但是更大的内存往往导致的是更大的进程而不是更多的进程,另一种解决方案是交换,即将内存中被阻塞进程换到磁盘中进行挂起,暂时保存从内存中被驱逐出来的进程队列,用来交换需要处理机执行的进程使其能够进入内存,这一步交换是一个I/O操作因为磁盘I/O是系统最快I/O所以交换会提升性能。
当执行一个换出操作后一般有俩种选择(1)接纳一个新进程。(2)调入一个被挂起的进程,但是一般会倾向于调入一个被挂起的而不是增加增加负载数,这时要考虑阻塞的特定事件。如果没有就绪进程则至少一个阻塞进程被换出为另一个阻塞进程让出空间,而且就绪挂起状态的进程要比处于就绪态的任何进程都要高,调入高优先级的进程比减少交换亮更重要,一般系统更愿意挂起阻塞态,并且如果确定了高优先级的阻塞态进程会很快就绪,那么可能选择挂起一个低优先级的就绪态进程。
挂起这个概念与不在内存中的进程是等价的,不论是否等待一个事件都不立即执行,也就是说进程可能是或不是的等待一个事件,如果是阻塞条件不依赖于挂起条件不会使进程立即执行。可以通过代理把这个进程置于挂起状态,挂起进程的活动都是由最初请求挂起的代理请求的,这个代理可以是进程自己也可以是父进程或操作系统。除非代理显示的转换进程否则进程无法从这个状态中转移。

猜你喜欢

转载自blog.csdn.net/ZytheMoon/article/details/80278712