第一章 操作系统引论
1.1 操作系统的目标和作用
操作系统的目标
-
方便性:配置os后计算机更容易使用。
-
有效性:改善系统资源利用率、提高系统吞吐量。
-
可扩充性:层次化结构、便于增加新功能模块。
-
开放性:要求os具有统一的开放环境。
操作系统的作用(功能)
-
OS作为用户与计算机硬件系统之间的接口
-
OS作为计算机系统资源的管理者
-
OS实现了对计算机资源的抽象
后边有详细描述
操作系统发展的主要动力
-
不断提高计算机资源利用率
-
方便用户
-
器件的不断更新迭代
-
计算机体系结构的不断发展
-
不断提出新的应用需求
1.2操作系统的发展过程
-
未配置操作系统的计算机系统
-
单道批处理系统
-
自动、顺序、单道
-
-
多道批处理系统
-
多道、无序、调度(提高cpu、内存、I/O利用 率,增加吞吐)
-
-
分时操作系统
-
实时操作系统
-
微机操作系统
-
单用户单任务操作系统
-
单用户多任务操作系统
-
多用户多任务操作系统
-
1.3操作系统的基本特性
-
并发
-
并行性是指两个或多个事件在同一时刻发生
-
并发性是指两个或多个事件在同一时间间隔内发生
-
进程是指在系统中能独立运行并作为资源分配的基本单位
-
同一时间间隔
-
共享
在操作系统环境下,所谓共享是指系统中的资源可供内存中多个并发执行的进程(线程)共同使用。由于资源属性的不同,进程对资源共享的方式也不同,目前主要有以下两种资源共享方式。
资源供多个进程并发执行使用
-
互斥共享方式
-
同时访问方式
-
虚拟
操作系统中的所谓“虚拟”,是指通过某种技术把一个物理实体变为若干个逻辑上的对应物。
物理实体—>逻辑对应物
-
异步
进程是以人们不可预知的速度向前推进,此即进程的异步性。尽管如此,但只要运行环境相同,作业经多次运行,都会获得完全相同的结果。因此,异步运行方式是允许的,是操作系统的一个重要特征。
进程异步
1.4操作系统的主要功能
操作系统作为系统资源的管理者
-
处理机管理功能
-
进程控制
-
进程同步
-
进程通信
-
-
存储器管理功能
-
设备管理功能
-
文件管理功能
操作系统作为与用户与计算机硬件系统之间的接口
-
用户接口(命令接口)
-
程序接口
操作系统用作扩充机器
1.5操作系统结构设计
模块化OS
优点:
-
提高了OS设计的正确性、 可理解性和可维护性。
-
增强了OS的可适应性。
-
加速了OS的开发过程。
缺点:
-
模块划分不精确
-
没有将共享资源和独占资源划分,OS结构不清晰
分层式OS
客户、服务器模式
面向对象技术
微内核结构
第二章 进程的描述与控制
2.1 前趋图和程序执行
程序的顺序执行
通常一个程序可分成若干个程序段,它们必须按照某种先后次序执行,仅当前一操作执行后,才能执行后继操作。
程序顺序执行时的特征::顺序性、封闭性、可再现性。
程序的并发执行
程序顺序执行时的特征:间断性、失去封闭性、不可再现性。
2.2 进程的描述
进程定义:进程是程序的一次执行,该程序可以与其它程序并发执行。在操作系统中能独立运行并作为资源分配的基本单位。
进程与程序的区别:
-
进程是动态的、程序是静态的。
-
进程是暂时的(状态变化的过程)、程序是永久的(保存)。
-
进程与程序的组成不同:进程包含数据、程序、进程控制块。
进程与程序的联系:
-
进程是操作系统处于执行状态的程序的抽象。
-
程序:文件(静态可执行文件)
-
进程:执行中的程序=程序+执行状态
-
-
同一程序的多次执行对应不同的进程
-
执行进程需要资源
⭐进程的基本状态及转换
进程的三种基本状态
由于多个进程在并发执行时共享系统资源,致使它们在运行过程中呈现间断性的运行规律,所以进程在其生命周期内可能具有多种状态。一般而言,每一个进程至少应处于以下三种基本状态之一:
-
就绪(Ready)状态。
-
执行(Running)状态。
-
阻塞(Block)状态。
进程在运行过程中会经常发生状态的转换。例如,处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态;正在执行的进程(当前进程)如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行转为就绪;如果因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态将由执行转变为阻塞。
创建状态和终止状态
-
创建状态
如前所述,进程是由创建而产生。创建一个进程是个很复杂的过程,一般要通过多个步骤才能完成:如首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪队列之中。但如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态。
- 终止状态
进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。一旦其他进程完成了对其信息的提取之后,操作系统将删除该进程,即将其PCB清零,并将该空白PCB返还系统。
引入挂起原语操作后三个进程状态的转换
挂起操作和进程状态的转换
在引入挂起原语Suspend和激活原语Active后,在它们的作用下,进程将可能发生以下几种状态的转换:
-
活动就绪→静止就绪
-
活动阻塞→静止阻塞
-
静止就绪→活动就绪
-
静止阻塞→活动阻塞
⭐进程管理中的数据结构
1、操作系统中用于管理控制的数据结构
OS管理的这些数据结构一般分为以下四类:内存表、设备表、文件表和用于进程管理的进程表,通常进程表又被称为进程控制块PCB。
2、⭐进程控制块PCB的作用
-
作为独立运行基本单位的标志。
-
能实现间断性运行方式。
-
提供进程管理所需要的信息。
-
提供进程调度所需要的信息。
-
实现与其它进程的同步与通信。
3、进程控制块PCB中的信息
进程标识符
进程标识符用于唯一地标识一个进程。一个进程通常有两种标识符:
-
外部标识符。方便用户对进程访问
-
内部标识符。方便系统对进程的使用
处理机状态
处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。
进程调度信息
在OS进行调度时,必须了解进程的状态及有关进程调度的信息,这些信息包括:
① 进程状态,指明进程的当前状态,它是作为进程调度和对换时的依据;
② 进程优先级,是用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机;
③ 进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待CPU的时间总和、进程已执行的时间总和等;
④ 事件,是指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
进程控制信息
是指用于进程控制所必须的信息,它包括:
① 程序和数据的地址,进程实体中的程序和数据的内存或外存地(首)址,以便再调度到该进程执行时,能从PCB中找到其程序和数据;
② 进程同步和通信机制,这是实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分地放在PCB中;
③ 资源清单,在该清单中列出了进程在运行期间所需的全部资源(除CPU以外),另外还有一张已分配到该进程的资源的清单;
④ 链接指针,它给出了本进程(PCB)所在队列中的下一个进程的PCB的首地址。
⭐进程控制块的组织方式
在一个系统中,通常可拥有数十个、数百个乃至数千个PCB。为了能对它们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有以下三种。
-
线性方式,即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。
-
链接方式,即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。
-
索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
2.3 进程控制
进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的状态转换等功能。如当一个正在执行的进程因等待某事件而暂时不能继续执行时,将其转变为阻塞状态,而在该进程所期待的事件出现后,又将该进程转换为就绪状态等。进程控制一般是由OS的内核中的原语来实现的。
操作系统内核
现代操作系统一般将OS划分为若干层次,再将OS的不同功能分别设置在不同的层次中。通常将一些与硬件紧密相关的模块(中断处理程序等)、各种常用的设备驱动程序以及运行频率较高的模块(时钟管理、进程调度等),都安排在紧靠硬件的层次中,将它们常驻内存,即通常被称为OS内核。
不同类型和规模的OS,它们的内核所包含的功能间存在着一定的差异,但大多数OS内核都包含了一下两大方面的功能。
-
支撑功能
中断处理
中断处理是内核最基本的功能,是整个OS赖以活动的基础。
时钟管理
时钟管理在OS中的许多活动都需要得到它的支撑。
原语操作
-
资源管理功能
(1) 进程管理。(2) 存储器管理。(3) 设备管理。
进程创建
-
引起创建进程的事件
-
用户登录
-
作业调度
-
提供服务
-
应用请求
进程终止
-
引起进程终止(Termination of Process)的事件
-
正常结束
-
异常结束
-
外界干预
⭐进程的阻塞与唤醒
-
引起进程阻塞与唤醒的事件
(1) 向系统请求共享资源失败 进程在向系统请求共享资源时,由于系统无足够的资源分配给它,该进程进入阻塞状态。当资源满足时,请求进程才被唤醒。
(2) 等待某种操作完成 当进程启动某种操作后,如果该进程必须在该操作完成之后才能继续执行,则必须先使该进程阻塞,以等待该操作完成。当该操作完成后将其唤醒。
(3) 新数据尚未到达 对于相互合作的进程,如果其中一个进程需要先获得另一进程提供的数据才能运行以对数据进行处理,则只要其所需数据尚未到达,该进程只有阻塞。只有所需数据到达后将其唤醒。
(4)等待新任务的到达
-
进程的阻塞
正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语block将自己阻塞。可见,阻塞是进程自身的一种主动行为。进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列。
-
进程的唤醒
当被阻塞进程所期待的事件发生时,比如它所启动的I/O操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。wakeup执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
2.4 进程同步
⭐进程同步的基本概念
两种制约关系
-
间接相互制约关系(进程—资源—进程) 进程的互斥
-
直接相互制约关系(进程—进程) 进程的同步
临界资源
虽然在多道程序系统中的诸进程可以共享各类资源,然而临界资源却是一次只能供一个进程使用,使用完后归还系统,才能给其他进程使用。
临界区
进程对临界资源必须互斥使用,为实现对临界资源的互斥访问,应保证诸进程互斥地进入自己的临界区。把每个进程中访问临界资源的那段代码称为临界区。为此,每个进程在进入其临界区前,必须先申请,经允许后方能进入。
⭐同步机制应遵循的准则
为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则。
空闲让进 | 当无进程处于临界区内时,必须让一个要求进入临界区的进程立即进入,以有效地利用临界资源。 |
---|---|
忙则等待 | 当已有进程处于临界区内时,其它试图进入临界区的进程必须等待,以保证它们互斥地进入临界区。 |
有限等待 | 对要求进入临界区的进程,应在有限时间内使之退出,以免陷入“死等”。 |
让权等待 | 对于等待进入临界区的进程而言,它如果不能进入自己的临界区,必须立即释放处理机,以免进程“忙等” |
硬件同步机制
1. 关中断
关中断是实现互斥的最简单的方法之一。在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。由此,保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。
但是,关中断的方法存在许多缺点:
-
滥用关中断权力可能导致严重后果;
-
关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力;
-
关中断方法也不适用于多CPU 系统,因为在一个处理器上关中断并不能防止进程在其它处理器上执行相同的临界段代码。
2. 利用 Test-and-Set 指令实现互斥
这是一种借助一条硬件指令——“测试并建立”指令TS(Test-and-Set)以实现互斥的方法。在许多计算机中都提供了这种指令。
boolean TS(boolean *lock)
{ boolean old;
old=*lock;
*lock=TRUE;
return old;
}
3. 利用 Swap 指令实现进程互斥
该指令称为对换指令,在Intel 80x86中又称为XCHG指令,用于交换两个字的内容。
void swap(boolean *a,boolean *b)
{
boolean temp;
temp=*a;
*a=*b;
*b=temp;
}
⭐信号量机制
利用硬件指令能有效地实现进程互斥,但当临界资源忙碌时,其它访问进程必须不断地测试,处于一种“忙等”状态,不符合“让权等待”的原则,造成处理机时间的浪费,同时也很难将它们用于解决复杂的进程同步问题。
1965年,荷兰学者Dijkstra提出的信号量机制是一种卓有成效的进程同步工具,被广泛应用于单处理机和多处理机系统,以及计算机网络中。
信号量类型 | 优点 | 缺点 |
---|---|---|
整型信号量 | 简单 | 未遵循“让权等待” |
记录型信号量 | 不存在“忙等” | 可能僵持,陷入死锁 |
AND型信号量 | 课“避免死锁” | 资源浪费 |
信号量集 | AND型信号量扩展,高效 | 资源浪费 |
-
整形信号量
最初由Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和signal(S)来访问。
-
wait(P)操作:申请资源
-
signal(V)操作:释放资源
很长时间以来,这两个操作一直被分别称为P、V操作。
-
P操作:意味着请求分配一个单位资源
P(S):① S∶=S-1;
② 若S≥0,则调用P(S)的进程继续运行;
③ 若S<0,则调用P(S)的进程被阻塞,并把它插入到等待信号量S的阻塞队列中。
-
V操作:意味着释放一个单位资源
V(S):① S∶=S+1;
② 若S>0,则调用V(S)的进程继续运行;
③ 若S≤0,从等待信号量S的阻塞队列中唤醒头一个进程, 然后调用V(S)的进程继续运行。
P、V操作可表示为如下两个过程:
Procedure P(Var S:Semaphore);
begin S∶=S-1;
if S<0 then W(S) #阻塞当前进程
end;
{P}
Procedure V(Var S:Semaphore);
begin S∶=S+1;
if S≤0 then R(S) #唤醒一个等待该资源的进程
end;
{V}
-
记录型信号量
在整型信号量机制中的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。
-
AND型信号量
前面所述的进程互斥问题针对的是多个并发进程仅共享一个临界资源的情况。在有些应用场合,是一个进程往往需要获得两个或更多的共享资源后方能执行其任务。假定现有两个进程A和B,它们都要求访问共享数据D和E,当然,共享数据都应作为临界资源。
-
信号量集
在前面所述的记录型信号量机制中,wait(S)或signal(S)操作仅能对信号量施以加1或减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行N次wait(S)操作,这显然是低效的,甚至会增加死锁的概率。此外,在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值,决定是否予以分配。
⭐信号量的应用
1、利用信号量实现进程互斥与同步
互斥例子
三个进程共用两个I/O缓冲区 解:设用信号量S表示共享资源,S初始值为2
同步例子
设有A、B两进程,A进程从卡片机读信息入缓冲区,B进程负责加工读进缓冲区的卡片信息。 解:设信号量S1:缓冲区中有否可供加工的信息,初始值为0; 信号量S2:缓冲区是否为空,初始值为1;
在输入进程A中,可以把P(S2)调到V(S1)后面,而把信号量S2的初始值设为0。大家可以自行分析这两个进程如何实现同步。
2、利用信号量实现前趋关系
信号量还可以描述程序或语句之间的前趋关系。设有两个并发执行的进程P1和P2。P1中有语句S1;P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将signal(S)操作放在语句S1后面,而在S2语句前面插入wait(S)操作,即
-
在进程P1中,用S1;signal(S);
-
在进程P2中,用wait(S);S2;
正在上传…重新上传取消
var a, b, c, d, e, f, g := semaphore := 0, 0, 0, 0, 0, 0, 0;
begin
parbegin
begin
S1;
V(a);
V(b);
end;
begin
P(a);
S2;
V(c);
V(d);
end;
begin
P(b);
S3;
V(e);
end;
begin
P(c);
S4;
V(f);
end;
begin
P(d);
S5;
V(g);
end;
begin
P(e);
P(f);
P(g);
S6;
end;
parend
end
管程机制
虽然信号量机制是一种既方便、又有效的进程同步机制,但每个要访问临界资源的进程都必须自备同步操作。这就使大量的同步操作分散在各个进程中。这不仅给系统的管理带来了麻烦,而且还会因同步操作的使用不当而导致系统死锁。
-
管程的定义
系统中的各种硬件资源和软件资源,均可用数据结构加以抽象的描述,即用少量信息和对该资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。当共享资源用共享数据结构表示时,资源管理程序可用对该数据结构进行操作的一组过程来表示。如资源的请求与释放过程。我们把这样一组相关的数据结构和过程一并称为管程。
hansan为管程所下的定义是:“一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据”。由定义可知,管程由四部分组成:
-
管程的名称
-
局部于管程的共享变量说明
-
对该数据结构进行操作的一组过程
-
对局部于管程的数据设置初始值的语句。
如下图是一个管程的示意图。