【操作系统】2.1.3 进程控制

🚩 争取用最简洁的话语去解释概念性的东西 – 费曼学习法

1.什么是进程控制

🍆进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。总的来说就是实现进程状态转换。创建新进程也是进程从无到有,撤销进程也是从有到无。

2.如何实现进程控制

🌱 用原语来实现,原语是一种特殊的程序,它具有原子性,这段程序的运行必须是一气呵成,不可中断。

❓为什么进程控制要“一气呵成”?

假设现在有一个进程是阻塞态,被存储到阻塞队列中,然后它的等待事件发生了,操作系统为让它转为就绪态,在这个过程中,需要做两件事

  1. 将PCB中的state改为1,表示已经变为就绪态
  2. 将进程从阻塞队列放到就绪队列

如果在执行完步骤1之后,外面突然有中断信号,此时CPU不执行步骤2而是去处理中断的话,那么步骤2就没有执行,进程还留在阻塞队列中。可能存在的后果:阻塞队列的下一个等待事件发生,却发现队列指针指的第一个进程的状态却是1,并且PCB中的信息和等待时间不同,这样就会造成其他的后果,不便于管理。所以必须要“一气呵成”。

image-20220722093534415

3.如何实现原语的“原子性”?

🍍原语的执行具有原子性,即执行过程只能一气呵成。期间不允许被中断。可以用关中断指令开中断指令这两个特权指令来实现原子性

🍾当执行到关中断指令后,无论怎么外部中断信号都不去处理,也不检查,知道执行完开中断指令后才会恢复检查。这样,关中断和开中断之间的指令序列都是不会被中断的,这样就实现了原子性。

🤔如果这两个特权指令允许用户程序使用的话,会发什么什么?

程序可能会在运行开始前就执行关中断指令,执行结束后才执行开中断指令,这样它就可以一直执行下去。

image-20220722094549373

4.进程控制相关的原语

⭐️进程的创建

  • 创建原语:
    1. 申请空白PCB(申请一个职位)
    2. 为新进程分配所需资源(提供工作条件)
    3. 初始化PCB(整出一个工位)
    4. 将PCB插入就绪队列(上岗)
  • 引起进程创建的条件:
    • 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
    • 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
    • 提供服务:用户向操作系统提出请求,系统会创建一个进程处理这个请求
    • 应用请求:用户进程主动请求创建一个子进程

⭐️进程的终止

  • 撤销原语:(这里我引用《西红柿首富》里的剧情)
    1. 从PCB集合中找到终止进程的PCB(老板要炒王多鱼)
    2. 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程(你不干,有的是人干,狗也能当守门员)
    3. 终止其所有子进程(双喜临门,一言为定)
    4. 将该进程拥有的所有资源都归还给父进程或操作系统(人走了,东西留下)
    5. 删除PCB(从此再也不见)

系统中所有进程其实是一个树形结构,系统会有一个最大的祖先进程,管理着它的所有子进程。

  • 引起进程终止的事件:
    • 正常结束:进程自己请求终止(exit系统调用)
    • 异常结束:整数除于0,非法使用特权指令,然后被操作系统强行关掉
    • 外界干预:任务管理器强制终止进程

⭐️进程的阻塞

  • 阻塞原语:
    • 找到要阻塞的进程对应的PCB
    • 保护进程运行现场,将PCB状态信息设置为”阻塞态“,暂时停止进程运行(保护好现场是为了再次运行时环境不会有太大的变化,不然可能出现一些不可预知的麻烦)
    • 将PCB插入相应事件的等待序列
  • 引起阻塞的事件:
    • 需要等待系统分配某资源
    • 需要等待相互合作的其他进程完成工作

⭐️进程的唤醒

  • 唤醒原语:
    1. 在等待事件中找到相应的PCB
    2. 将PCB从阻塞队列移除,改为就绪态
    3. 将PCB插入就绪队列中,等待被调度

  • 引起进程唤醒的条件:

    • 等待的事件发生,因为什么事情被阻塞,就应该由什么事情唤醒

⭐️进程的切换

  • 切换原语:
    1. 将运行环境信息存入PCB
    2. PCB移入相应队列
    3. CPU选择另一个进程运行,并更新它的PCB信息
    4. 根据PCB恢复新进程所需的运行环境
  • 引起进程切换的条件:
    • 事件片到
    • 有更高优先级的进程到达
    • 当前进程主动阻塞
    • 当前进程终止

为什么要保存环境信息(保护现场)

🌰举个例子:用C语言写1+2+3+…100的程序,当加到50的时候,程序突然被阻塞了,那当程序再次运行的时候,如果当前什么都没有,还是要从1加到100,那之前做的努力不久白费了吗,所以要保留1加到50的结果和已经加到了哪个数,保留了这些信息,那么在后续过程中就不用在重新计算了。这也就是为什么要保护现场。

总结

无论哪个进程控制原语,无非要做三件事

  1. 更新PCB
  2. 将PCB插入合适的队列
  3. 分配/回收资源

image-20220722110926058

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值