十六、进程控制

1、上下文(context)切换

\qquad 上下文切换指的是停止当前运行的进程(从运行状态改变为其他状态)并且调度其他进程(转变为运行状态)。必须在切换之前储存许多部分进程的上下文;必须能够在之后恢复他们,所以进程不能显示他曾经是被暂停过;必须快速(上下文转换非常频繁)。
\qquad 需要储存的上下文包括:寄存器(PC(程序计数器),SP(栈指针信息),…),CPU状态,…在某些情况下可能很费时,所以应该尽量避免。上下文切换的示意图如下图所示:
在这里插入图片描述

上下文切换示意图

\qquad 操作系统为活跃进程准备了进程控制块(PCB),操作系统将进程控制块(PCB)放置在一个合适的队列里,如就绪队列,等待I/O队列(每个设备的队列),僵尸队列。

2、加载和执行进程

\qquad 使用fork()函数来创建子进程,fork()函数返回值为0,则子进程继续执行;fork()函数返回值大于0,则父进程在此继续执行;fork()函数返回值小于0则创建子进程失败。系统调用exec()函数来加载程序取代当前运行的程序。使用fork()函数的示意图如下图所示。
在这里插入图片描述

fork和exec函数执行图

\qquad 下图是子进程创建执行的地址空间变化图,开始子进程和父进程的地址空间完全相同,但在执行exec()函数时,子进程的地址空间完全使用自己的地址空间,从子进程所要执行的main()函数开始执行,整个程序的控制流发生完全的变化,子进程和父进程的地址空间有很大的不同。
在这里插入图片描述

fork和exec函数执行内存变化图

\qquad exec()函数的调用允许一个进程“加载”一个不同的程序并且在main开始执行;它允许一个进程指定参数的数量(argc)和它的字符串参数数组(argv);如果调用成功,子进程和主进程时相同的进程但是运行了一个不同的程序,子进程进行了代码,栈(stack)和堆(heap)的重写。通过**copy on write(COW)**技术可以提高fork()的执行效率,只有当子进程需要对主进程的相关变量进行写操作时,才需要将需要进行写操作的父进程的相关变量复制到子进程中,其他子进程进行只读操作的变量没必要一并拷贝到子进程之中。

3、等待和终止进程

\qquad 为了在子进程退出之后将子进程在内存中的资源(PCB等)释放掉,父进程中会使用等待wait()wait()系统调用是被父进程用来等待子进程的结束。一个子进程向父进程返回一个值,所以父进程必须接受这个值并处理,wait()系统调用担任这个要求,它使父进程去睡眠来等待子进程的结果;当一个子进程调用exit()的时候,操作系统解锁父进程,并且将exit()传递得到的返回值作为wait调用的一个结果(连同子进程的pid一起),如果这里没有子进程存活,wait()立即返回;如果这里有为父进程的僵尸等待,wait()立即返回其中一个值(并且解除僵尸状态)。
\qquad 进程结束之后,调用exit(),在调用exit()之后和垃圾回收结束之前的这段时间,进程处于僵尸状态(zombie/defunct)。操作系统中的init进程会定期扫描整个系统中是否有进程处于僵尸状态,若发现僵尸进程,init进程会代替父进程进行垃圾收集(资源回收)的操作。
\qquad 加入了僵尸状态的进程的状态转化如下图所示:

在这里插入图片描述

进程执行状态变化图

THE END

陈老师课程链接:
https://www.bilibili.com/video/BV1wW41117GS?p=48

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dragon Fly

多谢老板赏钱[抱拳抱拳抱拳]

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值