当前课程知识点:操作系统 >  第十四讲 实验五 用户进程管理 >  14.1 总体介绍 >  14.1 总体介绍

返回《操作系统》慕课在线视频课程列表

14.1 总体介绍在线视频

14.1 总体介绍

下一节:14.2 进程的内存布局

返回《操作系统》慕课在线视频列表

14.1 总体介绍课程教案、知识点、字幕

好 各位同学大家好

今天呢我们给大家介绍一下

lab5就是用户进程的管理

那这一部分呢 可以看到

我们主要讲以下几部分内容

第一个是总体介绍

大家知道我们这个实验

大致要完成什么样的功能

以及相应的一些总体的一些概述

第二个呢是

关于我们创建个用户进程

它的内存布局怎么回事

和我们前面讲有点不太一样

这是给大家做个介绍

第三个呢

我们既然要创建个用户进程

就需要执行一定的程序

那怎么能够把一个程序

放在进程里面去执行

这是这部分内容

以及我们说在原理课里面讲到

可以通过父进程创建子进程

那么具体这个进程复制

是怎么完成的

也会给大家做个介绍

最后一部分呢

是一个比较扩展一个内容

也是我们challenge的练习

就是怎么能够结合

内存管理的copy on write机制

来实现更有效的进程复制

这是我们这次总体

要介绍的一部分内容

首先看一下这个总体介绍

那么其实包含了

这次实验的目标练习和流程概述

那我们的目标是什么呢

其实我们希望通过这个练习呢

大家能够知道我们前面的三个实验

从lab1 2 3

那么是介绍了中断和内存管理

第四个实验已经有了内核线程

但是所有这些实验呢

都在什么地方呢

都是在内核空间里面来

完成各种各样的工程

还没有碰到像我们说

像这次实验课我们会提到什么

你要创建一个在用户态

执行的一个进程

那这个呢是

第一次我们的实验

从内核态跳到了用户态

那我们也就希望能够

把这个过程给大家展示出来

通过前面的lab1到lab4的工作呢

我们在lab空间里面

可以创建一系列的线程

最后来构造出一个用户态的进程

让它能够在用户空间去执行

这是说我们这次课希望达到一个目标

那把这个目标细化一下

我们这边要了解什么呢

第一个就是要了解一下

一个用户进程的创建过程

他怎么从零变到一的

从没有用户的进程到

存在用户进程怎么创建出来的

鸡和蛋怎么出现的

第二个呢是了解进程管理的实现

这里面主要是讲的是什么

主要是说我们怎么能够让

一个程序的内容能够

放到一个进程里面去执行

那这里面要了解什么是程序

什么是进程

它们之间的区别是什么

在原理课里面给大家做了介绍

那么通过实验呢

希望大家能够加强对

这两者之间的这个关系

和差别的理解

第三个是要了解

系统调用框架的实现

那这个和前面两个不太一样

前面两个需要大家去coding

需要去动手实验一下

那么对于最后这个呢

是大家是看一下

那么来看懂就OK了

相对来说我们的重点是放在前面

这个虽然很重要

因为通过系统调用呢

我们可以实现用户进程

得到内核的服务

但这一块呢

只要大家能看懂就OK了

因为对于系统调用的

这一部分的内容呢

其实和我们lab1中断管理呢

是有很紧密的联系的

它们有很大的一个相关性

但是也有一定的区别

那么你如果对lab1那个实验

有充分的了解之后呢

再看系统调用它的实现

其实是比较简单的

那我们在前面内容里面也讲到了

这个从一个特权级跳另一个特权级

怎么来完成呢

那其实也和我们这个

中断管理机制是相关的

那么大家可以回顾之前的一些工作呢

可以对此有更深入的理解

好 基于这个目标

我们要完成练习也是一样的

正好是说我们要去coding

去加载应用程序并执行

那么要去理解它大致

加载执行的这个过程怎么回事

然后完成我们需要完成的一个功能

第二个呢 我们要考虑一下

父进程怎么去复制子进程

这里面要考虑的一些细节问题呢

在原理课里面

可能涉及的比较少一点

我们希望通过实验呢

能够知道这里面的细节

是怎么来完成的

怎么来通过父进程

能够创建出一个子进程出来

第三个呢 是要分析系统调用

和进程管理的实现

因为我们知道我们的用户进程呢

它需要通过系统调用

来得到操作系统服务

这是一个 第二个呢

操作系统对进程本身也有管理

从最开始的创建到最后进程的消失

这有个生命周期的管理

在原理课里面也讲过

那我们会通过阅读代码呢

能对此有更深入体会

那我们的重点放在前面

前面是你怎么知道创建一个进程

当你知道怎么去创建一个进程之后呢

那么后续的一些工作

比如说进程状态的改变

相对来说比较简单一点

还有一个呢进程的卸载

比如说我们进程的离开退出

那么这个呢

相对来说就是

我们前面创建过程的一个逆过程

所以说也比较容易理解

这就是练习希望达到的目标

OK 那大家听起来好像感觉还不够

不知道到底跑什么程序

其实很简单

可以看到这个所谓的hello应用程序

和我们通常写的简单hello world很类似

没啥区别

这也是我们在ucore操作系统里面

支持跑的一个简单的应用程序

你可以看出来他干什么事情呢

一个main函数它就是打印字符串

第二个呢有系统调用叫getpid()

就得到当前它这个进程的ID信息

然后就退出了

从创建到最后return之后呢

我们的操作系统会把它给它kill掉

让它退出出去

那这里面就包含了系统调用

包含了创建一个基于

这个内容的一个用户进程

它的一个执行的一个状态的管理

以及最后生命周期一个管理退出

虽然这个程序很小

但是ucore操作系统呢

对它的管理是全面的

我们希望大家能够对这个

管理过程能够比较清楚的认识

好 那这个整个这个实验

我们说lab5的实验

我们最主要说要给应用程序

需要提供一个用户态的运行空间

那这个呢其实包含了两部分内容

一部分什么呢

一部分是内存管理

一个进程要运行

那必须要有个内存空间它所

运行所需要的代码段

数据段有内存空间

它有个内存空间的管理

和我们的lab2lab3有紧密的联系

第二个呢 进程管理

这也是我们这次实验的重点

但是我们已经有lab4

其实已经有一部分的进程管理

但是那时候我们叫内核线程

进程和线程的关系是什么呢

那么在原理课里面是讲过

大家想一想

进程和线程什么关系

那么这里面多了一点不同在哪呢

用户进程和内核线程

它们之间的关系和区别是什么

在这里面我们ucore操作系统呢

对这个用户进程和内核线程呢

有一套几乎统一一套管理体制

但是它们有很大的区别

那这里面我们希望通过完成

lab4和lab5呢对

这两者有更清楚的认识

对于内存管理而言

我们还需要知道

怎么去创建一个用户态的虚拟空间

我们之前的实验都是在内核里面

创建内核态的虚拟空间

那这里面不一样

我们要新增一个用户态虚拟空间

这需要去了解的

对于进程管理而言呢

我们需要知道怎么去加载

一个应用程序到

这个进程空间里面去

怎么去复制

怎么去创建新的子进程

就所谓的复制

我们叫fork

第三个呢 怎么去管理

整个进程的生命周期

第四个怎么让进程得到

操作系统服务

这是进程管理的功能

那么这一部分内容呢也是新的

那么也是在我们的lab5中

希望通过实现

实现相应的一些练习和阅读代码呢

能够对这些内容呢

有一个比较清楚的理解

那我们可以简单的看一下

怎么在lab5中构造出一个用户进程

它的流程大致这样的

首先我们要创建用户代码段

和用户的数据段

那么这对我们的lab几

大家想一想

对我们lab1中的

段机制的管理呢做了一个扩展

我们在lab1中

只讲到了内核的代码段和数据段

那这里面多了两个

用户的代码段和数据段

这里面有个扩充

有扩充之后呢

第二步呢我们能够创建内核线程

这一点是在lab4中完成了

创建内核线程的目的

是为进一步创建用户进程做好准备

所以说在这里面呢

我们首先要创建用户进程的壳

所谓创建它的壳呢就是说

要能够创建一个进程的控制块

以及进程控制块

所管理的很多关键的一些数据

比如说我举个简单例子

后面看到它的ID

它的执行状态等等

这后面会进一步展开

有了壳之后呢

我们需要具体的执行内容

这个内容从哪来呢

是我们应用程序里面

提供了它的具体执行

比如前面讲的hello world小程序

它有具体的执行内容

我们把这个内容呢

要放到这个进程里面去

比如说这个进程的代码段的空间里面

我们要把具体程序的内容放进去

从而可以使得它可以进一步执行

放进去之后呢

就可以执行这个用户进程了

但需要注意的是跟前面的不同在哪呢

这个执行是在用户空间执行的

不是在内核空间执行的

这是我们前面四个实验没有碰到

你怎么能够从内核态跳到用户态去

这涉及到特权级的一个转换

那在回顾一下

我们在前面实验中专门讲过

特权级它的特点是什么

它怎么去实现转换的

和我们中断管理机制有很紧密的联系

在执行应用程序过程中

它可能需要我们操作系统的服务

为此呢我们需要去

完成一个系统调用的一个管理机制

从而可以实现怎么去有效

我发这个请求

怎么能得到操作系统有效的服务

当用户进程执行完毕之后

那我们操作系统需要

把这个用户进程所占的资源

比如内存空间等等给回收回来

从而可以退出这个进程

那么我们就要有

结束用户进程管理体制

这里面就涉及到

进程的生命周期管理

从最开始创建到最后的结束

那么这就是整个我们说lab5里面

会碰到的一些实验的一个过程

操作系统课程列表:

第零讲 在线教学环境准备

-0.1 Piazza讨论区

--piazza访问和使用

--html

-0.2 在线实验平台

--实验平台使用帮助

--平台使用帮助

--Gitlab使用帮助

--IBM内部账号初始化

-0.2在线实验平台

--Raw HTML

第一讲 操作系统概述

-1.1 课程概述

--视频

-第一讲 操作系统概述--练习

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

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

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

第二讲 实验零 操作系统实验环境准备

-2.1 前言和国内外现状

--2.1 前言和国内外现状

-2.2 OS实验目标

--2.2 OS实验目标

-2.3 8个OS实验概述

--2.3 8个OS实验概述

-2.4 实验环境搭建

--2.4 实验环境搭建

-2.5 x86-32硬件介绍

--2.5 x86-32硬件介绍

-2.6 ucore部分编程技巧

--2.6 ucore部分编程技巧

-2.7 演示实验操作过程

--2.7 演示实验操作过程

--Q6

--Q7

--Q10

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

-3.1 BIOS

--3.1 BIOS

-3.2 系统启动流程

--3.2 系统启动流程

-3.3 中断、异常和系统调用比较

--3.3 中断、异常和系统调用比较

-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较

-3.4 系统调用

--3.4 系统调用

-第三讲 启动、中断、异常和系统调用--3.4 系统调用

-3.5 系统调用示例

--3.5 系统调用示例

-3.6 ucore+系统调用代码

--3.6 ucore+系统调用代码

第四讲 实验一 bootloader启动ucore os

-4.1 启动顺序

--4.1 启动顺序

-4.2 C函数调用的实现

--4.2 C函数调用的实现

-4.3 GCC内联汇编

--4.3 GCC内联汇编

-4.4 x86中断处理过程

--4.4 x86中断处理过程

-4.5 练习一

--4.5 练习一

-4.6 练习二

--4.6 练习二

-4.7 练习三

--4.7 练习三

-4.8 练习四 练习五

--4.8 练习四练习五

-4.9 练习六

--4.9 练习六

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

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

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

-5.2 地址空间和地址生成

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

-5.3 连续内存分配

--5.3 连续内存分配

-5.4 碎片整理

--5.4 碎片整理

-5.5 伙伴系统

--5.5 伙伴系统

-第五讲 物理内存管理: 连续内存分配--5.6 练习

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

-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 段页式存储管理

--6.7 段页式存储管理

-第六讲 物理内存管理: 非连续内存分配--6.8 练习

第七讲 实验二 物理内存管理

-7.1 了解x86保护模式中的特权级

--7.1 了解x86保护模式中的特权级

-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级

-7.2 了解特权级切换过程

--7.2 了解特权级切换过程

-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程

-7.3 了解段/页表

--7.3 了解段/页表

-第七讲 实验二 物理内存管理--7.3 了解段/页表

-7.4 了解UCORE建立段/页表

--7.4 了解ucore建立段/页表

-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表

-7.5 演示lab2实验环节

--7.5 演示lab2实验环节

第八讲 虚拟存储概念

-8.1 虚拟存储的需求背景

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

-8.2 覆盖和交换

--8.2 覆盖和交换

-8.3 局部性原理

--8.3 局部性原理

-8.4 虚拟存储概念

--8.4 虚拟存储概念

-8.5 虚拟页式存储

--8.5 虚拟页式存储

-8.6 缺页异常

--8.6 缺页异常

第九讲 页面置换算法

-9.1 页面置换算法的概念

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

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

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

-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法

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

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

-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法

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

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

-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较

-9.5 工作集置换算法

--9.5 工作集置换算法

-第九讲 页面置换算法--9.5 工作集置换算法

-9.6 缺页率置换算法

--9.6 缺页率置换算法

-第九讲 页面置换算法--9.6 缺页率置换算法

-9.7 抖动和负载控制

--9.7 抖动和负载控制

第十讲 实验三 虚拟内存管理

-10.1 实验目标:虚存管理

--10.1 实验目标:虚存管理

-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理

-10.2 回顾历史和了解当下

-- 10.2 回顾历史和了解当下

-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下

-10.3 处理流程、关键数据结构和功能

--10.3 处理流程、关键数据结构和功能

-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能

-10.4 页访问异常

--10.4 页访问异常

-第十讲 实验三 虚拟内存管理--10.4 页访问异常

-10.5 页换入换出机制

--10.5 页换入换出机制

-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制

第十一讲 进程和线程

-11.1 进程的概念

--11.1 进程的概念

-第十一讲 进程和线程--11.1 进程的概念

-11.2 进程控制块

--11.2 进程控制块

-第十一讲 进程和线程--11.2 进程控制块

-11.3 进程状态

--11.3 进程状态

-第十一讲 进程和线程--11.3 进程状态

-11.4 三状态进程模型

--11.4 三状态进程模型

-11.5 挂起进程模型

--11.5 挂起进程模型

-第十一讲 进程和线程--11.5 挂起进程模型

-11.6 线程的概念

--11.6 线程的概念

-第十一讲 进程和线程--11.6 线程的概念

-11.7 用户线程

--11.7 用户线程

-第十一讲 进程和线程--11.7 用户线程

-11.8 内核线程

--11.8 内核线程

-第十一讲 进程和线程--11.8 内核线程

第十二讲 进程控制

-12.1 进程切换

--12.1 进程切换

-第十二讲 进程控制--12.1 进程切换

-12.2 进程创建

--12.2 进程创建

-第十二讲 进程控制--12.2 进程创建

-12.3 进程加载

--12.3 进程加载

-第十二讲 进程控制--12.3 进程加载

-12.4 进程等待与退出

--12.4 进程等待与退出

-第十二讲 进程控制--12.4 进程等待与退出

第十三讲 实验四 内核线程管理

-13.1 总体介绍

--13.1 总体介绍

-13.2 关键数据结构

--13.2 关键数据结构

-13.3 执行流程

--13.3 执行流程

-13.4 实际操作

--13.4 实际操作

第十四讲 实验五 用户进程管理

-14.1 总体介绍

--14.1 总体介绍

-14.2 进程的内存布局

--14.2 进程的内存布局

-14.3 执行ELF格式的二进制代码-do_execve的实现

--14.3 执行ELF格式的二进制代码-do_execve的实现

-14.4 执行ELF格式的二进制代码-load_icode的实现

--14.4 执行ELF格式的二进制代码-load_icode的实现

-14.5 进程复制

--14.5 进程复制

-14.6 内存管理的copy-on-write机制

--14.6 内存管理的copy-on-write机制

第十五讲 处理机调度

-15.1 处理机调度概念

--15.1 处理机调度概念

-第十五讲 处理机调度--15.1 处理机调度概念

-15.2 调度准则

--15.2 调度准则

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

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

-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法

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

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

-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc

-15.5 实时调度和多处理器调度

--15.5 实时调度和多处理器调度

-第十五讲 处理机调度--15.5 实时调度和多处理器调度

-15.6 优先级反置

--15.6 优先级反置

-第十五讲 处理机调度--15.6 优先级反置

第十六讲 实验六 调度器

-16.1 总体介绍和调度过程

--16.1 总体介绍和调度过程

-16.2 调度算法支撑框架

--16.2 调度算法支撑框架

-16.3 时间片轮转调度算法

--16.3 时间片轮转调度算法

-16.4 Stride调度算法

--16.4 Stride调度算法

第十七讲 同步互斥

-17.1 背景

--17.1 背景

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

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

-第十七讲 同步互斥--17.2 现实生活中的同步问题

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

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

-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法

-17.4 基于软件的同步方法

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

-第十七讲 同步互斥--17.4 基于软件的同步方法

-17.5 高级抽象的同步方法

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

-第十七讲 同步互斥--17.5 高级抽象的同步方法

第十八讲 信号量与管程

-18.1 信号量

--18.1 信号量

-第十八讲 信号量与管程--18.1 信号量

-18.2 信号量使用

--18.2 信号量使用

-第十八讲 信号量与管程--18.2 信号量使用

-18.3 管程

--18.3 管程

-第十八讲 信号量与管程--18.3 管程

-18.4 哲学家就餐问题

--18.4 哲学家就餐问题

-18.5 读者-写者问题

--18.5 读者-写者问题

第十九讲 实验七 同步互斥

-19.1 总体介绍

--19.1 总体介绍

-19.2 底层支撑

--19.2 底层支撑

-第十九讲 实验七 同步互斥--19.2 底层支撑

-19.3 信号量设计实现

--19.3 信号量设计实现

-第十九讲 实验七 同步互斥--19.3 信号量设计实现

-19.4 管程和条件变量设计实现

--19.4 管程和条件变量设计实现

-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现

-19.5 哲学家就餐问题

--19.5 哲学家就餐问题

第二十讲 死锁和进程通信

-20.1 死锁概念

--20.1 死锁概念

-第二十讲 死锁和进程通信--20.1 死锁概念

-20.2 死锁处理方法

--20.2 死锁处理方法

-第二十讲 死锁和进程通信--20.2 死锁处理方法

-20.3 银行家算法

--20.3 银行家算法

-第二十讲 死锁和进程通信--20.3 银行家算法

-20.4 死锁检测

--20.4 死锁检测

-第二十讲 死锁和进程通信--20.4 死锁检测

-20.5 进程通信概念

--20.5 进程通信概念

-第二十讲 死锁和进程通信--20.5 进程通信概念

-20.6 信号和管道

--20.6 信号和管道

-第二十讲 死锁和进程通信--20.6 信号和管道

-20.7 消息队列和共享内存

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

-第二十讲 死锁和进程通信--20.7 消息队列和共享内存

第二十一讲 文件系统

-21.1 文件系统和文件

--21.1 文件系统和文件

-第二十一讲 文件系统--21.1 文件系统和文件

-21.2 文件描述符

--21.2 文件描述符

-第二十一讲 文件系统--21.2 文件描述符

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

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

-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类

-21.4 虚拟文件系统

--21.4 虚拟文件系统

-第二十一讲 文件系统--21.4 虚拟文件系统

-21.5 文件缓存和打开文件

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

-第二十一讲 文件系统--21.5 文件缓存和打开文件

-21.6 文件分配

--21.6 文件分配

-第二十一讲 文件系统--21.6 文件分配

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

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

-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID

第二十二讲 实验八 文件系统

-22.1 总体介绍

--22.1 总体介绍

-第二十二讲 实验八 文件系统--22.1 总体介绍

-22.2 ucore 文件系统架构

--22.2 ucore 文件系统架构

-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构

-22.3 Simple File System分析

--22.3 Simple File System分析

-第二十二讲 实验八 文件系统--22.3 Simple File System分析

-22.4 Virtual File System分析

--22.4 Virtual File System分析

-第二十二讲 实验八 文件系统--22.4 Virtual File System分

-22.5 I/O设备接口分析

--22.5 I/O设备接口分析

-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析

-22.6 执行流程分析

--22.6 执行流程分析

第二十三讲 I/O子系统

-23.1 I/O特点

--视频

-第二十三讲 I/O子系统--23.1 I/O特点

-23.2 I/O结构

--816C80A0F5E3B8809C33DC5901307461

-第二十三讲 I/O子系统--23.2 I/O结构

-23.3 I/O数据传输

--C58221E14388B9DB9C33DC5901307461

-第二十三讲 I/O子系统--23.3 I/O数据传输

-23.4 磁盘调度

--567A3F1FCBFB3F4C9C33DC5901307461

-第二十三讲 I/O子系统--23.4 磁盘调度

-23.5 磁盘缓存

--C327536B80D25CE79C33DC5901307461

-第二十三讲 I/O子系统--23.5 磁盘缓存

html

-html

--html

14.1 总体介绍笔记与讨论

也许你还感兴趣的课程:

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