当前课程知识点:操作系统 > 第十四讲 实验五 用户进程管理 > 14.5 进程复制 > 14.5 进程复制
那前面呢我们可以看到
我们通过这个执行相应的
do_execve这个函数呢
能够创建出一个进程
那么创建了一个鸡
那么鸡怎么下蛋呢
那我们可以看
这个父进程是如何复制子进程的
这是我们这一次讲的
内容就是进程复制
鸡怎么生蛋
那么在原理课可以看到
这里面讲到了有一个父进程
通过一个fork就完成了
把这个所有代码段 数据段 堆栈等等
复制到另一个区域里面去
产生一个子进程
它们的PID不一样
这是原理课大致的讲的内容
我们可以看看
如果说对应到我们Lab5实验
这个原理上的内容
怎么来具体的实现
那这个函数呢叫do_fork
一个内核函数
它里面带了三个参数
memory相关一个参数跟
stack相关的有两个参数
那么这个参数呢
决定了就是说我们怎么去完成
内存空间管理的一个拷贝
这两块跟用户堆栈相关
跟我们这个它的trapframe相关
那也是一样
就是通过这两个信息
我们的子进程需要
用到父进程的相关信息
要复制一部分内容还要做一并修改
所以这是三个重要的参数
来完成了对这个do_fork一个调用
我们看它怎么具体一步步实现的
首先我们说父进程要创建子进程
子进程和父进程是两个不同的进程
所以说它有自己的进程控制块
那创建了这个进程控制块之后呢
我们子进程就有了自己的身份了
也有它一个壳
但光这个还不够
我们还需要进一步去初始化
很多其它新的一些必须需要具备的内容
比如说第一个是kernel stack
它在内核里面要能够执行
它需要自己的栈
这个kernel stack通过分配它相应的空间
通过alloc_ pages得到一些空间
然后通过这个proc->kstack
来得到它这个内核里面这个虚地址
从而可以把这个kernel stack给建立好
这是完成建立功能
还没有具体去执行
再接下来呢我们需要干什么呢
复制父进程的内存
当我们创建个新的kernel stack之后呢
我们的代码段 数据段希望能够
复制父进程的同样的内容
这我们说父进程创建子进程
需要完成重要一个功能
这里面用什么呢
copy_mm和copy_range
这两个来完成相应的功能
那么copy_mm呢
是为新进程创建一个新的VMA
这是新进程创建好的
第二个呢copy_range
是把实际的这个代码段和数据段
搬到新的子进程里面去
同时再设置好相应的这个
虚实映射关系就是把
这个页表里面内容重新设置
使得我们的子进程
具有自己的内存管理一个架构
mm_struct以及对应自己一个新的页表
内容是复制了一份
好 当我们把这个父进程的内存空间
拷贝到子进程里面去之后呢
再接下来我们需要
让这个子进程能够正确的执行
也意味着它要正确设置好trapframe和context
这个context在我们讲kernel thread的时候呢
给大家提到过trapframe之前也讲过
这trapframe为什么要设置新的值呢
可以看到
因为当我们这个父进程和子进程
都要做返回到用户态去执行的时候
它们的状态是不一样的
这里面可以看到它这里面干什么事情
第一个要拷贝父进程的trapframe
拷贝完之后还要做一定改动
它的eax esp eip和copy_thread
要做相应一些重新设置
来完成这个拷贝和更新的工作
大家可以去看一下
这里面怎么来完成的
假设做完这个之后
我们还需要把我们新创建好
这个子进程放到我们的
进程队列里面去
我们说有一个进程队列来管理了
所有在操作系统里面存在的进程
这里面有一个proc list
然后呢一旦挂到这个队列里面去之后呢
我们就可以用
我们的进程管理的这个子系统呢
来对这里面的进程做调度管理
当然调度我们在Lab6中
会做进一步的深入讲解
一旦能够把这部分事情做完之后
也意味着我们子进程
已经创建完毕且可以去执行了
可以去到running态
然后跳到我们内容空间去执行
好 那它们执行有什么区别呢
我们前面讲到 说
我们的父进程创建完子进程之后
它子进程的返回值和
父进程的返回值是不一样的
do_fork的返回
父进程返回是子进程的PID
而子进程返回是零
那在这里面怎么体现
其实在最后这一步
还会有一个把这个return做一个修改
如果是父进程的话它会returnbPID回去
所以说你可以看着父进程它的调用返回值
正好是那个子进程的PID
同时呢子进程他做的事不一样
子进程它把它那个返回值就eax
设成是零
寄存器设置值是零
那使得这个子进程的do_fork
系统调用执行完毕之后
它返回是零
和我们父进程do_fork返回值是不一样的
但是它们的控制点都是在
do_fork返回这一点去执行的
大家再回顾一下我们原理课讲的内容
执行完do_fork之后
我们父进程会得到一个子进程的PID
而我们子进程呢
会得到一个零继续执行
它们就已经成了
两条控制流去执行去了
那大家对这个执行过程
有深入理解之后呢
对照执行代码就可以
更好完成我们练习二的内容
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-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.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-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