【操作系统④】——进程控制【原语 Linux进程创建 阻塞和唤醒 撤销 挂起和激活】


🍬



activate…☁️

上一篇文章地址链接: 【操作系统③】——进程及其实现【运行态 就绪态 等待态等 PCB 进程控制块 进程要素】.
下一篇文章地址链接: 【操作系统⑤】——处理器的调度【调度算法 FCFS、SJF、SRTF、HRN】.

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


一、知识框架总览:

在这里插入图片描述



二、进程控制原语


1、含义:

  ◆ 系统使用一些具有特定功能的程序段来创建、撤销进程以及完成进程在各个状态之间的转换。


2、目标:

  ◆ 实现多进程高效率并发执行、协调和共享资源的目的。


3、类型:

  ◆ 创建进程、阻塞进程、唤醒进程、挂起进程、激活进程和撤销进程的等(这些主要对控制操作)。


4、原语及其特点:

  ◆ 进程控制和管理功能是由原语来实现的。

  ◆ 原语是在管态(管理状态)下执行、完成系统特定功能的程序。

  ◆ 原语是一种特殊的程序段,具有 “原子性” ,即要么不执行要么执行,一旦执行,其过程将不允许被中断。



三、进程的创建


1、创建的原因

  ◆ 用户提交作业:用户向系统提交作业,系统为了满足用户的需求,为了完成这个作业而创建进程。

  ◆ 用户在终端上登录:系统会创建一个终端进程来为用户提供服务。

  ◆ 系统创建服务进程:操作系统为了满足用户的一些特定功能,也要创建一些服务进程。

  ◆ 进程孵化子进程:父进程创建子进程。


2、创建的过程

  ① 首先,系统会从 PCB池 中选一个空白的 PCB 。

  ② 然后为新进程的映像分配地址空间,传递环境变量,构造共享的地址空间。

  ③ 再为这个新进程分配内存等各种资源。

  ④ 完成上面的工作后,系统还要查找辅存,找到进程正文段并装到正文区。

  ⑤ 再初始化进程控制块,分配唯一的进程标识符,并初始化 PSW(程序状态字寄存器的相关信息) 。

  ⑥ 当这个进程所需要的资源全部满足后,就将这个进程加入到就绪进程队列,接着投入运行(其实就是完成了一个从 “新建态 ——> 就绪态” 这么一个过程)。

  ⑦ 最后,通知操作系统的记账程序、监控程序等(来记录这个进程的相关信息,便于为后续该进程的运行就行有效的管理)。


3、Linux进程的创建(举的一个例子)

  首先,Linux操作系统中有一个很特别的进程,叫做0号进程。

  ◆ 0号进程是在系统初始化的时候被创建的。系统初始化的过程中,又由0号进程创建1号进程。此后,0号进程就转变为 “对换进程”,而1号进程将成为这个系统中的始祖进程。(即1号进程就可以再创建2号进程、3号进程等等,而且2/3号进程它们也可以创建各自的子进程)

  ◆ 进程利用 **fork() **创建其子进程,最终形成了一颗进程树。系统中除 0 号进程外的其他所有进程都是由 fork() 创建的。

  ◆ fork() 的源代码参见: /USR/SRC/LINUX/KERNEL/FORK.C

  ◆ 首先,讲一下 fork() 的功能和特点:
    ① fork():创建一个新进程。
    ② 系统调用格式:pid = fork()
    ③ 参数定义:int fork()
    ④ fork() 返回值的意义:“0” 一一> 在子进程中,pid变量保存的 frok() 返回值为0,则表示当前进程是子进程“>0” 一一> 在父进程中,pid变量保存的 fork() 值为子进程的id值(即进程唯一的标识符)“-1” 一一> 表示创建失败
    ⑤ 如果 fork() 调用成功,它将会向父进程返回子进程的 PID,并向子进程返回 0 ,即 fork() 被调用了一次,但会返回两次值
    ⑥ OS在内存中创建一个新进程,所建的新进程是调用 frok() 的父进程的一个副本。它继承了父进程的许多特性(代码、数据等一样,但PID不一样),并具有与父进程完全相同的用户级上下文。(就像人类生育后代一样,儿女继承了父母的许多特性,但又有所不同)

  ◆ 接着上一个实例:比如有一个父进程,它创建了两个子进程,系统中就会有三个进程在并发地运行。我们希望每一个进程在屏幕上会显示不同的字符串:① 子进程 P1 显示 “Hello, I’m daughter …”。② 子进程 P2 显示“Hello, I’m son …”。③ 父进程显示“Hello, I’m parent …”

  ◆ 代码如下:(VMW虚拟机 + ubuntu + Linux操作系统)
在这里插入图片描述
  ◆ 代码说明:
  ① 只有创建成功后,才跳出 while() 循环语句。

  ② 一旦新创建一个子进程,而子进程的代码、数据和原来的父进程的一样。但子进程代码的执行入口和父进程不一样,它只能从fork()的下一行代码,即 “ if( p1 == 0 ) ” 这句开始执行。

  ③这个时候会出现这种情况:父进程和子进程p1会同时执行到 “ if( p1 == 0 ) ” 这行代码。但只有子进程p1去执行输出 daughter 的for循环语句,父进程会跳过去执行 else 里面的语句。

  ④接着父进程会用同样的方式,创建子进程p2,同理只有子进程p2去执行输出 son的for循环语句,父进程会跳过去执行最后的 else 里面输出 parent 的for循环语句。

  运行结果:

在这里插入图片描述

  从上图可看出,子进程p1(即daughter)在和父进程争抢资源,所以才会交叉输出。



四、进程的阻塞和唤醒


1、进程的阻塞

在这里插入图片描述

  ◆ 进程的阻塞是要靠调用阻塞原语来实现。

  ◆ 阻塞原语在进程期待某事件发生,但没有发生时(或所需资源尚不具备时),该进程调用来阻塞自己。(所以可以发现,阻塞常常是一种自我阻塞的过程,类似于人的欲望得不到满足,就降低要求)

  ◆ **阻塞过程:**①先中断处理器,保存该进程的CPU现场信息到 PSW(程序状态寄存器)。②然后将阻塞进程置 “阻塞” 状态后,插入等待队列中。③最后,进程调度程序将选择新的就绪程序投入运行。


2、进程的唤醒

在这里插入图片描述

  ◆ 系统唤醒进程:系统进程统一控制事件的发生,并将事件发生的消息通知等待进程,使得该进程进入就绪队列。

  ◆ 事件发生唤醒进程:事件发生进程 和 被唤醒进程 之间是合作关系,唤醒原语既可被系统进程调用,也可被事件发生进程调用。(当然,进程不能够被自己唤醒,需要 “外界的激励” )



五、进程撤销


1、撤销缘由:

  ① 进程已完成所要求的功能而正常终止。
  ② 由于某种错误而导致进程非正常终止。
  ③ 祖先进程要求撤销某子孙进程。


2、撤销步骤:

在这里插入图片描述
  ① 根据进程标识符,从相应队列中找到它的 PCB。
  ② 将该进程拥有的资源归还给父进程或操作系统。
  ③ 若该进程拥有子进程,则应先撤销子孙进程以防脱力控制。(不然会让这个进程树断裂)
  ④ 撤销进程出队,并将它的 PCB 归还到 PCB 池。



六、进程的挂起和激活


1、挂起过程

  ◆ 检查要挂起进程的状态,若处于 “就绪态” 就修改为 “挂起就绪态”。若处于 “阻塞态”,则修改为 “挂起阻塞态”。

  ◆ 被挂起进程的 PCB 的非常驻部分将会被交换到磁盘对换区。

  也就是说,不仅要把这个在内存中的进程的代码和数据移到磁盘里去,而且还要把该进程 PCB 上面一部分内容放到磁盘里去。这样做的目的是为了对大化地腾出内存的空间,给需要的进程使用。


2、激活过程

  ◆ 将进程 PCB 非常驻部分调进内存,修改状态,“挂起等待态” 修改为 “等待态”,“挂起就绪态” 修改为 “就绪态”。

  ◆ 挂起原语即可由进程自己也可由其他进程调用,但激活原语却只能由其他进程调用。



七、小结(整体的思维导图)

在这里插入图片描述



八、参考附录:

[1] 《王道计算机考研 操作系统》
看视频可能快一些,但深刻理解还是需要文字和沉淀
链接: https://www.bilibili.com/video/BV1YE411D7nH?p=2.

[2] 《操作系统A》
我们上课用的慕课
链接: https://www.icourse163.org/course/NJUPT-1003219004?from=searchPage.

[3] 《操作系统教程》
我们上课用的教材

上一篇文章地址链接: 【操作系统③】——进程及其实现【运行态 就绪态 等待态等 PCB 进程控制块 进程要素】.

下一篇文章地址链接: 【操作系统⑤】——处理器的调度【调度算法 FCFS、SJF、SRTF、HRN】.

期末考试总复习——地址链接《操作系统期末总复习——绝地求生版》.


未完待续 …🍬 🍬

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
操作系统中的原语是指由操作系统内核提供的基本操作,使得应用程序可以与内核进行交互并执行操作。在进程相关的原语中,最常见的有fork、exec、wait和exit。 1. fork原语:它可以创建一个新的进程,它与原有进程几乎完全相同。新的进程被称为子进程,原有进程称为父进程。子进程具有与父进程相同的代码、数据、环境变量和打开的文件。fork原语通过复制父进程的所有内容来创建进程,包括基本运行环境、变量、数据、已打开的文件等。此外,fork原语创建一个新的进程ID。父进程将返回子进程进程ID,子进程将返回0。 2. exec原语:当一个进程需要执行一个新的程序,它可以使用exec原语。这个原语将用新的程序覆盖原有进程的内存空间,并将程序计数器置为新程序的入口点。exec原语通常与fork原语一起使用。当一个进程需要执行另一个程序,它首先会调用fork产生一个新进程,然后调用exec将该进程的空间替换为新程序的信息。 3. wait原语:用于等待一个子进程的终止。这个原语将使得父进程进入阻塞状态,直到它的一个子进程结束执行。在子进程结束,父进程就会解除阻塞,可以通过wait原语获取子进程的退出状态。wait原语返回的退出状态包含子进程的退出状态和指示子进程是否正常终止的信息。 4. exit原语:用于终止一个进程的执行。这个原语可以使得进程退出,并释放所有资源,包括打开的文件和内存空间。exit原语通常用于子进程在完成任务后终止自己的执行。 这些进程控制原语都是操作系统的重要组成部分,它们共同确保了进程的正常运行和管理。例如,fork和exec原语一起使用可以实现创建新的进程并执行新的程序,wait原语可以帮助父进程等待子进程的结束,exit原语可以保证子进程在完成任务后正常退出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一支王同学

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值