第2章-1 进程管理
前言
本章的全部内容如下:(内容太多,分3节记录)
2.1 程序执行
2.2 进程概念
2.3 进程控制
2.4 进程同步
2.5 经典进程同步问题
2.6 进程通信
2.7 线程
2.1 程序执行
多道:多个程序同时装入内存,宏观上并发,微观上串行。
OS的基本特性是并发与共享,系统中的程序交叉地运行,共享资源。
资源的竞争
程序之间的合作和协同
程序之间的通信
要解决这些问题,用程序的概念已经不能描述程序在内存中运行的状态,必须引入新的概念——进程。
2.1.1 程序的顺序执行
一个程序通常可以分为若干程序段,并且必须按照某种先后次序来执行。
例:一个程序由三个程序段组成:输入数据(I)、计算©和结果打印§。单道批处理系统中,两个相同类型程序顺序执行如下:
顺序执行的特征:
顺序性:按照程序所指定的次序执行。
封闭性:独占全部资源,资源的状态只由该程序才能改变它。
可再现性:初始条件相同, 则结果相同。
优点:程序的编制、调试方便;
缺点:CPU与外部设备之间不能并行工作,资源利用率低,计算机系统效率不高。
2.1.2 程序的并发执行
并发执行是指若干个程序(或程序段) 在一个处理器上的交替执行,宏观上表现为同时执行。目的是为了提高资源利用率。程序并发执行时的前趋图:
程序的并发执行通常是指多个程序在单CPU上的交替执行。
2.1.3 并发执行的特点
间断性: “走走停停”,一个程序可能走到中途停下来。
失去封闭性:共享资源受其他程序的影响。如:一个程序写到存储器中的数据可能被其它程序修改,失去原有不变特征。
不可再现性:失去封闭性 ->失去可再现性。外界环境在程序的两次执行期间发生变化,失去原有的可重复特征。
2.2 进程概念
进程是程序的一次执行。
进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。是系统进行资源分配与调度的一个独立单位。
进程的结构:进程实体(进程映像)=程序段+相关数据段+PCB
2.2.1 进程的特征
动态性:进程是程序的一次执行过程,是动态的。动态性表现在它因创建而产生、因调度而执行、因得不到资源暂停执行,由撤销死亡; 进程有生命周期。
并发性:多个程序存入内存,并发运行。引入进程的目的是为了使程序能与其它程序并发以提高资源利用率。
独立性:进程是能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。
异步性:进程以各自独立的、不可预知的速度向前推进。
结构特征:每个进程都由程序段、数据段和进程控制块(PCB)三部分组成。
异步性易导致不可再现性,因此,必须采用进程同步保证程序的可再现性。
2.2.2 进程与程序
- 进程是动态的,程序是静态的
程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件,可以复制。
- 进程是暂时的,程序是永久的
进程是一个状态变化的过程,程序可长久保存。
- 进程与程序的组成不同
进程的组成包括程序、数据和进程控制块PCB(即进程状态信息)。
- 进程与程序的对应关系
通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
2.2.3 进程的状态
进程是程序的一次执行。在这个过程中,有时进程正在被CPU处理,有时又需要等待CPU,可见,进程的状态是会有变化。为了方便对各个进程的管理,OS需要将进程合理地划分为几种状态。
2.2.4 进程的基本状态及转换
进程具有动态性,有生命期。运行中的进程可能具有3种基本状态。
- 就绪状态:进程已获得了除CPU以外的所有资源,一旦获得CPU就可立即执行;多个就绪进程时,组成就绪队列。
- 运行状态:进程获得了全部资源,正在CPU上运行。
- 阻塞状态:正在执行的进程由于发生某事件(I/O请求,申请内存失败等)而暂时无法执行。多个阻塞进程时,组成阻塞队列。
2.2.5 五种状态进程模型
五种状态:创建、就绪、运行、阻塞、终止
创建状态:进程正在创建过程中,还不能运行。如:建立PCB表项、建立资源表并分配资源、加载程序并建立地址空间表等。
终止状态:进程正在从系统中撤销。运行结束,OS需要完成撤销进程相关的工作。完成将分配给进程的资源回收,撤销进程PCB等工作。
2.2.6 挂起进程模型
挂起指在内存中的进程被暂时移到外存(如磁盘)的过程。
目的:提高处理机效率;为运行进程提供足够内存;用于调试。
当某个进程被挂起时,若被挂起的进程处于运行状态则停止执行;若被挂起的进程处于就绪状态,则暂时不参加进程调度。
引起进程挂起原因:
(1)用户的请求;
(2)父进程的请求;
(3)操作系统的原因。
2.2.7 进程控制块PCB-组织方式
在一个系统中,通常有很多个PCB,为了能对他们加以管理,应用适当的方式把这些PCB组织起来。进程的组织讨论的是多个进程之间的组织方式问题。
(1)顺序表方式:占用连续存储单元预分配存储空间
(2)链接方式:把具有同一状态的PCB,用其中的链接字连接成一个队列
(3)索引方式:根据进程状态的不同,建立几张索引表,OS持有指向各个索引表的指针
2.3 进程控制
进程控制是进程管理中最基本功能,进程控制一般由OS内核中的原语来实现。
进程控制功能:创建进程、终止进程、阻塞和唤醒、进程状态转换等
操作系统结构设计:
当一个进程执行系统调用而执行内核代码时,称进程处于内核态,此时处理器处于特权级最高的(0级)内核代码中执行。
当进程执行用户代码时,称其处于用户态,此时处理器在特权级最低的用户代码中运行。
2.3.1 进程的创建
一个进程可以创建一个新进程。引起创建进程的事件:
父进程(Parent Process)–建立者进程;撤销父进程时,同时撤销其所有的子进程。
子进程(Progeny Process)–被建立的进程;子进程继承父进程所拥有的资源。
2.3.2 fork—创建进程
新的进程通过克隆旧的进程而建立。具体操作:
- 为新进程申请新的task_struc
- 继承(inherit):子进程可以从父进程中继承用户标识符、环境变量、打开文件、文件系统的当前目录、控制终端、已经连接的共享存储区、信号处理例程入口表等。
- 不被继承:进程标识符,父进程标识符。
fork系统调用执行之后,父子进程返回到用户空间中相同的地址,用户进程根据fork( )的返回值分别安排父子进程执行不同的代码。
pid=fork();
fork之后,操作系统会复制一个与父进程完全相同的子进程。从系统调用fork返回时,CPU在父进程中时,pid值为所创建子进程的进程号(>0),若在子进程中时,pid的值为零。
-
调用格式:
p i d = f o r k ( ) { 0 子进程返回 0 子进程pid—父进程返回 pid=fork() \begin{cases} 0& \text{子进程返回}\\ \>0 & \text{子进程pid---父进程返回} \end{cases} pid=fork(){00子进程返回子进程pid—父进程返回 -
使用方法
main()
{ ….
while((x=fork())== -1);
if(x==0)
{ 子进程语句}
else
{父进程语句}
父、子都执行语句;
}
2.3.3 exec()进程的执行
功能:给新进程指定一个新的运行程序。
该进程的代码段、数据段和堆栈段就被新程序所代替。新程序从它自己的main()函数开始执行。
调用格式:exec (文件名,参数表,环境变量表)
#include <unistd.h>
main()
{ int pid;
pid=fork();
if (pid( )==0)
{ printf(“aaa”);
execlp(“./test6-file1”,0);
printf(“b”);
}
printf(“c”);
}
/* test6-file1.c */
main()
{
printf(“d”);
sleep(2);
}
2.3.4 进程的终止
进程完成任务后应予以撤销,以便及时释放它占用的各类资源。
终止原语:收回被终止进程所占用的所有资源,并撤销其PCB。
进程终止exit。
系统提供exit()系统调用。
2.3.5 进程的阻塞和唤醒
- 引起进程阻塞和唤醒的事件
1)向系统请求共享资源失败。如打印机
2)等待某种操作的完成,启动某种操作 :典型I/O操作
3)新数据尚未到达
4)无新工作可做:等待
- 正在执行的进程,无法继续执行时,进程把自己阻塞。
- 当被阻塞进程所期待的事件出现时,则由有关进程(如:提供数据的进程)调用唤醒原语,将等待该事件的进程唤醒。
- 进程阻塞自己——其他有关进程唤醒。
(1) 中断处理机,保存该进程的CPU现场,停止运行该进程;
(2) 将该进程(PCB)插入到相应事件的等待队列中;
(3) 从就绪队列中选择另一个进程投入运行。
进程的唤醒:
在Linux系统中,与进入阻塞状态相关的系统调用:
- sleep:在指定时间内挂起本进程,调用格式:
unsigned sleep(unsigned seconds)
返回值为实际挂起时间。- wait:挂起本进程以等待子进程的结束。
若有子进程退出时,父进程中的wait函数在第一
个子进程结束时返回,返回值为子进程ID
例题及参考答案
1、比较进程和程序的区别?
答:1. 进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件,可以复制。
2. 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存。
3. 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块PCB(即进程状态信息)。
2、为什么程序并发执行时会产生间断性特征?
答:程序在并发执行时,由于它们共享系统资源,为完成同一项任务需要相互合作,致使这些并发执行的进程之间,形成了相互制约关系,从而使得进程在执行期间出现间断性。
3、试说明进程在三个基本状态之间转换的典型原因。
答:
(1)就绪状态→执行状态:进程分配到CPU资源(进程调度)
(2)执行状态→就绪状态:时间片用完
(3)执行状态→阻塞状态:I/O请求
(4)阻塞状态→就绪状态:I/O完成
4、什么是线性表、顺序表、链表和索引表?
答:线性表:属于逻辑结构中的线性结构,它包括顺序表和链表。
顺序表:线性表中的一种,它是用数组来实现的一种线性表,所以它的存储结构(物理结构)是连续的。
链表:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
索引表是一张指示逻辑记录和物理记录之间对应关系的表。
5、例:只有一个CPU的系统中,如某时刻共有10个进程并发执行,在忽略调度程序占用时间情况下,问:
(1) 系统中处于运行态的进程数最多有几个,最少有几个?
答:最多1个,最少0个。
(2) 系统中处于就绪态的进程数最多有几个,最少有几个?
答:最多9个,最少1个。
(3) 系统中处于阻塞态的进程数最多有几个,最少有几个?
答:最多10个,最少0个。