当前课程知识点:操作系统(RISC-V) >  第十讲 进程和线程控制 >  10.4 进程等待与退出 >  10.4 进程等待与退出

返回《操作系统(RISC-V)》慕课在线视频课程列表

10.4 进程等待与退出在线视频

10.4 进程等待与退出

讲义PDF版本参见课程wiki页面:


http://os.cs.tsinghua.edu.cn/oscourse/OS2020spring/lecture10


下一节:10.5 rCore进程和线程控制

返回《操作系统(RISC-V)》慕课在线视频列表

10.4 进程等待与退出课程教案、知识点、字幕

下面我们来介绍

进程的等待和退出

等待和退出呢实际上

是父子进程之间的一种交互

完成子进程的资源回收

那首先第一个是等待

那个wait()这个系统调用呢

可以用于父进程等待子进程的结束

那具体说起来呢

子进程通过exic()

向父进程返回一个值

父进程呢通过wait()

接受并处理这个返回值

那这时候就有一个问题说

这两个到底谁先谁后

wait父进程先等待

还是子进程先做exit()

这两种情况的不同呢

会导致它下面的处理呢

会有一些区别

wait执行的调用呢

在我们这里就是

如果有子进程存活

也就是说父进程创建的子进程

还有子进程

那这时候呢父进程进入等待状态

等待子进程的返回结果

好那等待的时候呢

这就相当于是wait

父进程先执行wait

等到子进程执行的时候呢

它执行exit ()

这是exit ()是在wait之后执行的

好那么这时候呢

子进程的exit ()退出唤醒父进程

父进程呢就由等待状态

回到就绪状态

等它得到CPU的使用权

可以执行的时候

那么父进程就处理

子进程的返回的这个返回值

这是wait在前exit ()在后的情况

如果不是这样那就有一种情况

就是有僵尸子进程等待

这指什么意思呢

就是子进程先执行exit ()

那这时候说它返回一个值

等待父进程的处理

那这时候呢exit ()在前

好在这个时候如果子进程

还一直处在这个等待的状态

在这里等待父进程的处理

那么这时候呢

父进程的wait就直接返回

如果有多个的话

就从其中一个返回它的值

如果没有子进程在

有可能我一个进程在执行的时候

它执行了wait

实际上它干脆就没有子进程

或者说子进程已经结束了

好那这时候呢它就直接返回

这是呢wait的功能

那接下来说exit

在这里头呢它叫有序退出

它指的是什么意思呢

我执行这个exit

这时候呢

这个进程呢就会在这个

系统调用里头

就会进行资源的回收

那具体的功能是这样的

首先第一个是我们刚才说到的

调用参数返回给父进程结果那exit

然后父进程呢可以拿到它这个结果

比如说我们在做一个编译

你的编译是否成功

这个编译成功之后呢我回复是0

如果不成功我回复错误码

这样的话我下面的

调用编译的这个进程

它依据你编译的结果

来决定后续怎么做

这是它第一项功能

然后第二部分功能是资源回收

你比如说我们占用的

各种资源的回收

占用的打开的文件

分配的内存和创建的

内核相关数据结构

然后检查父进程是否还存活

刚才我们说父进程会检查子进程

子进程也会检查父进程

子进程是执行exit的时候

检查父进程

父进程是在执行wait的时候

检查子进程

好如果这个子进程在exit的时候

检查父进程如果父进程是存活的

那么也就是这时候呢

子进程就保留一个状态

它自己进入僵尸状态

也就是我们退出状态

然后等待父进程对它结果做处理

好如果说没有

也就相当于创建完子进程之后

父进程已经结束了

那么这时候呢它就直接

释放相应的数据结构并且进程结束

好那在这儿呢

同时这个检查完之后会清理

所有的处于等待状态的僵尸进程

好那么这样的话

这个exit退出实际上这是

把进程占用的所有的资源

包括这里头申请了

并没有显式释放的

它都会给它释放掉

这是退出

我们先来看wait

这是wait的实现

那么我们先看有哪些函数会来调

那各种平台上的sys_wait()会到这儿来

然后它在这里头呢

做的工作是在这里头do_exit()

实际上是子进程的收尾工作

然后把它放到队列里头去

schedule()在这个地方

是把它放到队列里头去

好我们也可以通过它的流程图来看

那在这个地方呢实际上就是说

我们把当前进程改成了sleeping的状态

这样的话它就变成阻塞状态了

那也就是我们找到了wait()里头

它是如何进到阻塞状态的

在这儿呢你就可以看到相关的代码

这是最明显的标志

好接下来一个是do_exit()

这是它的实现

它实际上在这里呢

就是保存在这里头呢

是把它把这个进程给杀掉

do_exit()把一个进程或者一个线程关掉

那我们也可以通过

它的调用关系图来看它的执行情况

那也是各种平台上的exit()

最后到这个地方来

它在这里呢

最后都是到这个地方

来释放相关的这些数据结构

这是它的相关的工作

好我们仍然可以来看一下

在这里它做的主要工作都是在干啥

那在这儿呢前面的注释已经说了

它把它地址空间页表

存储的这一部分空间给释放掉

然后把自己的状态改成叫僵尸状态

同时唤醒它的父亲

也就是说如果是wait的话

在那边等着的那个

我们也可以来看看它的流程图

这是它最主要的工作

是关于存储的那一部分的处理

好在这个地方呢

最后这一步是最主要的

我们需要去wakeup_proc()唤醒

处于wait状态的父进程

好除此之外呢我们刚才讲到的

这几个创建加载等待退出

这四个系统调用之外

我们对进程控制

还有一些其它系统调用

比如说优先级控制

那在unix系统呢有一个nice系统调用

它完成对进程的初始优先级的设置

好在unix系统里头进程的优先级

会随着执行时间的延续而衰减

也就是说它的优先级是在不断变化的

这是对优先级的控制

然后还有一个呢

是对调试的支持

在我们目前ucore里头呢

你没有办法在ucore内部

调试你写的应用程序

原因在于在我们这里

这一部分支持还不好

实际上在标准的操作系统里头呢

unix里头它有叫ptrace

这个系统调用呢

完成一个进程对另一个进程的

执行过程的控制

这就有点像我们说的调试

我让一个被调试进程继续执行

在某处设置断点

检查它的内存和寄存器的状态

这是操作系统必须提供的一项功能

然后还有就是定时

我们前面说过sleep

它可以让进程在指定的时间

进入等待状态

然后时间到了它进入就绪状态

然后继续执行这是定时的功能

好到这个地方为止呢

我们就说清楚了

进程控制的几个相关系统调用

它们的实现和它们的功能

那把这些控制功能和我们前面

讲到的进程状态图进行一个联系

我们会看到这样一种情况

这是我们前面讲到过的

三状态进程模型里头

那核心的就绪运行等待

再加上创建和退出这五个状态

我们刚才执行的

说到那几个进程控制的系统调用呢

对这个状态呢都是会有影响的

我们看看它的影响在什么地方

首先是fork fork会有啥影响

fork会导致一个新的进程的创建

好创建在那里准备工作做完

fork准备好了放在就绪队列里头

的时候它就变成就绪了

好然后再有一个是wait

wait会什么 父进程执行wait

会导致父进程由运行状态

进入等待状态

好然后再有一个是exit 退出

退出会导致当前进程

由运行进入退出状态

同时子进程的exit

会导致由于wait进入等待状态的

父进程变成事件发生触发

导致它进入就绪状态

以便于它能再进行执行的时候

对子进程的返回的结果进行处理

那这时候我们还有一个啥没说加载

这个系统调用它在什么地方

实际上加载是你在执行过程当中的

一种状态

准确的来说

那大家可以通过代码

去阅读看看这里头

我在加载可执行文件的过程当中

它还有相应的状态变化

好那到这个地方呢

我们就说清楚了

操作系统当中的进程控制

那从进程的切换

再到跟进程控制相关的

创建加载等待退出

这样主要的这几个系统调用

那这是呢操作系统提供给

应用程序用的最频繁的

最主要的几个功能

好今天的课就上到这里下课

操作系统(RISC-V)课程列表:

第一讲 操作系统概述

-1.1 课程概述

--课程概述

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

-1.8 OS实验概述

--视频

第二讲 操作系统与系统结构和程序设计语言

-2.1 从OS角度看计算机系统

--2.1 从OS角度看计算机系统

-2.2 从OS角度看RISC-V

--2.2 从OS角度看RISC-V

-2.3 Rust语言与系统编程

--2.3 Rust语言与系统编程

-2.4 RISC-V CPU启动

--2.4 RISC-V CPU启动

-2.5 RISC-V CPU启动进一步分析

--2.5 RISC-V CPU启动进一步分析

第三讲 中断、异常和系统调用

-3.1 基本概念与原理

--3.1 基本概念与原理

-3.2 硬件架构支持

--3.2 硬件架构支持

-3.3 中断处理机制

--3.3.1 中断处理机制–Overview

--3.3.2 中断处理机制–Detail-1

--3.3.3 中断处理机制–Detail-2

--3.3.4 中断处理机制–Detail-3

--3.3.5 中断处理机制–Summary

-3.4 系统调用

--3.4 系统调用

第四讲 物理内存管理: 连续内存分配

-4.1 计算机体系结构和内存层次

--4.1 计算机体系结构和内存层次

-4.2 地址空间和地址生成

--4.2 地址空间和地址生成

-4.3 连续内存分配

--4.3 连续内存分配

-4.4 碎片整理

--4.4 碎片整理

-4.5 伙伴系统

--4.5 伙伴系统

-4.6 SLAB分配器

--4.6 SLAB分配器

第五讲 物理内存管理: 非连续内存分配

-5.1 非连续内存分配的需求背景

--5.1 非连续内存分配的需求背景

-5.2 段式存储管理

-- 5.2 段式存储管理

-5.3 页式存储管理

--5.3 页式存储管理

-5.4 页表概述

--5.4 页表概述

-5.5 快表和多级页表

--5.5 快表和多级页表

-5.6 RISC-V页映射机制

--5.6 RISC-V页映射机制

-5.7 使能RISC-V页表

--5.7 使能RISC-V页表

第六讲 虚拟存储概念

-6.1 虚拟存储的需求背景

--6.1 虚拟存储的需求背景

-6.2 覆盖和交换

--6.2 覆盖和交换

-6.3 局部性原理

--6.3 局部性原理

-6.4 虚拟存储概念

--6.4 虚拟存储概念

-6.5 虚拟页式存储

--6.5 虚拟页式存储

-6.6 缺页异常

--6.6 缺页异常

-6.7 RISC-V缺页异常

--6.7 RISC-V缺页异常

第七讲 虚拟存储:局部页面置换算法

-7.1 页面置换算法的概念

--7.1 页面置换算法的概念

-7.2 最优算法、先进先出算法和最近最久未使用算法

--7.2 最优算法、先进先出算法和最近最久未使用算法

-7.3 时钟置换算法和最不常用算法

--7.3 时钟置换算法和最不常用算法

-7.4 Belady现象和局部置换算法比较

--7.4 Belady现象和局部置换算法比较

-7.5 页表自映射

--7.5 页表自映射

第八讲 虚拟存储:全局页面置换算法

-8.1 工作集置换算法

--8.1 工作集置换算法

-8.2 缺页率置换算法

--8.2 缺页率置换算法

-8.3 抖动和负载控制

--8.3 抖动和负载控制

-8.4 面向缓存的页替换算法

--8.4.1 面向缓存的页替换算法-FBR

--8.4.2 面向缓存的页替换算法-LRU-K 2Q

--8.4.3 面向缓存的页替换算法-LIRS

第九讲 进程和线程

-9.1 进程的概念

--11.1 进程的概念

-9.2 进程控制块

--9.2 进程控制块

-9.3 进程状态

--9.3 进程状态

-9.4 三状态进程模型

--9.4 三状态进程模型

-9.5 挂起进程模型

--9.5 挂起进程模型

-9.6 线程的概念

--9.6 线程的概念

-9.7 用户线程

--9.7 用户线程

-9.8 内核线程

--9.8 内核线程

-9.9 进程地址空间与熔断 (meltdown) 漏洞

--9.9 进程地址空间与熔断 (meltdown) 漏洞

第十讲 进程和线程控制

-10.1 进程切换

--10.1 进程切换

-10.2 进程创建

--10.2 进程创建

-10.3 进程加载

--10.3 进程加载

-10.4 进程等待与退出

--10.4 进程等待与退出

-10.5 rCore进程和线程控制

--10.5 rCore进程和线程控制

第十一讲 处理机调度

-11.1 处理机调度概念

--11.1 处理机调度概念

-11.2 调度准则

--11.2 调度准则

-11.3 先来先服务、短进程优先和最高响应比优先调度算法

--11.3 先来先服务、短进程优先和最高响应比优先调度算法

-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-11.5 实时调度

--11.5 实时调度

-11.6 优先级反置

--11.6 优先级反置

-11.7 rCore调度框架

--11.7 rCore调度框架

第十二讲 多处理机调度

-12.1 对称多处理与多核架构

--12.1 对称多处理与多核架构

-12.2 多处理器调度概述

--12.2 多处理器调度概述

-12.3 O(1)调度

--12.3 O(1)调度

-12.4 CFS调度

--12.4 CFS调度

-12.5 BFS调度算法

--12.5 BFS调度算法

第十三讲 同步互斥

-13.1 背景

--13.1 背景

-13.2 现实生活中的同步问题

--13.2 现实生活中的同步问题

-13.3 临界区和禁用硬件中断同步方法

--13.3 临界区和禁用硬件中断同步方法

-13.4 基于软件的同步方法

--13.4 基于软件的同步方法

-13.5 高级抽象的同步方法

--13.5 高级抽象的同步方法

第十四讲 信号量与管程

-14.1 信号量

--14.1 信号量

-14.2 信号量使用

--14.2 信号量使用

-14.3 管程

--14.3 管程

-14.4 哲学家就餐问题

--14.4 哲学家就餐问题

-14.5 读者-写者问题

--14.5 读者-写者问题

-14.6 Rust语言中的同步机制

--14.6 Rust语言中的同步机制

第十五讲 死锁和并发错误检测

-15.1 死锁概念

--15.1 死锁概念

-15.2 死锁处理方法

--15.2 死锁处理方法

-15.3 银行家算法

--15.3 银行家算法

-15.4 死锁检测

--15.4 死锁检测

-15.5 并发错误检测

--15.5 并发错误检测

第十六讲 进程通信

-16.1 进程通信概念

--16.1 进程通信概念

-16.2 信号和管道

--16.2 信号和管道

-16.3 Linux信号机制

--16.3 Linux信号机制

-16.4 消息队列和共享内存

--16.4 消息队列和共享内存

-16.5 D-Bus机制

--16.5 D-Bus机制

-16.6 Binder机制

--16.6 Binder机制

第十七讲 文件系统概念

-17.1 文件系统和文件

--17.1 文件系统和文件

-17.2 文件描述符

--17.2 文件描述符

-17.3 目录、文件别名和文件系统种类

--17.3 目录、文件别名和文件系统种类

-17.4 虚拟文件系统

--17.4 虚拟文件系统

-17.5 文件缓存和打开文件

--17.5 文件缓存和打开文件

-17.6 文件分配

--17.6 文件分配

-17.7 空闲空间管理和冗余磁盘阵列RAID

--17.7 空闲空间管理和冗余磁盘阵列RAID

第十八讲 文件系统实例

-18.1 FAT文件系统

--18.1 FAT文件系统

-18.2.1 EXT4文件系统-历史

--18.2.1 EXT4文件系统-历史

-18.2.2 EXT4文件系统-支持大容量存储

--18.2.2 EXT4文件系统-支持大容量存储

-18.2.3 EXT4文件系统-支持恢复异常

--18.2.3 EXT4文件系统-支持恢复异常

-18.3 ZFS文件系统

--18.3 ZFS文件系统

第十九讲 I/O子系统

-19.1 I/O特点

--19.1 I/O特点

-19.2 I/O结构

--19.2 I/O结构

-19.3 I/O数据传输

--19.3 I/O数据传输

-19.4 磁盘调度

--19.4 磁盘调度

-19.5 Linux I/O子系统

--19.5 Linux I/O子系统

第二十讲 内核与程序设计语言

-20.1 Linux内核错误分析

--20.1 Linux内核错误分析

-20.2.1 用rust写操作系统-系统编程语言rust

--20.2.1 用rust写操作系统-系统编程语言rust

-20.2.2 用rust写操作系统-rust与操作系统开发

--20.2.2 用rust写操作系统-rust与操作系统开发

第二十一讲 异步编程 (Asynchronous Programming)

-21.1 Background

--21.1 Background

-21.2 Futures in Rust

--21.2 Futures in Rust

-21.3 Generators and async/await

--21.3 Generators and async/await

-21.4 Self-Referential Structs & Pin

--21.4 Self-Referential Structs & Pin

-21.5 Waker and Reactor

--21.5 Waker and Reactor

第二十二讲 Virtual Machine Monitor

-22.1 Overview

--22.1 Overview

-22.2.1 How VMM works - CPU

--22.2.1 How VMM works - CPU

-22.2.2 How VMM works - memory & I/O

--22.2.2 How VMM works - memory & I/O

10.4 进程等待与退出笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。