
(进程控制)
大家好,很高兴又和大家见面啦!!!
在上一篇内容中,我们共同探讨了进程控制的基本概念与实现原理:
我们重点学习了实现进程控制的关键工具——原语:
这种"原子操作"特性是确保进程状态转换一致性和可靠性的基础。
还记得我们讨论过的关键问题吗?——为什么进程控制必须通过原语来实现?
正是因为进程状态的转换涉及多个步骤
如果这些操作在执行过程中被中断,就可能导致进程状态不一致,进而引发系统错误。
原语通过关中断和开中断这两条特权指令,确保了一系列操作的原子性,从而避免了此类问题。
理解了进程控制的"为什么"和"如何实现"之后,我们现在很自然会问:
现在,就让我们带着这些问题,一起深入探讨进程创建、终止、阻塞与唤醒、切换这四类核心原语的具体实现机制,揭开操作系统精准控制进程生命周期的神秘面纱。
创建原语指的是操作系统创建一个进程时使用的原语。
操作系统在创建一个新的进程时,会执行以下操作:
在操作系统中,当执行以下操作时,均会创建一个新的进程:
撤销原语又称为终止原语,是操作系统在终止一个进程时使用的原语。
操作系统在终止一个进程时,会执行以下操作:
有些操作系统不允许子进程在父进程终止的情况下存在,对于这类系统,若一个进程终止,则它的所有子进程也终止,这种现象称为级联终止。 当然,并不是所有操作系统都是这样设计的。
在操作系统中,当发生以下事件时,均会引起进程的终止:
阻塞原语是指进程由运行态转换为阻塞态时使用的原语。
阻塞原语在执行的过程中,会进行以下操作:
正在执行的进程,由于期待的某些事件未发生:
进程便通过调用阻塞原语(Block),使自己由运行态变为阻塞态。
阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程,才可能将其转为阻塞态。
唤醒原语是指进程由阻塞态转换为就绪态时使用的原语。
唤醒原语在执行的过程中会执行以下操作:
当被阻塞进程所期待的事件发生时,如:
由有关进程(如释放系统资源的进程、提供数据的进程、发布任务的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
Block 原语和 Wakeup 原语是一对作用刚好相反的原语,必须成对使用。
若在某个进程中调用了 Block 原语,则必须在与之合作的或其他相关的进程中安排一条相应的 Wakeup 原语,以便唤醒阻塞进程;否则,阻塞进程将因不能被唤醒而永久地处于阻塞态。
切换原语是指实现进程从运行态转换为就绪态并将新进程从就绪态转换为运行态的原语。
切换原语在使用时,会执行以下操作:
在操作系统中,当出现以下事件时,会通过调用 切换原语 来进行进程的切换:
简单的理解就是,当前正在运行的进程因为各种原因需要结束运行态并转换为其它状态时,就需要通过调用切换原语来进行进程的状态切换,并将 CPU 资源分配给新的进程;
从程序的创建到运行的过程中,会经历以下步骤:
.exe并存储与硬盘中.exe 文件放入到内存中graph LR
a[源文件]
subgraph 硬盘
b[可执行文件]
end
a--->b
subgraph 内存
PCB
c1[指令1]
c2[指令2]
c3[...]
end
b--->c1
c1--->CPU程序在放入内存中运行时,会创建一个 PCB 用于存储该进程的管理和控制信息。
但是由于 CPU 的调度是以时间片的形式,且对应的时间片只有若干毫秒。
因此当一个进程对应的 CPU 时间片使用完后,系统会通过 切换原语 将该进程切换为另一个新进程:
graph LR
subgraph A[内存]
PCB1
a1[切换原语]
a2[...]
end
a1--->CPU
subgraph B[内存]
PCB2
b1[指令1]
b2[...]
end
CPU--->b1在完成切换后,原进程所使用的系统资源会被新进程继续使用,这时就会存在一个问题:
如果此不做任何处理,那么当我们重新运行原进程时,就会因为丢失相关的信息而导致运行出错。
运行环境是指进程运行时所依赖和所处的全部条件、资源和状态的集合。我们将正在运行的进程所产生的相关信息称为该进程的上下文;
当我们在通过切换原语切换进程时,可以通过将该进程的运行环境以及上下文信息存储到该进程对应的 PCB 中。(为了方便理解,这里我们将该进程的 PCB 称为 PCB1)
完成切换后,系统会先通过读取新进程的 PCB 来恢复该进程的运行环境以及上下文(这里我们将新进程的PCB 称为 PCB2);
graph LR
subgraph A[内存]
subgraph PCB1
a[通用寄存器信息]
b[地址寄存器信息]
c[控制寄存器信息]
d[标志寄存器信息]
e[状态字]
f[...]
end
a1[指令1]
a2[指令2]
a3[切换原语]
end
a3--->CPU
subgraph B[内存]
subgraph PCB2
ba[通用寄存器信息]
bb[地址寄存器信息]
bc[控制寄存器信息]
bd[标志寄存器信息]
be[状态字]
bf[...]
end
b1[指令1]
b2[指令2]
b3[切换原语]
end
CPU--->b1
b3--->cpu[CPU]
subgraph C[内存]
subgraph PCB[PCB1]
aa[通用寄存器信息]
ab[地址寄存器信息]
ac[控制寄存器信息]
ad[标志寄存器信息]
ae[状态字]
af[...]
end
a4[指令3]
a5[指令4]
a6[切换原语]
end
cpu--->a4因此,切换原语的执行过程可以总结为2点:
其中进程的相关信息指的是进程当前的运行环境以及上下文。
今天的内容到这里就全部结束了。通过今天的学习,我们深入探讨了操作系统进程控制的核心机制。让我们回顾一下本文的重要知识点:
核心原语机制回顾
进程创建
进程创建原语完成了新进程的"诞生"过程,包括:
我们了解了进程创建的四种典型场景:
进程终止
进程终止原语负责进程的"善后工作",通过以下操作来实现进程的优雅退出:
导致进程终止总共有三种终止情况:
阻塞与唤醒
阻塞与唤醒原语这对相辅相成的机制,实现了进程在运行态与阻塞态之间的智能转换。
特别需要注意的是,Block 和 Wakeup 必须成对使用,否则可能导致进程永久阻塞。
进程切换
进程切换原语作为多任务并发的关键技术,通过以下操作实现了进程间的平滑切换,确保了CPU资源的高效利用:
知识体系构建
这些原语共同构成了操作系统进程管理的基石,它们通过原子操作特性保证了进程状态转换的一致性和可靠性。
理解这四种原语的工作机制,不仅帮助我们掌握了进程生命周期管理的核心技术,更为后续学习进程同步、通信等高级主题奠定了坚实基础。
进程控制机制体现了操作系统设计的精妙之处——通过简单而可靠的原语操作,构建出复杂而强大的多任务环境。这种"简单构建复杂"的设计思想,值得我们深入体会和学习。
互动与分享
感谢您的耐心阅读! 关注博主,不错过更多技术干货。我们下一篇再见!