都写着重学j**a有点大,后期细分题目也不容易,就要细分一下,看看效果。 如上所述[1],该过程是动态的,自然存在一个开始-结束的生命周期。 这里以唐子英版《计算机操作系统(MOOC版)》为主线的系列记录,方便日后相关讨论。
一般来说,每个进程至少会处于就绪、运行、阻塞三种基本状态中的一种,为了满足进程控制块的数据和操作完整性要求,增强管理的灵活性,系统通常会引入创建状态和终止状态。 其结果是今天常用的五种基本状态。
创建(新)状态:有些地方也被称为新或新。 此时,正在创建进程,创建进程时,如果无法满足所需的资源,则该进程处于创建状态。
准备:进程已准备好执行的状态,并且进程已获取除 CPU 之外的所有必要资源。
运行状态:又称运行状态,是指获取CPU后进程处于“执行”状态。 此时,正在执行进程中的指令。
阻塞状态:也称为等待状态,当调度系统将 CPU 调度到另一个就绪进程时,进程的执行由于某些事件(如 IO 操作或临时获取资源失败)而受阻而无法继续,使被阻塞的进程处于暂停状态。
终止状态:进程执行完成的状态。 此时,它可能已经正确和完整地执行了,或者它可能已被无法克服的错误终止,或者作系统或其他具有终止权限的进程终止。 一旦进程进入终止状态,就无法再次执行。 该过程的终止需要:
1.等待操作系统处理善后事宜。
2.将进程的 PCB 归零,并将 PCB 空间返回给操作系统。
一次只能在一个处理器上运行一个进程(正在运行)。 但是,许多进程可能处于就绪或阻止状态。
除了上述基本状态外,有些系统还有更详细的划分,比如引入挂起操作后。 当操作应用于进程时,该进程将挂起,从动态变为静态。 相应的激活将静态转换回动态。
在许多系统中引入,以满足系统和用户观察和分析过程的需要,具体如下:
最终用户需求:如果最终用户自己的程序在操作过程中发现可疑问题,并希望暂停程序进行故障排除和修改。
父流程的要求:有时,父进程希望挂起其子进程之一,以便调查和修改子进程或协调子进程之间的活动。
负载调节的必要性:当实时系统中的工作量较重,可能影响实时任务的控制时,可以暂停一些不重要的进程,以保证其正常运行。
操作系统:os 有时希望暂停某些进程,以便在进程运行时检查资源的使用情况,用于计费等。
在简介中挂起原语suspend
和激活原语active
(两者必须成对使用),两者的结合成功地使状态转换更加复杂。
创建状态:与原始创建状态相同。
创建 - >活动就绪进程处于未挂起的就绪状态,称为活动就绪,表示为 readya。如果当前系统的性能和内存容量允许,在完成创建进程的必要操作后,系统会相应地将进程状态更改为活动就绪状态,并且进程可以接收调度。
创建 - >固定就绪当活动就绪进程挂起时,它将变为静止状态,并表示为就绪。当系统资源不足以完成进程创建时,系统不会分配新进程所需的资源(主要是内存),因此系统会将进程状态转换为静态就绪状态。 进程被放置在外部存储器中,不参与调度,此时进程创建工作尚未完成。 这相当于分解就绪状态。
活动就绪 - >固定就绪:处于活动状态的进程,如果使用挂起原语挂起,则进程的状态将变为静止就绪。
运动就绪 - >活动就绪:处于静止状态的进程,如果使用激活原语激活该进程,则进程的状态将更改为活动就绪状态。
主动阻滞 - >静息阻滞处于阻塞状态且未挂起的进程称为活动阻塞,并表示为阻塞a当进程使用挂起原语挂起时,进程的状态将更改为静止阻塞状态,该状态表示为阻塞。处于此状态的进程将在预期事件发生后从静态阻塞变为静态就绪状态。
静息阻塞 - >活动的阻塞:处于静态阻塞状态的进程,如果使用激活原语激活,则从静态阻塞变为活动阻塞。 当他们预期的事件发生时,他们会从活动阻止状态转变为活动就绪状态。
执行 - >终止:与原始终止相同。
引入挂起后的进程状态转换图描述了上述进程所拥有的状态和转换进程,这里详细描述了相关的状态生成事件。
在操作系统中,允许一个进程创建另一个进程,通常将创建该进程的进程称为父进程(父进程),则正在创建的进程称为子进程(progeny process)。子进程可以继续创建自己的子进程(即父进程的子进程),这些子进程与进程及其后代一起形成流程的层次结构,最终形成定向树,通常称为进程树
3.1.1 为了使多个进程并发执行,需要为每个进程创建自己的进程,涉及的典型创建事件有四个
用户登录:在分时系统中,用户在终端中键入登录命令后,如果登录成功,系统会为用户创建一个进程,并将其插入到就绪队列中。
作业调度:在多通道批处理系统中,当作业调度程序根据算法调度作业时,它会将它们加载到内存中,并创建一个进程,将它们插入到就绪队列中。
提供服务:当正在运行的用户程序发出某个请求时,系统会创建一个特殊的进程,为用户程序提供所需的服务,例如当需要打印功能时,创建一个单独的打印进程,使用户进程和打印进程可以同时进行。
应用请求在以上三种情况下,系统内核为用户程序创建了一个新进程,对于“应用程序请求”等事件,用户进程本身需要创建一个新进程,以便新进程可以与创建进程同时执行,以完成特定的任务。 例如,从键盘等输入设备获取数据,数据处理后显示在屏幕上,可以拆分为获取数据的过程和数据处理的过程,并且可以分解数据输出过程,以提高任务完成的速度。
3.1.2 进程创建过程每当要创建新进程时,操作系统都会调用进程创建原语并创建一个新进程,如下所示:
申请空白PCB:请求新进程的唯一数字标识符,并从 PCB 集合中请求空白 PCB。
分配新进程运行所需的资源:包括从其父进程获取的各种物理和逻辑资源,例如内存、文件、IO 设备和 CPU 时间。 通常需要新资源来提前通知操作系统和父进程。 例如,在为新进程和用户堆栈的程序和数据分配必要的内存空间时,操作系统必须事先知道新进程所需的内存量
对于批处理作业,可以在用户请求创建流程时提供大小。
要为应用程序进程创建子进程,需要在进程的请求中给出它以创建进程。
对于交互式作业,用户可以在不给出内存要求的情况下由系统分配一定量的内存空间,如果新进程需要共享已经加载到内存中的共享段(即内存中的地址空间),则必须建立相应的链接。
初始化PCBCB 的初始化:p包括:
初始化标志信息将系统分配的标识符和父进程标识符填充到新 PCB 中。
初始化处理器状态信息将程序计数器指向程序的入口地址,将堆栈指针指向堆栈的顶部。
初始化处理器控制信息将进程的状态设置为“就绪”或“静止”。
优先级设置,通常需要设置为最低优先级,除非用户以显示方式请求高优先级。
将新进程插入就绪队列:如果进程就绪队列能够接受新进程,则新进程将插入到就绪队列中。
当进程创建新进程时有两种可能的方法可以做到这一点
父进程与子进程同时执行。
父进程将一直等待,直到其一个或所有子进程完成执行。
对于新进程的地址空间,也有两种可能性
子进程是父进程的副本(即,子进程具有与父进程相同的程序和数据),正如后面在 UNIX 中提到的,其中将讨论线程-进程关系。
子进程加载另一个新进程,例如 UNIX 中的父子关系,该进程执行系统调用exec()
将进程空间替换为新程序。
3.2.1 导致进程终止的事件也很容易理解,简单来说就是正常执行的完成,一个错误的终止,以及外部人员通过杀戮的强制干预。
正常端:表示进程任务已完成,准备停止。 在任何系统中,都应该有一条指令指示进程已完成运行。
异常末端:进程运行时发生异常事件,导致程序无法继续执行。 常见异常包括:
越界异常:程序访问的存储区域已超出占用的存储区域范围,例如阵列访问。
防范异常:进程尝试访问不允许访问的资源或文件,或者以不适当的方式访问,例如进程尝试写入只读文件。
命令异常:程序尝试执行不存在的指令(非法指令),可能会发生异常,因为程序错误地将数据传输到数据区域,将数据视为指令。
权限指令异常:进程正在尝试执行仅允许操作系统执行的指令。
运行超时:进程运行的时间已超过最大值。
等待超时:进程等待超过指定最大值的一定时间。
算术异常:进程尝试执行禁止的操作,例如除以 0。
i o 优异的:过程中发生错误等
外部干预:进程在响应外部请求时终止。
操作员或操作系统干预:如果系统中发生事件,例如系统死锁,操作员或操作系统需要终止某个进程才能将系统从死锁状态中解救出来。
父进程请求:当子进程完成父进程请求的任务时,父进程可以发出结束子进程的请求。
父进程终止:当父进程终止时,应终止其所有子进程和孙进程。 因此,当操作系统终止父进程时,它会终止其所有子进程和孙进程。
3.2.2 进程终止进程当终止事件发生时,操作系统将调用终止原语并终止进程,如下所示:
检索 PCB 并获取其状态信息:根据已终止进程的标识符从 PCB 集合中检索进程的 PCB,并从进程的 PCB 中读取进程的状态。
终止进程并更新计划标志:如果已终止的进程处于执行状态,则立即终止进程的执行,并列调度标志为 true,表示进程终止后应重新调度。
终止子进程和子进程:如果进程有后代,则还应终止其所有后代,以防止它们变得不可控。
返回资源:将已终止进程拥有的所有资源返回到其父进程或系统。
从队列中移除 PCB:从队列(或链表)中删除已终止进程的PCB,并等待另一个程序收集信息。
3.3.1 导致进程阻塞和唤醒的事件 1无法从系统请求共享:当向系统请求共享资源时,由于系统没有足够的资源来分配资源,进程会进入阻塞状态,当其他进程释放并获取足够的资源时,进程将被唤醒。
等待某项任务完成:当一个进程启动一个操作时,如果需要等待操作完成才能继续执行,它会进入阻塞状态,直到相应的操作完成才会被唤醒,比如阻塞操作io。
新数据尚未到来:对于协作进程,如果一个进程需要获取另一个进程提供的数据才能处理数据,则只要数据尚未到达,它就会保持阻塞状态。
等待新任务的到来:在某些操作系统中,每当任务完成时,通常会有特定的系统进程阻塞自己,等待新任务的到来。 例如,在网络系统中发送和接收数据包。
3.3.2 进程的阻塞进程正在执行,上述事件发生后,该进程称为阻塞原语block
屏蔽自己,这样可以看出这是自己的主动行为。 进入阻塞状态后,按照以下步骤进行阻塞:
1.系统停止执行过程,将PCB中的当前状态从执行变为阻塞。
2.将PCB插入阻塞队列,如果由于不同的事件而设置了多个阻塞队列,则应将它们插入具有相同事件的队列中。
3.转到调度程序以重新调度处理器,将处理器分配给另一个就绪进程,然后切换。 即保留被阻塞进程的处理器状态,并根据新进程PCB中的处理器状态设置CPU环境。
3.3.2 进程的唤醒过程当进程预期的事件发生时,相关进程将调用唤醒原语wakeup
唤醒等待事件的进程,该事件被执行
1.从等待事件的阻塞队列中删除被阻止的进程。
2.将过程 PCB 中的当前状态从 Blocked 更改为 Ready。
3.将 PCB 插入就绪队列。
有关相关事件的更多信息,请参阅上面的 [2.]挂起操作引入和状态转换的原因。
3.3.2 进程的挂起进程当系统发生引发进程挂起事件时,系统利用挂起原语suspend
挂起指定的进程或处于阻塞状态的进程,如下所示:
1.检测挂起进程的状态,如果它处于活动状态,则将其更改为静态就绪状态。
2.对于活动的阻塞进程,请将其更改为静态阻塞状态。
3.为方便用户或父制程检查制程的运行情况,将制程的PCB复制到指定的存储区域。
4.如果挂起的进程正在执行,则会转到调度程序进行重新调度。
3.3.2 进程激活过程当系统具有激活进程的事件时,操作系统会使用激活原语active
指定的进程将按如下方式激活:
1.从外部存储器调用进程到内存,检测进程的当前状态,如果进程处于静止状态,则将其更改为活动就绪状态,如果进程处于静止状态,则将其更改为活动阻塞。
2.使用抢占式调度策略时,每当激活静默就绪进程并将其插入就绪队列时,都应检查是否重新调度。 也就是说,调度程序将激活的进程与当前进程的优先级进行比较
如果激活的进程具有较低的优先级,则不需要重新计划。
相反,请立即终止当前进程,并将处理器分配给刚刚激活的进程。
1.《计算机操作系统(MOOC版)》 唐子英等
2.“操作系统概念(第 9 版)”。
参考链接以上: