🍬
文章目录
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】.
期末考试总复习——地址链接:《操作系统期末总复习——绝地求生版》.
未完待续 …🍬 🍬