第4章 进程
4.1 进程概述
进程管理
、内存管理
和文件管理
是操作系统的三大核心功能。进程
是进展中的程序,或执行中的程序。- 一个程序加载到内存后就变为
进程
。 进程 = 程序 + 执行
- 为了提高CPU利用率,人们想起将多个程序同时加载到计算机里,并发执行。这些同时存在于计算机内存的程序就称为
进程
。 - 进程让每个用户感觉到自己独占CPU。 进程就是为了在CPU上实现多道编程而出现的概念。
- 进程类似于人类:它们被产生,有或多或少有效的生命,可以产生一个或多个子进程,最终都要死亡。一个微小的差异是进程之间没有性别差异——每个进程都只有一个父亲。
- 当一个进程创建时,它几乎与父进程相同。它接受父进程地址空间的一个(逻辑)拷贝,并从进程创建系统调用的下一条指令开始执行与父进程相同的代码。尽管父子进程可以共享含有程序代码(正文)的页,但是它们各自有独立的数据拷贝(栈和堆),因此子进程对一个内存单元的修改对父进程是不可见的。
进程的组织
- 在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。
注:进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。
进程的特征
- 进程和程序是两个截然不同的概念,相比于程序,进程拥有以下特征:
4.2 进程模型
- 什么是进展中的程序呢?
从物理内存的分配来看,每个进程占用一片内存空间,从这点上说,进程就是内存的某片空间。由于在任一时刻,CPU只能执行一条指令,因此任一时刻在CPU上执行的进程只有一个,而到底执行哪条指令由物理程序计数器指定。也就是说,在物理层面上,所有进程共用一个程序计数器。 - 每个进程有着自己的计数器,记录其下一条指令所在的位置。从逻辑上说,程序计数器可以有很多个。
- 首先,任何抽象都需要有一个物理基础。
- 对于进程来说,其物理基础就是程序。
- 要考虑如何让多个进程共享同一个物理内存而不发生冲突。
- 进程调度:决定在什么时候让什么进程使用CPU。
4.3 多道编程的好处:响应时间改善
- 除了提高CPU利用率外,多道编程更大的好处是改善系统响应时间,即
用户等待时间
。
4.4 进程的产生与消亡
对于进程产生来说,主要的事件有:
- 系统初始化(神创造人)。
- 执行进程创立程序(人生子)。
- 用户请求创立新进程(试管婴儿)。
造成进程消亡的事件则可以分成四种情况:
- 寿终:进程运行完成而退出。
- 自杀:进程因错误而自行退出。
- 他杀:进程被其他进程所终止。
- 处决:进程因异常而被强行终结。
4.5 进程的层次结构
- 一个进程在执行过程中可以通过系统调用创建新的进程。这个新创建的进程就称为
子进程
,而创建子进程的进程则称为父进程
。 - 子进程又可以再创建子进程,这样子子孙孙创建下去就形成了所谓的
进程树
。 - UNIX称这个进程树里面的所有进程为一个进程组,进程组里面的进程分布在不同的层次上,从而形成一个层次架构。
- Windows没有进程组的概念,而是所有进程均地位平等。
4.6 进程的状态
那么进程挂起有哪些原因呢?
- 首先是一个进程在运行过程中执行了某种阻塞操作,如读写磁盘。由于阻塞操作需要等待结果后才能继续执行,因此操作系统将把这个进程挂起,让其他进程运转。另外一种情况是一个进程执行的时间太长了,为了公平,操作系统将其挂起,让其他进程也有机会执行。
这两种挂起的原因十分不同:
- 第一种挂起是进程自身的原因。这个时候,即使把CPU控制权交给它,它也无法运行。
- 第二种挂起是操作系统的原因。进程自己并无问题。只要把CPU交给进程,它就可以立即运行。
这样,如果将挂起进程分为这样两类,操作系统在进程调度时就只需要查看第二类进程,而无须浪费时间查看第一类进程。
因此,将进程分为3种状态:执行/运行
、阻塞
和就绪
。
4.7 进程与地址空间
- 进程空间也称为
地址空间
。简单来说,地址空间就是进程要用的所有资源。 - 进程与地址空间研究的主要内容是如何让多个进程空间共享一个物理内存。具体来说,就是高效、安全地让所有进程共享这片物理内存。
4.8 进程管理
4.8.1 进程管理所需要的手段
- 当一个进程产生时,操作系统也需要为其创建记录。操作系统用于维护进程记录的结构就是
进程表
或进程控制块
(Process Control Block
,PCB
)。这个进程表或PCB中存放的就是有关该进程的资料。 - 那么进程表里有什么资料呢?
但一般来说,维护的资料信息应当包括寄存器、程序计数器、状态字、栈指针、优先级、进程ID、信号、创建时间、所耗CPU时间、当前持有的各种句柄等。而采纳的数据结构主要是线性表、链表和结构(struct),当然也可能使用树和图(网络)结构。
进程表存放在操作系统所在的内核空间里
4.8.2 进程管理要处理的问题
创建进程的步骤如下所示:
1)分配进程控制块。
2)初始化机器寄存器。
3)初始化页表。
4)将程序代码从磁盘读进内存。
5)将处理器状态设置为“用户态”。
6)跳转到程序的起始地址(设置程序计数器)。
UNIX将进程创建分为两个步骤:
- 第1步是fork,创建一个与自己完全一样的新进程;
- 第2步是exec,将新的进程的地址空间用另一个程序的内容覆盖,然后跳转到新程序的起始地址,从而完成新程序的启动。
而Windows使用一个系统调用就可以完成进程创建。这个系统调用就是CreateProcess
。在调用该函数时我们把欲执行的程序名称作为参数传过来,创建新的页表,而不需要复制别的进程。
4.8.3 进程管理要处理的问题
- 进程管理的最大问题是资源分配。
4.9 进程的缺陷
- 它只能在一个时间做一件事情。如果想同时做两件或多件事情,进程就不够用了。
进程
01 试解释操作系统原理中的作业、进程、线程、管程各自的定义。
作业
:用户在一次解题或一个事务处理过程中要求计算机系统所做工作的集合。它包括用户程序、所需要的数据及控制命令等。作业是由一系列有序的步骤组成的。- 进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。
- 线程:线程是进程中的一个实体,是被系统独立调度和执行的基本单位。
管程
:管程实际上是定义了一个数据结构和该数据结构上的能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
02 在Windows编程中互斥器mutex的作用和临界区critical section类似,请说一下二者间的主要区别。
mutex
可以用于进程之间互斥。critical section
是线程之间的互斥。
03 在0时刻,进程A进入系统,按照这个顺序,在30时刻,进程B和进程C也抵达;在90时刻,进程D和进程E也抵达。一个时间片是10个单元。进程A需要占用CPU50个单元;进程B需要占用CPU40个单元;进程C需要占用CPU30个单元;进程D需要占用CPU20个单元;进程E需要占用CPU10个单元。如果按照短作业优先级的方法,哪个进程最后结束?
- 解析:牢记“
短作业优先
” = “最短剩余时间作业优先
”。本题考的是可剥夺式
处理机的调度问题。时间图如下所示。 - 如果按短作业优先级的方法,进程B最后结束。
04 在多重处理系统中,处理死锁的办法有两种:一是防止其发生;二是发生后进行处理。下面的办法中属于防止其发生的是哪一个?
- A. Destory mutual condition 破坏互斥条件
- B. Destory non-preemptive condition破坏不可剥夺条件
- C. Destory iterative waiting condition 破坏循环等待条件
- D. To kill one process which involves in dead-lock杀死某个激活死锁的进程
根据产生死锁的4个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,
可以采取下列3种预防措施:
● 采用资源静态分配策略,破坏“部分分配”条件。
● 允许进程剥夺使用其他进程占有的资源,从而破坏“不可剥夺”条件。
● 采用资源有序分配法,破坏“环路”条件。
这里注意一点:
互斥条件
无法被破坏。
在本题中选项A破坏互斥条件是无法做到的,B、C正确,D选项属于死锁事后处理操作,与题意不符。