操作系统学习-练习题个人总结(四)
第三章 进程管理
一、第一节-进程的引入-课前测试
1、错题解析
进程管理的功能,不包括(从后备队列中调入程序进入内存)。
解析:进程控制:控制进程状态转换;进程互斥与同步:协调进程间的运行顺序;进程通信:进程间的信息交换;调度:作业调度,进程调度。
2、正确知识点总结
- 程序的并发执行通常是在多道程序环境中,具有可再现性特征。(×)
- 所谓可再现性,是指当初始条件相同时,程序多次执行,其结果必然重复出现。(√)
- 目前计算机系统是冯•诺依曼结构,具有处理器顺序执行指令的特点。(√)
补充:
程序的顺序执行:
- 顺序性
- .封闭性
- 可再现性(程序的运行结果与其推进速度无关)。
程序的并发执行:
- 间断性
- 失去封闭性(多个进程会共享资源,共同修改资源状态)
- 程序运行结果出现不可再现性(程序的运行结果与其推进速度有关,发生与时间有关的错误)。
二、第一节-进程的引入-课堂测试
1、错题解析
- 结构(Cobegin 语句1;语句2 Coend)表示语句1和语句2并发执行。现有如下代码:
X=0;
Y=0;
Cobegin
Begin
X=1;
Y=Y+X;
End
Begin
Y=2;
X=X+3;
End
Coend
当这个程序执行完成时,变量X和Y的值可能为( ②和③)。
① X=1,Y=2 ② X=1,Y=3 ③ X=4,Y=6
解析:(类似的题一般出现在选择里,可采用排除法,代入选项验证题目)
附加例题:
- 进程调度是进程管理的功能之一。而进程调度的任务,则是从就绪队列中按照一定的算法选出一个进程,把处理器分配给它,并为它设置运行现场,使其投入运行。(√)
解析:概念性内容。 - 引入进程最根本的原因,是为了多道程序设计技术的实现。(√)
解析:概念性内容。方便多道程序调度作业。
2、正确知识点总结
多个相对独立的进程以各自的速度向前推进是异步性的概念。
三、第二节-进程概念-课堂测试
1、错题解析
在操作系统中同时存在多个进程,它们(可以共享允许共享的系统资源)。
解析:概念性内容,理解。
2、正确知识点总结
- 进程和程序的一个本质区别是(进程是动态的,程序是静态的)。
- UNIX系统中进程的进程控制块中常驻内存的是(proc结构)。
- 同一程序经过多次创建,运行在不同的数据集上,形成了(不同)的进程。
- 用户编写的C程序中的自动变量位于进程映像的(用户栈)部分。(如下补充图示)
补充:
- 进程和程序是多对多的关系。
- 多个不同的进程可以包含相同的程序。
- 进程:一个程序的一次运行过程(可并发执行的程序在一个数据集合上的一次运行过程,是系统进行资源分配和调度的一个独立单位)。
动态性:进程最基本的特征;
并发性:程序在建立进程后并发运行;
独立性:是系统进行资源分配和调度的独立单位;
异步性:进程以不可预知的速度向前推进;
- 进程状态以及转换
- PCB内容(Linux为例)
进程标识信息:进程标识符PID;用户标识符;家族关系;
进程调度信息:进程状态;进程优先级;进程的时间片;等待事件;其他调度相关信息;
进程现场信息;通用寄存器内容;段寄存器内容;指令计数器的值;程序状态字(PSW)(中断允许位、陷入标志、任务嵌套志、特权标志、溢出标志、符号标志、零标志、进位标志等);栈指针;
进程控制信息:程序和数据地址;进程同步信息;进程通信信息;资源管理信息;链接指针;
四、第三节-进程控制-课堂测试
1、错题解析
-
Linux系统在撤销一个进程的过程中,将同时撤销其所有子进程,因此进程撤销所需要的时间较长。(×)
解析:会为其子进程寻找一个新的父进程。 -
在Linux的shell中输入一个命令时,shell会创建一个新进程来执行这个命令。(√)
解析:实践中也可以了解到。
2、正确知识点总结
- 进程控制功能都是由若干原语来实现的。
- 子进程不可以继承其父进程所拥有的所有资源。(只能继承程序和数据,但栈区是自己的)
补充:
- 进程控制原语以及相关引起典型事件:
创建:作业调度;用户登录;提供特定服务;应用请求;
撤销:进程正常运行结束而撤销;进程异常终止而撤销;进程应外界干预而终止(操作员或操作系统干预;父进程请求;父进程被撤销);
阻塞与 唤醒:当前进程请求资源失败;当前进程需要等待某种操作的完成;当前进程的前驱进程尚未完成;当前进程无新工作可做; - fork()与vfork()
参考:https://blog.csdn.net/andrewgithub/article/details/82077818
简单来讲就是fork()使用的时候父子进程各走各的,各自都有缓存区(子进程的是复制父进程的);vfork()使用时子进程先运行,子进程退出后在运行父进程,缓存区父子共用,也就是说子进程将缓存区的内容输出后父进程就没有需要输出的内容了。
五、第三节-进程控制-课后作业
在Linux系统中运行下面程序:
main(){
int num=0;
fork();
printf(“hello1\n”):
fork();
printf(“hello2\n”);
fork();
num++;
printf(“hello3\n”);
}
问:(1)最多可产生多少个进程?画出进程家族树。(包含main进程在内)
(2)其中hello1、hello2、hello3各被输出多少次?
(3) num最后的计算结果的最大值是多少?如果将程序中的fork()换成vfork(),则num最后的计算结果的最大值又是多少?
解析:这类题的整体思路就是“复制粘贴”。只要看到fork就把这一个fork下面的所有内容“复制粘贴”成为另外一个独立的代码段运行就好;vfork不会“复制粘贴”,只会分出去运行。
附加知识点:
fork()返回值意义如下:
返回值=0:在子进程中,表示当前进程是子进程。
返回值>0:在父进程中,返回值为子进程的id值(唯一标识号)。
返回值-1:创建失败。