12121212

第一章 操作系统引论

1.1 操作系统的目标和作用

1.1.1 操作系统的主要目标

方便性、有效性、可扩充性、开放性。

1)方便性:配置了OS的计算机系统,使得计算机变得易学易用。

2)有效性:有两层含义。第第一层是提高系统资源的利用率;第二层是,提高系统的吞吐量。

3)可扩充性:意味着可以方便地添加新的功能和模块,以及对原有的功能和模块进行修改。

4)开放性:系统能遵循世界标准规范,能够遵守规范的硬件和软件都能彼此兼容,方便地实现互连。

 

1.1.2 操作系统的作用

可以从用户、资源管理、资源抽象等方面考虑。

1、OS作为用户与计算机硬件系统之间的接口

 

2、OS作为计算机系统资源的管理者

计算机系统的资源可分为四类:处理机、存储器、I/O设备及文件(数据和程序)。处理机管理是用于分配和控制处理机;存储器管理主要负责内存的分配与回收;I/O设备管理是负责I/O设备的分配(回收)与操纵;文件管理是用于实现对文件的存取、共享和保护。

3、OS实现了对计算机资源的抽象

 

1.1.3 推动操作系统发展的动力

1、不断提高计算机资源利用率

2、方便用户

3、器件的不断更新换代

4、计算机体系结构的不断发展

5、不断提出新的应用需求

 

1.2 操作系统的发展过程

1.2.1 未配置操作系统的计算机系统

人工方式——>脱机输入/输出(Off-Line I/O)方式

1、人工方式(人际矛盾):

缺点有两个。用户独占全机;CPU等待人工操作。

2、Off-Line I/O方式(脱离CPU):事先将装有用户程序和数据的纸带装入纸带输入机,在一台外围机的控制下,把纸带 上的数据输入到磁带上。

优点有两个。减少了CPU的空闲时间;提高了I/O速度。

 

1.2.2 单道批处理系统

1、过程:把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序(CPU前身),在它的控制下,使这批作业能一个接一个地连续处理。

2、缺点:系统的资源得不到充分利用,当程序在运行中发出I/O请求后,CPU就处在等待状态。

 

1.2.3 多道批处理系统

1、过程:在该系统中,用户所提交的作业先放在外存上,并排成一个队列,称为“后备队列”。然后由作业调度程序按一定的算法,从后备程序中选择若干个作业调入内存,这样便可以在运行A程序时,利用其因I/O操作而暂停执行的CPU空挡时间,运行另一个B程序。

2、优缺点:资源利用率高;系统吞吐量大;平均周转时间长;无交互能力。

3、需要解决的问题:处理机争用问题;内存分配和保护问题;I/O设备分配问题;文件的组织和管理问题;作业管理问题;用户与系统的接口问题。

 

1.2.4 分时系统

1、含义:在一台主机上连接了多个配有显示器和键盘的终端并由此所组成的系统,该系统允许多个用户同时通过自己的终端,以交互方式使用计算机,共享主机中的资源。

2、解决的关键问题:及时接收、及时处理。

3、特征:多路性、独立性、及时性、交互性。

 

1.2.5 实时系统

1、含义:系统能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。

2、类型:工业(武器)控制系统、信息查询系统、多媒体系统、嵌入式系统。

 

1.2.6 微机操作系统的发展

含义:配置在微型机上的操作系统称为微机操作系统。

单用户单任务操作系统——>单用户多任务操作系统——>多用户多任务操作系统。

 

1.3 操作系统的基本特性

并发、共享、虚拟、异步。

1.3.1 并发(Concurrence)

1、并行和并发的比较:

并行:指两个或多个事件在同一个时间进行。

并发:指两个或多个时间在同一个时间间隔内发生。

2、单个CPU和多个CPU的区别:

单CPU:宏观并行,微观串行。

多CPU:宏观并行,微观并行。

 

1.3.2 共享

1、含义:指系统中的资源可供内存中多个并发执行的进程共同使用。

2、实现方式:互斥共享方式(规定在一段时间内,只允许一个进程访问资源);同时访问方式。

 

并发和共享是多用户(多任务)OS的两个最基本的特征。

 

1.3.3 虚拟(Virtual)

1、含义:在OS中,通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能。

2、实现技术:时分复用;空分复用。

 

1.3.4 异步(Asynchronism)

含义:进程是以人们不可预知的速度向前推进的。

 

1.4 操作系统的主要功能

1.4.1 处理机的管理功能

1、进程控制:为作业创建进程、撤销(终止)已结束的进程,以及控制进程在运行过程中的状态转换。

2、进程同步:在相互合作去完成共同任务的诸多进程间,由同步机构对它们的执行次序加以协调。

3、进程通信:当相互合作的进程出于统一计算机系统时,通常在它们之间采用直接通信方法,即由源进程利用发送命令直接将消息挂到目标进程的消息队列上,以后由目标进程利用接收命令从其消息队列中取出消息。

4、调度(资源分配):包括作业调度和进程调度。

1)作业调度:它的基本任务是从后备队列中按照一定的算法选择出若干个作业,为它们分配运行所需的资源,在将这些作业调入内存后,分别为它们建立进程,使他们都成为可能获得处理机的就绪进程,并将它们插入就绪队列中。

2)进程调度:从进程的就绪队列中按照一定的算法选出一个进程将处理机(CPU)分配给它,并为它设置运行现场,使其投入执行。

 

1.4.2 存储器管理功能

1、内存分配

1)为每道程序分配内存空间;

2)提高存储器的利用率,尽量减少不可用的内存空间;

3)允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的要求;

内存分配的实现有两种方式,分别是静态分配和动态分配。

1)静态分配:每个作业的内存空间是在作业装入时确定的,在运行期间不允许再申请新的空间,也不允许作业在内存中“移动”。

2)动态分配:每个作业的基本内存空间也是在作业装入时确定的,但是运行期间允许申请空间和移动。

 

2、内存保护

1)主要任务:①  确保每道用户程序都仅在自己的内存空间内运行,彼此互不干扰;②绝不允许用户程序访问操作系统的程序和数据,也不允许用户程序转移到非共享的其他用户程序中去执行。

2)简单的实现:设置两个界限寄存器,分别用于存放正在执行程序的上界和下界。在程序运行时,系统需对每条指令所要访问的地址进行检查。

 

3、地址映射

1)含义:将 地址空间中的逻辑地址——>物理地址。该功能应在硬件的支持下完成。

 

4、内存扩充

1)含义:借助虚拟存储技术,从逻辑上扩充内存容量。

2)实现功能:① 请求调入功能;② 置换功能。

 

1.4.3 设备管理功能

1、主要任务:

1)完成用户进程提出的I/O请求,为用户进程分配所需的I/O设备,并完成指定的I/O动作。

2)提高CPU和I/O设备的利用率,提高I/O速度,方便用户使用I/O设备。

2、实现功能:缓冲管理、设备分配、设备处理(设备驱动)。

 

1.4.4 文件管理功能

1、管理对象:用户文件、系统文件。

2、实现功能:文件存储空间的管理、目录管理、文件的读/写管理和保护。

 

1.4.5 操作系统与用户之间的接口

分为用户接口和程序接口。

用户接口又分为联机用户接口、脱机用户接口、图形用户接口。

 

*第二章 进程的描述与控制

2.1.2 程序顺序执行

1、特征:顺序性、封闭性、可再现性。

封闭性:指程序在封闭的环境下运行,程序运行时独占全机资源,资源的状态只有本程序才能改变它。

可再现性:只要程序执行时的环境和初始条件相同,当程序重复执行时,无论它是连续执行,还是“走走停停”地执行,结果都一样。

 

2.1.3 程序并发执行

不存在前驱关系的程序之间就可以并发执行。

1、特征:间断性、失去封闭性、不可再现性。

 

2.2 进程的描述

2.2.1 进程的定义和特征

1、进程实体(映像):由程序段、相关的数据段、PCB(进程控制块)三部分构成。

进程控制块:一个专门的数据结构,用来描述进程的基本情况和活动过程,进而控制和管理进程。PCB为一个进程的标识。

一般情况下,我们把进程实体简称为进程。例如,所谓创建进程,实质上是创建进程实体中的PCB;所谓撤销进程,是撤销进程实体中的PCB

 

2、进程定义:

1)进程是程序的一次执行。

2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

3)进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

 

3、进程的特征:动态性、并发性、独立性、异步性。

动态性:程序是静态的,而进程是动态的。进程的实质是进程实体的执行过程。

独立性:在传统的OS中,独立性是指进程实体是一个能够独立运行、独立获得资源和独立接收调度的基本单位

异步性:进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进

 

2.2.2 进程的基本状态及转换

1、进程的三种基本状态

1)就绪:无CPU,有其他所有必要资源。通常许多就绪状态的进程组成一个就绪队列。

2)执行:有CPU+资源。单核单执行,多核多执行。

3)阻塞:有CPU,但缺乏其他资源,后放弃CPU。通常将多个阻塞状态的进程也排成一个阻塞队列。为了提高效率,根据阻塞原因的不同,会设置多个队列。

 

2、增加了创建和终止状态的转换

1)创建状态:创建一个进程要经过很多步骤,如进程先要申请一个空白PCB,然后向PCB中填写用户控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪对列中。当资源不足,进程创建工作尚未完成,进程不能被调度运行,把此时进程所处的状态成为创建状态。

2)终止状态:进程的终止要通过两个步骤,等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统。进入终止状态的进程不能再执行,但在操作系统中仍保留一个记录,共其他进程收集。以但收集完毕,操作系统将删除该进程。

 

2.2.3 挂起操作和进程状态的转换

1、含义:实际是把进程放在了外存中,若其正在运行,则挂起后暂停执行;若处于就绪状态,则挂起后此进程暂不接受调度。与挂起操作相对应的是激活操作。

 

2、引入的原因:终端用户的需要、父进程请求、负荷调节的需要、操作系统的需要。

 

3、引入挂起操作后五个进程状态的转换

 

2.2.4 进程管理中的数据结构

1、用于管理控制的数据机构:

管理的表包括四种,内存表、设备表、文件表和用于进程管理的进程表(PCB)

 

2、PCB的作用

PCB能够使一个在多道程序环境下不能独立运行的程序(含数据)成为一个独立运行的基本单位,一个能与其他进程并发执行的进程。它的作用可细分为:

1)作为独立运行基本单位的标志;

2)能实现间断性运行方式;(保留CPU现场,保证可再现性)

3)提供进程管理所需要的信息;

4)提供进程调度所需要的信息;

5)实现与其他进程的同步和通信。(区域或通信队列指针、用于同步的信号量)

 

3、进程控制块中的信息

进程控制块中主要包括以下四个方面的信息:

1)进程标识符:又分为内部标识符和外部标识符。内部标识符由OS设置,外部标识符由创建者设置。

2)处理机状态(CPU现场信息):它又称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成。这些寄存器包括:通用寄存器、指令计数器、用户栈指针。

3)进程调度信息:包括进程目前所处的状态、优先级、已等待时间和已执行时间、事件。事件是指进程由执行状态变为阻塞状态所等待发生的事件,即阻塞原因。

4)进程控制信息:包括程序和数据的地址、进程同步和通信机制(如消息队列指针、信号量)、资源清单、链接指针(本进程所在队列中的下一个进程的PCB的首地址)。

 

4、进程控制块的组织方式

1)线性方式:即将系统中所有的PCB都组织在一张线性表中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,适合进程数目不多的系统。(如DOS系统)

2)链接方式:即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可形成就绪队列、若干阻塞队列和空白队列等。

3)索引方式:系统根据所有进程状态的不同,建立几张索引表,例如就绪索引表、阻塞索引表。

 

2.3 进程控制

控制的内容包括三个,分别是创建进程、终止进程、进程的状态转换。进程控制一般是由OS内核中的原语实现的。(原语即原子操作)

 

2.3.1 操作系统内核

OS内核一般都是一些跟硬件紧密相关的模块和各种常用设备的驱动程序、运行频率交稿的模块(如时钟管理、进程调度)等。

1)处理机的执行状态:分为两种,系统态/内核态(管态)和用户态(目态)。一般情况下,传统的OS都在管态进行,而用户程序都在目态进行。

2)OS内核的两大功能:

支撑功能:包括中断处理、时钟管理、原语操作。

资源管理功能:包括进程管理、存储器管理、设备管理。

 

2.3.2 进程的创建

1、进程的层次结构

子进程可以继承父进程所拥有的资源。注意,在Windows中,所有的进程都具有相同层次的地位。如果一个进程创建另外的进程时创建进程获得了一个句柄,其作用相当于一个令牌,可以用来控制被创建的进程。但是这个句柄是可以传递的。因此,进程的关系是获得句柄与否、控制与被控制的简单关系。

 

2、引起创建进程的事件

有四类:用户登陆、作业调度、提供服务、应用请求。前三种都是由OS创建进程,后一种是用户自己创建。

 

3、进程的创建过程

1)申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB。

2)为新进程分配其运行时所需的资源,包括物理和逻辑资源,例如内存、文件、I/O设备和CPU时间等。这些资源或从操作系统或仅从父进程中获取。

3)初始化进程控制块:初始化标识信息、处理机状态信息、处理机控制信息。

4)如果进程就绪队列能够接纳新进程,就将新进程插入就绪队列。

 

2.3.3 进程的终止

1、引起终止的事件:正常结束、异常结束、外界干扰。

 

2、进程的终止过程

1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;

2)若该进程处于执行状态,应立即停止该进程的执行,并设调度标志为真。用于指示该进程被终止后应重新进行调度;

3)若该进程还有子孙进程,还应将其所有子孙进程也予以中止;

4)将该进程(PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。

 

2.3.4 进程的阻塞与唤醒

1、引起阻塞和唤醒的事件

1)向系统请求共享资源失败;

2)等待某种操作的完成;

3)新数据尚未到达;

4)等待新任务的到达。

 

2、进程阻塞过程

正在执行的进程,若发生了上述事件,便调用阻塞原语将自己阻塞,进入block状态后,应先立即停止执行,把PCB中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。

 

3、进程唤醒过程

若被阻塞进程所期待的事件发生,则由有关进程(如提供数据的进程)调用唤醒原语将其唤醒。wakeup执行的过程:将被阻塞进程从阻塞队列中取出,把其PCB中的现行状态改为就绪,然后将该PCB插入就绪队列。

注意,阻塞原语和唤醒原语必须成对使用,否则进程可能将因不能被唤醒而永久阻塞,不能执行。

 

2.3.5 进程的挂起与激活

1、进程的挂起

当系统中出现了引起进程挂起的事件时,OS将利用挂起原语suspend将指定进程或处于阻塞状态的进程挂起。suspend的执行过程:首先检查被挂起进程的状态,将活动就绪/阻塞改为静止就绪/阻塞。为了方便用户或父进程考查该进程的运行情况,而把该进程的PCB复制到某指定的内存区域。若被挂起的进程为运行状态,则让其重新被调度。

 

2、进程的激活过程

激活原语active:先将进程从外存调入内存,将静止阻塞/就绪状态改为对应的活动状态。

 

2.4 进程同步

2.2.1 进程同步的基本概念

1、主要任务:使得并发执行的进程能按照一定的规则共享系统资源,并能很好地相互合作,从而使得程序的执行具有可再现性。

2、制约关系:有两种,分别是间接相互制约关系和直接相互制约关系。

1)间接相互制约关系:即互斥关系,为同步的一种特例。多个进程共享同一个邻接资源,且共享的方式是先来者先使用。

2)直接相互制约关系:即狭义的同步。多个进程为了完成同一个任务而相互合作,多个进程间有先后顺序。

 

3、临界资源(Critical Resouce):一次只能给一个进程使用的资源。各个进程间采取互斥方式,实现对这种资源的共享。

 

4、临界区(critical section):在每个进程中访问临界资源的那段代码称为临界区。

 

5、同步机制的四条规则:空闲让进、忙则等待、有限等待、让权等待。

让权等待:当进程不能进入自己的临界区时,应立即释放处理机,避免进程陷入“忙等”状态。所谓“忙等”,即进程已拥有CPU,但需要执行的区域被加锁了,它不能执行,而CPU被占用了,却什么都不做。

 

2.4.2 硬件同步机制

三种方法,关中断、利用Test-and-Set实现互斥、利用Swap指令实现互斥。

关中断:在进入锁测试之前关闭中断,直到完成锁测试并上锁才能打开中断。

1、缺点:1)进程会处于“忙等状态”;2)有的硬件系统无此类指令。

 

*2.4.3 信号量机制

有四种,分别是整型信号量、记录型信号量、AND型信号量、信号量集。

1、整型信号量

仅能三个操作,初始化,wait(S),signal(S)(P、V操作)。

缺点:“忙等”。当S<=0时,进程会不断地测试。

wait(S){
    while(S<=0);
    S--;
}
signal(S){
    S++;
}

*2、记录型信号量

为了解决上述“忙等”问题,采取了“让权等待”机制。但采取此机制后,会出现多个进程同时等待一个资源的现象。为此,在信号量机制中,出一个需要一个代表资源数目的整性变量value,还有一个进程链表指针list,表示上述所有的等待进程。而记录型信号量就是因为其采取了记录型的数据结构而得名。

1)数据结构:

typedef struct{
    int value;
struct process_control_block *list;
}semaphore;

2、PV操作:

wait(semaphore *S){
    // 这里是先进行S->value的--操作,为了保证操作的原子性。若先block线程,则线程无法往下执行            //value--了。
    S->value--;
    // 注意这里是<0。
    if(S->value<0) block(S->list);
}

signal(semaphore *s){
    // 同上
    S->value++;
    // 这里为<=0,==0也包括是因为,当==0时,说明S->value原先为-1,还有一个在等待,所以要wakeup。
    if(S->value<=0) wakeup(S->list);

}

 

3、AND信号量

用于解决一个进程需要获得多个共享资源才能执行任务的情况,避免死锁。

基本思想:将进程在整个运行过程中所需要的资源,一次性全部分配给进程,待进程使用完后再一起释放。

 

4、信号量集

对AND信号量机制加以扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V操作中完成申请获释放。

 

2.4.4 信号量的应用

1、利用信号量实现进程互斥

为该资源设置一互斥信号量mutex,在进入临界区和出去临界区时对mutex分别执行wait()和signal()操作。(PV操作必须成对出现)

// 先初始化mutex为1

//每个进程的代码
Px(){
   while(1){
    wait(mutex);
    //临界区
    signal(mutex);
    //剩余区    
} 
}

 

2、利用信号量实现前去关系(查看课本P57)

 

*2.5 经典进程的同步问题

2.5.1 生产者-消费者问题

1、利用记录型信号量解决生产者-消费者问题

1)前提:生产者和消费者之间的公用缓冲池有n个缓冲区;这些生产者和消费者相互等效,只要缓冲池未满,生产者便可把消息送入缓冲池。只要缓冲池未空,消费者便可从缓冲池中取走一个消息。

2)问题分析:①生产者和消费者之间是合作的关系,一个生产一个消费,故设置信号量full和empty来实现它们之间的同步。full满缓冲池的数量,empty代表空缓冲池的数量;②生产者中每个进程和消费者中每个进程都是相互独立的,故它们之间是互斥的关系。设置一个互斥量mutex来实现各个进程对缓冲池的互斥使用。

3)实现:

//前提操作
semahore mutex=1,empty=n,full=0;

//生产者操作
void proceducer(){
    produceAItem();
    //这里要先做wait(empty),顺序不可调换。否则会引起死锁。因为mutex只有一个。如果先执行消费者发    现没资源,那么生产者也生产不了,mutex被拿走了。
    wait(empty);
    wait(mutex);
    
    putItemToBuffer();
    //这里的signal顺序可调换。
    signal(mutex);
    signal(full);

}

void consumer(){
    // 同上
    wait(full);
    wait(mutex);

    getItem();

    // 同上
    signal(mutex);
    signal(empty);

    consumeItem();
}

 

4)改进:对生产者进程和消费者进程们可以分别使用两个mutex变量,让它们之间各自独立,提高效率。同时wait操作也影响不了死锁问题了。

 

2、利用AND信号量解决生产者-消费者问题

好处:可避免死锁

 

3、利用管程解决生产者-消费者问题(这个我没看)

 

2.5.2 哲学家进餐问题

1、问题描述:共有5个哲学家围坐在一个圆桌,圆桌上有五个碗和五个筷子。哲学家的生活方式是思考-吃饭-思考……。哲学家饥饿时会试图取用其左右最靠近的筷子,只有当拿到一双筷子才能进餐。

2、实现

1)利用记录型信号量解决哲学家进餐问题

//初始化信号量
semaphore chopstick[5] = {1,1,1,1,1};

do{

    think();
    //哲学家编号为x,x为1-5
    wait(chopstick[x%5]);
    wait(chopstick[(x+1)%5]);
    
    eatSomething();

    signal(chopstick[x%5]);
    signal(chopstick[(x+1)%5]);

    think();

}while[TRUE];

存在问题:死锁

解决方案:至多只允许有4位哲学家同时取拿左边的筷子;仅当哲学家的左右两只筷子均可用时,才允许其进餐。(即利用AND信号量机制解决);规定奇数号哲学家先拿它左边的筷子,欧叔号哲学家则相反。

 

2.5.3 读者-写者问题

1、问题描述:读和读同步,读和写互斥,写和写互斥。

2、实现

1)利用记录型信号量解决

// 初始化值
semaphore rmutex=1,wmutex=1;
// readCount记录目前读者的数量
int readCount = 0;


// 此种模式为读者优先,所有reader未读完前,都不可以写
void reader{
    do{

        //读者之间只能一个个对readCount进行增加
        wait(rmutex);
        if(readCount == 0) wait(wmutex);
        readCount++;
        signal(rmutex);

        read();

        wait(rmutex);
        readCount--;
        if(readCount == 0) signal(wmutex);
        signal(rmutex);        

    }while(TRUE);

}

void writer{
    do{
        wait(wmutex);
        
        write();

        signal(wmutex);

    }while(TRUE);
}

 

2.7 线程的基本概念

2.7.1 线程的引入

引入原因:减少程序在并发执行时所付出的时空代价,使OS具有更好的并发性。

 

1、进程的两个基本属性
1)进程是一个可拥有资源的独立单位;2)进程是一个可独立调度和分派的基本单位。

 

2、程序并发执行所需付出的时空开销

1)创建进程; 2)撤销进程;3)进程切换

 

为了减小时空开销:将线程作为调度和分派的基本单位,进程作为拥有资源的基本单位。实际上,进程不再具备独立运行的能力,所谓的进程在运行,实则是指进程的一个线程在运行。

 

2.7.2 线程与进程的比较

线程也可称为轻型进程,进程则称为重型进程。

调度的基本单位:进程作为调度单位时,每次被调度时,都要进行上下文切换,开销较大;进程则只要保存和设置少量寄存器内容,切换代价很小。

并发性:进程和进程可以并发,进程和线程可以并发,多个线程可以并发。

拥有资源:进程可以拥有资源;线程不拥有系统资源,它仅有一点必不可少的,能保证独立运行的资源。

独立性:同一进程中的不同线程要比不同进程之间的独立性低很多。

系统开销:看调度的基本单位

支持多处理机系统:传统的进程(单进程线程,即没有多线程的情况下),进程只能运行在一个CPU上;多线程下,进程能运行在多个CPU下。

 

2.7.3 线程的状态和线程控制块

1、线程运行的三个状态

分别是执行、就绪、阻塞状态。(与线程一致)

 

2、线程控制块TCB(与进程类似)

 

3、多线程OS下的进程属性

1)进程是一个可拥有资源的基本单位;

2)多个线程可并发执行;

3)进程已不是可执行的实体

 

2.8 线程的实现

2.8.1 线程的实现方式

1、内核支持线程KST(Kernel Supported Threads)

在内核空间实现。其调度以线程为单位。

优点:1)内核能够同时调度同一进程中的多个线程并发执行;

2)若进程中的一个线程被阻塞了,则可以调用其进程的其他线程,也可以运行其他进程中的线程;

3)线程的切换快,开销小;

4)内核本身也可以采用多线程技术,可提高系统的执行速度和效率。

缺点:对于用户的线程切换而言,切换开销较大。在同一个进程中进行线程切换,需从用户态转到核心态,这是因为用户进程的线程在用户态运行,而线程调度和管理在内核实现。

 

2、用户级线程UTL(User Level Threads)

在用户空间实现,其无需得到内核的支持。内核不知道此类线程的存在。其调度以进程为单位。

优点:1)线程切换不需转到内核空间;

2)调度算法可以是进程专用的;3)用户级线程的实现与OS平台无关。

缺点:1)系统调用的阻塞问题(一个线程阻塞=整个进程内的所有线程阻塞);2)进程中仅有一个线程能执行。

 

3、组合方式

三种模型,多对一、一对一、多对多。(用户线程----->内核线程)

 

2.8.2 线程的实现

 

 

 

 

 

 

第三章  处理机调度与死锁

调度的实质是资源分配。

处理机调度:对处理机资源进行分配。

处理机调度算法:指根据处理机分配策略所规定的处理机分配算法。

3.1 处理机调度的层次和调度算法的目标

3.1.1 调度层次

分为高级、中级和低级调度。

1、高级调度(High Level Scheduling)(又称为长度或作业调度)

1)调度对象:作业

2)主要功能:根据某种算法,决定将外存上处于后备队列中的那几个作业调入内存,为它们创建进程,分配必要的资源,放入就绪队列。

3)使用场景:多道批处理系统中。分时和实时系统没有。

 

2、低级调度(进程或短程调度)

1)调度对象:进程

2)主要功能:根据某种算法,决定就绪队列中的哪个进程获得处理机,并由分派程序将处理机分配给被选中的进程。

3)使用场景:多道批处理、分时、实时系统。

 

3、中级调度(内存调度)

1)调度对象:进程

2)主要功能:把那些暂时不能运行的进程,调至外存等待,并更改其状态为挂起;然后由中级调度决定把外存上的那些具备条件的就绪进程再调入内存,并更改状态为就绪。

3)实质:存储器管理中的对换功能。

4)引入目的:提高内存利用率和系统吞吐量。

 

3.1.2 处理机调度算法的目标

1、处理机调度算法的共同目标

1)资源利用率

CPU的利用率 = CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)

2)公平性

公平性是指应使诸进程都获得合理的CPU时间,不会发生进程饥饿。

进程饥饿:指当等待时间给进程推进和响应带来明显影响称为进程饥饿

3)平衡性

调度算法应尽可能保持系统资源使用的平衡性。

4)策略强制执行

对于所制定的策略,只要需要,就必须予以准确的执行。

 

2、批处理系统的目标

1)平均周转时间长

周转时间:指从作业被提交到系统开始,到作业完成为止的这段时间间隔。

2)系统吞吐量高

3)处理机利用率高

 

3、分时系统的目标

1)响应时间快

2)均衡性:系统响应时间的快慢应与用户所请求服务的复杂性相适应。

 

4、实时系统的目标

1)截止时间的保证

2)可预测性

 

3.2 作业与作业调度

3.2.1 批处理系统中的作业

1、作业与作业步

1)作业:包括程序+数据+作业说明书。在批处理系统中,是以作业为基本单位从外存调入内存的。

2)作业步:在作业运行期间,每个作业都必须经过若干个相对独立又相互关联的顺序加工步骤才能得到结果。我们把其中的每一个加工步骤称为一个作业步。

 

2、作业控制块(JCB)

类似PCB,每个作业都对应一个JCB。

 

3、作业运行的三个阶段和三种状态

收容阶段——> 收容状态;运行阶段——>运行状态;完成阶段——>完成状态。

 

3.3.2 作业调度的主要任务

1、主要任务:检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程,分配资源。然后放入就绪队列。其又被称为接纳调度。

2、决定:接纳作业的数量、接纳作业的类型。

 

*3.3.3 作业调度算法

有FCFS、SJF、PHA、HRRN四种算法。前三种都能作为进程调度算法。

1、先来先服务(first-come first-served)调度算法

1)算法:每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

2)使用场景:该算法在单处理机系统中已很少作为主调度算法,但经常把它与其他调度算法结合,形成更有效的调度算法。

 

2、短作业优先(short job first)调度算法

1)算法:作业越短,优先级越高。作业的长短看作业的运行时间。

2)缺点:必须预知作业的运行时间;对长作业非常不利(可能会出现进程饥饿);人机交互无法实现;未考虑作业的紧迫程度。

 

3、优先级调度算法(priority-scheduling algorithm)

1)算法:基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法根据此优先级进行调度。

 

4、高响应比优先调度算法(Highest Response Ratio Next)

1)算法:为每个作业引入一个动态的优先级,此优先级随着等待时间延长而增加。

响应比Rp=优先权=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间。

2)优点:既考虑了作业的等待时间,又考虑作业的运行时间。

3)缺点:每次调度前都要进行响应比的计算,增加系统开销。

 

*3.3. 进程调度

3.3.1 进程调度的任务、机制和方式

1、进程调度的任务

保存处理机的现场信息、按某种算法选取进程、把处理器分配给进程。

 

2、进程调度机制

1)组成部分:排队器、分派器、上下文切换器。

排队器:每当有一个进程转变为就绪状态时,排队器就将它插入到相应的就绪队列。

分派器:分派器依据进程调度程序所选定的进程,将其从就绪队列中取出,然后进行从分派器到新选出进程间的上下文切换,将处理机分配给新选出的进程。

上下文切换器:在对处理机进行切换好时,会有两对上下文的切换。① 当前进程的上下文从处理机中取出,处理机装入分派程序的上下文;② 分派程序的上下文取出,装入新选进程的上下文。

 

3、进程调度方式

两种,分别是非抢占式和抢占式。

1)非抢占式(NonPreemptive Mode)

1.含义:一旦处理机分配给某进程,就让它一直运行下去,别的进程不能剥夺处理机。

2.引起进程调度的因素:执行完毕,或其自身发生错误;正在执行的进程提出I/O请求;进程通信或同步过程中,执行了P、wakeup、Block等原语操作。

3.使用场景:优点是实现简单,系统开销小,适用于大多数的批处理系统。不能用于分时和实时系统。

 

2)抢占式(Preemptive Mode)

1.含义:允许调度程序根据某种原则,暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。

2.须遵循原则:优先权原则;短进程优先原则;时间片原则。

 

3.3.2 轮转调度算法

1、基本原理

系统将所有的就绪进程按照FCFS策略排成一个就绪队列,然后每一个进程都能在确定的时间段内,获得一个时间片的处理机时间。

 

2、进程切换时间

1)若一个时间片未用完,正在运行的进程便已完成,就立即激活调度程序,将它从就绪队列中删除,再调度就绪队列中队首的进程运行,并启动一个新的时间片;

2)在一个时间片用完时,计时器中断处理程序被激活。如果进程尚未完成,调度程序就把它送往就绪队列的队尾。

 

3、时间片大小的确定

一个较为可取的时间片大小是略大于一次典型的交互所需要的时间。

 

3.3.3 优先级调度算法

优先级调度算法,是把处理机分配给就绪队列中优先级最高的进程。

1、优先级调度算法的类型

两种,分为非抢占式优先级调度算法和抢占式优先级调度算法。

 

2、优先级的类型

优先级调度算法的关键:应该如何确定进程的优先级,以及确定是使用静态优先级还是动态优先级。

1)静态优先级

1.特点:静态优先级是在创建进程时确定的,在进程的整个运行期间保持不变。

2.确定进程优先级的依据:进程类型;进程对资源的需求(越少越高);用户要求(紧迫程度等)。

3.优点:简单易行,系统开销小,但可能会出现优先级低的进程长期没有被调用的情况。

 

2)动态优先级

1.特点:在创建进程之初,先赋予其一个优先级,然后其值随着进程的推进或等待时间的增加而改变。

2.优点:当采用抢占式调度方式时,若再规定当前进程的优先级随着运行时间的推移而下降,则可防止一个长作业长期地垄断作业机。

 

3.3.4 多队列调度算法

优点:该算法设置多个就绪队列,对每个就绪队列可以实施不同的调度算法,因此,系统针对不同用户进程的需求,很容易提供多种调度策略,弥补了单一调度策略实现机制的缺点。

1、调度机制

1)设置多个就绪队列。队列的优先级从前往后依次降低。随着优先级的降低,时间片的加倍。

2)每个队列都采用FCFS算法。当进程最后被降到第n队列时,便采用RR(轮转)方式运行。

3)按队列优先级调度。如果处理机正在第i队列中为某进程服务时,又有新进程进入任一较高优先级队列,则此时必须把正在运训的进程放回到i队列的队尾,把CPU分配给新到的高优先级进程。

 

2、调度算法的性能

如果规定第一个队列的时间片略大于多数人机交互所需的处理时间,便能较好地满足终端型用户、短批处理作业用户、长批处理作业用户的需求。

 

3.3.6 基于公平原则的调度算法

1、保证调度算法

保证每个进程都获得相同的处理机时间1/n。

 

2、公平分享调度算法

该算法主要是针对用户而言,使所有用户获得相同的处理机时间。

 

3.4 实时调度

在实时系统中,存在HRT(硬实时)和SRT(软实时)两种性质的实时任务。

 

3.4.1 实现实时调度的基本条件

包括4点。

1、提供必要的信息:包括就绪时间(任务成为就绪状态的起始时间)、开始截止时间和完成截止时间(大多都只需知其一即可)、处理时间、资源要求、优先级。

2、系统处理能力强

3、采用抢占式调度机制:HRT必须采用,SRT可选择采用。

4、具有快速切断机制:包括两点。1,对中断的快速响应能力;2,快速的任务分派能力。

 

3.4.2 实时调度算法的分类

根据实时任务性质分类,可分为软实时调度算法和硬实时调度算法;根据调度方式分类,可分为抢占式调度算法和非抢占式调度算法。

 

1、非抢占式调度算法

包括非抢占式轮转调度算法和非抢占式优先调度算法。

 

2、抢占式调度算法

包括基于时钟中断的抢占式优先级调度算法和立即抢占的优先级调度算法。

 

3.4.3 最早截止时间优先EDF(earlist deadline first)算法

可有两种方式,分别是非抢占式和抢占式。非抢占式用于非周期实时任务;抢占式调度用于周期实时任务。

 

3.4.4 最低松弛度优先LLF(least laxity first)算法

松弛度=任务必须完成的时间-任务本身的运行时间-当前时间

即任务紧急程度越高,则该任务的优先级越高。该算法主要用于可抢占调度方式中。

 

3.4.5 优先级倒置

1、含义:高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞。

 

2、解决方案

1.简单版:进程Px在进入临界区后Px所占用的处理机就不允许被抢占。

2.实用版:此方法是建立在动态优先级继承基础上的。该方法规定,当高优先级进程P1要进入临界区,取使用临界资源R,如果已有一个低优先级进程P3正在使用该资源,此时一方面P1被阻塞,且P3继承P1的优先级,保持到P3退出临界区。(避免比P1优先级低但是比P3优先级高的进程插入进来)

 

*3.5死锁概述

 

3.5.1 资源问题

资源分很多种,引起死锁的主要是临界资源(即互斥访问,不可被抢占的资源)。例如打印机、数据文件、队列、信号量等。

1、可重用性资源和消耗性资源

 

2、可抢占性资源和不可抢占性资源

可抢占性资源有CPU、主存等;不可抢占性的有磁带机、打印机等。

 

3.5.2 计算机系统中的死锁

引起死锁的原因有两种。

1、竞争资源引起的死锁。

资源可分为两种:不可抢占性资源和可消耗性资源。

 

2、进程推进顺序不当引起死锁。

 

*3.5.3 死锁的定义、必要条件和处理方法

1、死锁的定义

如果一组进程中的每一个进程都在等待仅有该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。

 

2、产生死锁的条件

1.互斥条件:进程对所分配到的资源进行排他性使用。

2.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,且该资源已被其他进程占有。

3.不可抢占条件:资源未使用完前不可抢占,只能等待进程自行释放。

4.循环等待条件:在发生死锁时,必然存在一个进程-资源的循环链。

 

3、处理死锁的方法

分为四种,分别是预防死锁、避免死锁、检测死锁、解除死锁。

 

3.6 预防死锁

主要破坏产生死锁的后三个条件。

1、破坏“请求和保持”条件:该保证可通过2个不同的协议实现。

1.第一种协议

含义:该种协议规定,进程在开始运行之前,必须一次性申请其在整个运行期间的所有资源。

优缺点:优点是简单、易行、安全。缺点是严重浪费资源、使进程经常发生饥饿现象。

2.第二种协议

做法:该协议为第一种的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。

 

2、破坏“不可抢占”条件

该方法实行复杂,且代价很高。它可能会造成进程前一阶段工作的失效,还可能因为反复地申请和释放资源导致进程的执行被无限推迟。

 

3、破坏“循环等待”条件

做法:对系统所有资源类型进行线性排序,并赋予不同的序号。

优缺点:相对于前面两种策略,矮资源利用率和吞吐量有较明显的改善。但也存在限制新类型设备的增加等问题。

 

*3.7 避免死锁

1、安全状态

含义:指系统能按某种进程推进顺序(P1,P2,P3... Pn)为每进程Pi分配其所需资源,直至满足每个就能成对资源的最大需求,使每个进程都能顺利完成。此时称(P1,P2,...Pn)为安全序列。

与死锁的关系:安全状态一定不会发生死锁,不安全状态可能会发生死锁。

因为安全状态是按照进程所需资源的最大需求来寻找的,进程运行时不一定要这么多资源。

 

*2、利用银行家算法避免死锁

1.算法的数据结构

共有四个。分别是可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need。

 

2、银行家算法

前提:Requesti为进程Pi的请求向量,若Requsti[j]=k,表示进程Pi需要k个Rj类型的资源。

当Pi发出资源请求时,执行的步骤如下:

1. 若Requesti[j]<=Need[i,j],则转向步骤2;否则认为出错。因为所需资源数已经大于它所宣布的最大值。

2.若Requesti[j]<=Available[j],则转向步骤3;否则让Pi等待。因为因为所需资源数大于可用资源。

3.系统试探着把资源分配给进程Pi,并修改下面数据结构的值:

1)Available[j]=Available[j] - Requesti[j];

2)Allocation[i,j] = Allocation[i,j] + Requesti[j];

3)Need[i,j] = Need[i,j] - Requesti[j]。

4.执行安全性算法,若检测此次资源分配后系统处于安全状态,则正式分配;否则恢复原来的资源分配,让Pi等待。

 

3、安全性算法

数据结构:含有两个向量。

1)work。初值为Avaliable。表示系统可提供给进程继续运行所需的资源数目。它代替Available来找安全序列,使Available能保持初值。

2)Finish。表示系统是否能有足够的资源分配给进程。初始值finish[i]=false。

步骤:

1)从进程中找到满足finish[i] = false & Need[i,j] <= work[j] 的进程;若找到,执行步骤2,否则执行步骤3.

2)执行 work[j] = work[j] + Allocation[i,j];finish[i] = true;go to step 2;

3)若所有进程的finish[i]均为true,则表示系统处于安全状态,正式分配资源;否则作废。

 

3.8 死锁的检测和解除

3.8.1 死锁的检测

1、检测的必要条件

1)保存有关资源的请求和分配信息:资源分配图

2)提供一种算法,它利用这些信息来检测系统是否已进入死锁状态:死锁检测算法

 

2、资源分配图

                                                       

1.死锁定理

可利用资源分配图简化的方法,来检测当前系统处于S状态时,是否为死锁状态。简化方法如下:

1)在资源分配图中,找一个既不阻塞又非独立的额进程节点Pi。当其能够获取所需的资源时,释放所有资源,使之成为孤立节点。

2)P1释放完毕后,就到P2,一直到所有的节点都释放完毕。若能使所有节点都成为孤立节点(即图中的边全部都消掉),则称此时资源分配图可完全简化。这是S为死锁的充分条件。该充分条件称为死锁定理。(手动加粗)

PS:独立节点即为未申请任何资源的节点。

 

3.死锁检测中的数据结构

1)可利用资源向量Available。

2)把不占用资源的进程(向量Allocation=0)计入L表中,即Li∪L。

3)从进程中找到一个Requesti<=Work的进程,做如下处理:① 将其资源分配简化,释放资源,Work=Work+Allocationi。

② 将它计入L表中。

4)若不能把所有进程都计入L表中,说明该系统将发生死锁。

 

3.8.2 死锁的解除

1、常用方法

1)抢占资源 ;

2)终止或撤销进程:包括终止所有死锁进程和逐个终止进程。

 

2、付出代价最小的死锁解除算法

把状态S里面的所有进程终止,并分别把终止每个进程Pi的代价Ci纪录到Rc(T)中。再按照代价的大小,插入到由S状态所演变的新状态的队列L中。再从队列L中依次终止进程,直到死锁状态解除。此时,解除死锁状态的花费代价为:

R(S)min=min{Cui}+min{Cuj}+min{Cuk}+....

 

第四章 存储器管理

4.1.1 存储器的多层结构

 

 

4.2 程序的装入和链接

程序运行的前提步骤:编译,链接,装入。

1.编译:由编译程序对用户源程序进行编译,形成若干个目标模块。生成模块的逻辑地址。

逻辑地址:程序编译时还没装入主存,还不能确定它在主存中的实际位置。故地址都是从“0”(或某个地址)开始。

物理地址:程序在主存中的实际位置。

2.链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库链接在一起,形成一个完整的装入模块。

3.装入:由装入程序将装入模块装入内存。

 

4.2.1 程序的装入

有三种装入方式,分别是绝对装入方式、可重定位装入方式、动态运行时的装入方式。

1、绝对装入方式(Absolute Loading Mode)

运用场景:单道处理系统。

特点:逻辑地址与物理地址相同。

 

2、可重定位装入方式(Relocation)

运用场景:多道处理系统。

特点:逻辑地址与物理地址不同。又称为静态重定位,因为地址变换通常是在进程装入时一次完成的,以后不再改变。

 

3、动态运行时的装入方式(Dynamic Run-time)

运用场景:运行过程中内存的位置要经常改变的系统,例如具有对换功能的系统

特点:装入内存后的所有地址仍为逻辑地址,直到程序真正执行时才进行地址转换。

 

4.2.2 程序的链接

 

链接程序的功能即将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块。

1、静态链接

在程序运行之前,先将各目标模块以及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。

2、装入时动态链接

指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。

 

3、运行时动态链接

即将对某些模块的链接推迟到程序执行才进行。

 

4.3 连续分配存储管理方式

为了能将用户程序装入内存,必须给它分配一定大小的内存空间。连续分配方式即为一个用户程序分配一个连续的内存空间。

1、单一连续分配

分配方式:把内存分为系统区和用户区两部分,系统区仅提供给OS使用,放在内存的低地址部分。用户区则仅放一道用户程序,放在高地址部分。

使用场景:单用户、单任务操作系统

 

2、固定分区分配

分配方式:将整个用户空间划分为多个固定大小的区域。每个分区中只装入一道作业。有两种划分分区的方法,一种是分区大小相等,一种是不等。

为了便于内存分配,通常讲分区按大小排列,并建立一张分区使用表。

使用场景:多道程序系统

 

3、动态分区分配(可变分区分配)

其根据进程的需要,动态地为之分配内存空间。

 

1. 数据结构

空闲分区表:此表用于记录空闲分区的情况。包括分区号、分区大小和分区始址等数据项。

空闲分区链:所有的空闲分区链接成一个双向链。

 

2. 动态分区算法

可分为顺序式搜索算法和索引式搜索算法。在下一节中详细介绍。

 

3. 分区分配操作

主要分为分配内存和回收内存。(具体在书P129查看)

 

4.3.4 基于顺序搜索的动态分区分配算法

1、首次适应算法(FF)

其要求空闲分区链以地址递增的次序链接。分配内存时,从链首开始查找,直到找到一个大小能满足要求的空闲分区为止。若找不到,则分配失败。

优缺点:其保留了高地址的大空闲区,但是低地址部分留下许多难以利用的空闲碎片。

 

2、循环首次适应算法(NF)

从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个满足的空闲分区为止。若到最后一个空闲分区都不满足,则重新回到第一个空闲分区顺序查找。

优缺点:其能使内存中的空闲分区更均匀,减少了查找空闲分区时的开销,但是会缺乏大的空闲分区。

 

3、最佳适应算法(BF)

该算法要求将所有的空闲分区按照容量从小到大的顺序形成空闲分区链来顺序查找。

优缺点:能够避免“大材小用”,但是会留下许多空闲碎片。

 

4、最坏适应算法(WF)

其与最佳适应相反,它总是挑选一个最大的空闲分区来分割给作业使用。

优缺点:使剩下的空闲分区不至于太小,对中、小作业有利,但是使得存储器缺乏大的空闲分区。

 

4.3.5 基于索引搜索的动态分区分配算法

1、快速适应算法(QF)

又称为分配搜索法。其将所有容量相同的空闲分区分类,单独设立一个空闲分区链表,这样系统中就存在多个空闲分区链表。同时,内存中设立一张管理索引表。每一个索引表项对应一种空闲分区类型。

分配过程:根据进程的长度,从索引表中寻找能容纳它的最小空闲区链表;从链表中取下第一块进行分配即可。

优缺点:能保留大分区,也不产生碎片,且查找效率高。但是归还主存时算法复杂,且分配空闲分区时以进程为单位,会浪费空间。这是典型的以空间换时间的做法。

 

*2、伙伴系统(现有操作系统使用的分配方法)

 

 

3、哈希算法

它利用哈希快速查找的优点,构造一张以空闲分区大小为关键字的哈希表,该表的每一项都对应了一个空闲分区链表表头。

分配过程:根据所需空闲分区大小,利用哈希函数计算,得到在哈希表中的位置,从而找到对应的空闲分区链表,实现最佳分配策略。

 

4.3.6 动态可重定位分区分配

 

1、 紧凑

为了解决内存碎片得不到利用的问题,出现了“紧凑”的做法。

含义:通过移动内存中作业的位置,把多个分散的小分区拼接成一个大分区的方法。

不足:每次“紧凑”后,都要对程序或数据重定位。大大影响系统效率。

 

2、动态重定位(解决紧凑的不足)

含义:地址变换过程推迟到了程序执行期间,随着对每条指令和数据的访问自动进行。当系统对内存进行了“紧凑”后,不需对变换位置的程序做任何修改,只需让该程序在内存的新起始地址置换原来的起始地址即可。

 

3、动态重定位分区分配算法

它与动态分区分配算法大致相同,差别仅在于增加了紧凑功能。

若该算法找不到一个足够大的空闲分区时,就要对内存进行紧凑,若仍找不到,则返回分配失败信息,否则分配。

 

*4.4 分页存储管理方式(现有系统使用)

 

为了解决“紧凑”的开销问题,产生了离散分配方式。即允许一个进程分散地装入到许多不相邻接的分区。离散方式又分为三种,分别是分页存储管理方式、分段存储管理方式、段页式存储管理方式。

 

4.4.1 分页存储管理的基本方法

1、页面和物理块

1)页面:用户程序的地址空间分为若干个固定大小的区域,称为“页”或页面。

2)页面大小:若选择的页面大小过小,可减少内存碎片,但可能会导致页表过长,占用内存多;若选择过大,可提高页面换进换出的速度,但会使页碎片增大。页面大小应是2的幂,通常为512B-8KB。

3)块:内存的物理空间分成若干个块。在为进程分配内存时,以块为单位。

 

*2、地址结构

它包含页号P和位(偏)移量W(页内地址)。对某特定机器,其地址结构是一定的。

若给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d可按下式求得:

P = INT[A/L],d = [A] MOD L.

例如,其系统的页面大小为1KB,设A=2170B,则P=2,d=122.

 

3、页表

每个进程都有一个页表。

作用:实现从页号到物理块号的地址映射。

组成:页号和内存中对应的物理块号。

 

4.5.2 地址变换机构

该机构的基本任务是实现从逻辑地址到物理地址的转换,实际上是将逻辑地址中的页号转换为内存中的物理块号。地址变换是借助于页表实现的。

物理地址=块号×页面大小+页内位移

*1、基本的地址变换机构

由于地址变换非常频繁,故需要用硬件实现。页表功能则是由一组页表寄存器实现的。由于页表很大,平时放在内存,故不可能都用寄存器实现,所以一个页表对应一个页表寄存器(PTR)。

页表寄存器:包括了页表始址和页表长度。平时在系统中只有一个PTR,因为进程未执行时,页表始地址和长度都放在进程的PCB中,只有当程序调度到某进程时,才把他们放进PTR。

*变换过程:当进程访问某个逻辑地址中的数据时,改机构会自动将有效地址分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。执行检索之前,比较页号和页表长度,若页号大于等于页表长度,则产生地址越界中断;否则根据块号X页面大小得到该页的物理块号,装入物理地址寄存器,同时,将页内地址送到物理地址寄存器的块内地址字段中(因为页内地址=物理块内地址),这样就完成了地址变换了。

 

2、具有快表的地址变换机构

CPU在存取数据时,要访问两次内存。第一次,从页表中取出地址,第二次,到内存指定的地址中取数据。

故为了提高访问效率,使用了块表。

快表:一个具有并行寻查能力的告诉缓冲寄存器,又称为“联想寄存器”,在IBM系统中又叫TBL。它用来存放当前访问的那些页表项。

 

 

4.5.3 访问内存的有效时间(Effective Access Time)

内存的有效访问时间:从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址并取出数据,所需要花费的总时间。

现假设一次访问内存的时间为t,设EAT为在基本分页存储管理系统中:EAT = 2t

在引入快表的分页存储管理系统中,设a为快表的命中率,r为查找快表锁需的时间:EAT =a*r+(1-a)(t+r) = 2t+r-txa

 

4.5.4 两级和多级页表 

* 1、两级页表

解决问题:难于找到大的连续内存空间存放页表。注意,并未解决用较少的内存空间存放页表。

存放方式:将页表进行分页,使每个页面的大小与内存物理块的大小相同,并为它们进行编号,然后离散地将各个页面分别存放在不同物理块中。同时,为每个离散分配的页表再建立一张页表,称为外层页表,在每个页表项中纪录了页表页面的物理块好。

逻辑地址结构:

外层页号存放的是

 

地址变换机构:

外部页表中存的是指定页面分页的始址,每个分页页表内存放的是页表项所对应的物理块号。

地址变换的实现:增设一个外层页表寄存器(只需要一个,因为只有当页表需要用时才把它放进寄存器),用于存放页表分页的始址,再利用外层页内地址作为指定页表分页的索引,找到指定的页表项,其中含有该页在内存中的物理块号,即可变换到实际的物理地址。

 

4.6. 分段存储管理方式

引入的原因:方便编程、信息共享、信息保护、动态增长、动态链接。

 

4.6.1 分段系统的基本原理

1、分段

含义:在分段式存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序X等。每个段均有自己的名字。 且每个段的长度并不相等。

段的逻辑地址结构:

 

2、段表

背景:系统为每个分段分配一个连续的分区,进程中的各个段,可以离散地装入内存中不同的分区。即,段内连续,段间离散

作用:与页表相似,都是用于实现从逻辑地址到物理地址的映射。

段表结构:包括短号,段长和基址(该段在内存中中的起始地址)。其一般放在内存中中。

 

3、地址变化结构(类似分页系统)

类似分页系统,CPU每访问一个数据,都要访问内存两次

“分段系统的地址变换过程”的图片搜索结果

 

 

4、分页和分段的主要区别

1.页是信息的物理单位。采用分页存储系统方式是为了实现离散分配方式,消除外零头(页间的碎片),提高内存利用率;段是信息的逻辑单位,分段的目的主要在于能更好地满足用户的需求。

2.页的大小固定且由系统决定;段的长度不固定,取决于其信息的性质。

3.分页的用户程序地址空间是一维的,它是系统行为;分段的用户程序地址空间是二维的,程序在识别一个地址时,即需给除段名,又需给出段内地址。

 

4.6.3 信息共享

 分段系统区别于分页系统的优点:分段能实现段的共享,它能更方便地实现对数据和程序的共享

 

4.6.4 段页式存储管理方式

该系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等优点,又能像分页系统一样,很好地解决内存的外部碎片问题。

 

1、基本原理

先把用户程序分为若干个段,再把每个段分为若干个页,并为每一个段赋予一个段名。

地址结构:包括短号、段内页号、页内地址。

段表:与单纯的分段系统不同,它保存的是页表始址和页表长度。

利用段表和页表实现地址映射:

 

 

2、地址变换过程

CPU取得一条指令或数据,需要访问三次内存。第一次是访问段表,获得页表始址;第二次是访问页表,获得物理块号;第三次是访问物理地址取得数据。

显然效率很低,为了提高效率,增加了一个高速缓冲寄存器(里面存放经常访问的段号和页号)。每次访问它时,都需同时利用页号和段号访问高速缓存,若找不到再单独访问段表和页表。

 

 

 

4.7 对换(Swapping)

4.4.1 多道程序环境下的对换技术

1、对换的引入

含义:是指把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,以便腾出足够的空间,再把已具备运行条件的进程或进程所需要的程序和数据换入到内存中。

作用:提高处理机的利用率和系统吞吐量。

 

2、对换的类型

整体对换:又称为进程对换,其被作为处理机中级调度。

页面(分段)对换:对换的对象为页面或者段。又称为部分对换。其目的是为了支持虚拟存储系统。

 

为了实现进程对换,系统必须实现三方面的功能:对对换空间的管理、进程的换出和换入。

 

4.4.2 对换空间的管理

1、对换空间管理的主要目标

在具有对换功能的OS中,通常把磁盘空间分为文件区和对换区。

对文件区:采取离散分配方法。

对对换区:目的是提高进程换入换出的速度,故采取连续分配方式,较少考虑外存中的碎片问题。

 

2、对换区空闲盘块管理中的数据结构

其数据结构与内存在动态分区分配方式中所用的数结构相似,即可用空闲分区表或者空闲分区链。空闲分区表中应包含:对换区的首址和其大小,分别用盘块号和盘块数表示。

 

3、对换空间的分配与回收

与动态分区方式时的内存分配与回收方法雷同。

 

4.4.3 进程的换入与换出

1、进程的换出

可分为两个步骤,选择被换出的进程,进行换出。

1.选择被换出的进程:检查所有在内存的进程,首先选择处于阻塞或者睡眠状态的进程,若有多个,选择优先级最低的。若无此类进程,则选择就绪中优先级最低的进程。

2.换出过程:首先申请换出空间,申请成功,则启动磁盘,将该进程非共享的程序和数据段传送到磁盘,若传送未出现错误,则可回收该进程的内存空间,并修改相应的PCB和内存分配表。一直持续该过程直到内存中再无阻塞进程。

 

2、进程的换入

对换进程将定时执行换入操作。

首先查看PCB集合中所有进程的状态,选择”就绪“状态但已换出的进程,选择换出时间最长的进程,为它申请内存,若申请成功,可直接将进程从外存调入内存;若失败,则先换出,再换入。一直持续换出动作直到再无可换出进程或者无内存。

 

第五章 虚拟存储器

5.1 虚拟存储器概述

虚存解决的问题:从逻辑上扩充内存容量

 

5.1.1 常规存储管理方式的特征和局部性原理

1、常规存储器管理方式的特征

一次性:作业必须一次性地全部装入内存才可以开始运行,当程序大于内存时无法运行。

驻留性:作业被装入内存后,整个作业都一直驻留在内存中。处于等待状态的进程也是。

 

2、局部性原理

1. 程序运行时,除少部分的转移和过程调用指令,大部分都是顺序执行的。

2.过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域,但经研究看出过程调用的深度在大多数情况下都不超过5.

3.程序中包括许多循环结构,它们都将会被多次执行。

4.程序中包括许多对数据结构的处理,如数组,这些处理也会被局限于很小的范围内。

 

2、时间局限性和空间局限性

时间局限性

1.含义:若程序中的某条指令被执行,则不久后该指令可能再次执行;若某数据被访问过,则不久后该数据可能被再次访问。

2.产生原因:循环操作。

 

空间局限性

1.含义:程序在一段时间内所访问的地址可能集中在一定范围之内,典型情况是程序顺序执行。

 

3、虚拟存储器的基本工作情况

程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去;若程序执行所要访问的段(页)未调入内存(称为缺段或缺页),则发出缺段(页)请求,此时OS将利用请求调段(页)功能将它们调入内存,使程序继续运行下去。若内存已满,则OS还须利用段(页)的置换功能,将内存中暂时不用的段(页)调至盘上,腾出足够的空间,再将所需的段(页)调入内存。

 

5.1.2 虚拟存储器的定义和特征

1、定义

所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统

其逻辑容量由内存和外存之和决定,其运行速度接近于内存速度,每位的成本又接近于外存。

逻辑容量决定举例:例如32位的操作系统,只能编写最多2的三十二次方(4G)的程序。

 

2、虚拟存储器的特征

多次性:一个程序运行被分成多次调入内存运行。多次性虚拟存储系统是区别于其他存储管理方式的最重要特征。

对换性:程序运行在作业的运行过程中进行换进、换出。

多次性和对换性建立在离散分配的基础上。

虚拟性:指能从逻辑上扩充容量。其以多次行性和对换性为基础。

 

5.1.3 虚拟存储器的实现方法

1、分页请求系统/页式虚拟存储系统/请求分页系统

该系统是在分页系统的基础上增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。

硬件支持:请求分页的页表机制、缺页中断机构、地址变换机构。

软件支持:包括有用于实现请求调页的软件和实现页面置换的软件。

 

2、请求分段系统(名称同上)

该系统是在分段系统的基础上增加了请求调段和分段置换功能所形成的段式虚拟存储系统。

硬件支持:请求分段的段表机制、缺段中断机构、地址变化机构。

软件支持:包括用于实现请求调段和实现段置换的软件。

 

区别:页的大小是固定的,段的大小是不固定的,故分页请求系统的换入和换出实现较容易。

 

5.2 请求分页存储管理方式

1、请求页表机制

页表字段共6个,分别为页号、物理块号、状态位P、访问字段A、修改位M、外存地址。

状态位P:占1位,为1表示该页已调入内存,反之为0.

访问字段A:记录本页在一段时间内被访问的次数。提供给置换算法(程序)在选择换出页面时参考

修改位M:标志该页在调入内存后是否被修改过。若已被修改,则需将该页重新写到外存上。提供给置换页面时参考

 

2、缺页中断机构

特殊店:在内存执行期间产生和处理中断信号、一条指令在执行期间可能产生多次缺页中断。

 

3、地址变换机构

PS :有图的第一个判断应该是页号 >= 页表长度(因为页号是从0开始的)

“分页请求系统中的页表”的图片搜索结果

 

5.2.2 请求分页中的内存分配

1、最小物理块数的确定

含义:最小物理块数指能保证进程正常运行所需的最小物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行。

与什么有关:指令的格式、功能和寻址方式。

 

2、内存分配策略

在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略。在进行置换时,也可采取两种策略,即全局置换和局部置换。故可组合得三种策略。

固定分配:为每个进程分配一组固定数目的物理块

可变分配:先为每个进程分配一定数目的物理块,在进程运行期间可作调整。

局部置换:如果进程在运行时发现缺页,则只能从分配给该进程的n个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变。

全局置换:如果进程在运行中发现缺页,则将OS锁保留的空闲物理块取出一块分配给该进程,或者以所有进程的全部物理块为标的,选择一块换出,然后将所缺之页调入。

没有固定分配全局置换的原因:若分配的物理块是全局的,则不能固定分配了,因为这是进程共享的物理块。

1. 固定分配局部置换(Fixed Allocation,Local Replacement)

实现难点:难以确定为每个进程分配多少个物理块。若太少,会频繁出现缺页中断,降低系统吞吐量;若太多,又必然使内存中驻留的进程数目减少,进程可能造成CPU空闲或其他资源空闲的情况。

 

2、可变分配全局置换

采用这种策略,凡产生缺页中断的进程,都将获得心的物理快。故其他进程的缺页率会增加。

 

3、可变分配局部置换

缺页时只会从该进程在内存中的页面选择一页换出,不影响其他进程。若频繁缺页,则系统再为其额外增加物理块,否则减少物理块。

 

3、物理块分配算法

解决在使用固定分配策略时,如果将系统中可供分配的所有物理块分配给各个进程。

平均分配算法:顾名思义。但其可能会造成某些物理块具有很高的缺页率。

按比例分配算法:根据进程的大小按比例分配物理块。

考虑优先权的分配算法:优先权分配更多。通常的做法是,一部分按比例,一部分按优先权分配。

 

5.2.3 页面调入策略

1、何时调入页面

预调页策略:将那些预计在不久之后便会被访问的页面预先调入内存。目前成功率仅为50%。

请求调页策略:当进程在运行中需要访问某部分程序和数据时,发现其所在的页面不在内存,则立即提出请求,由OS调入内存。目前的虚拟存储器大多采用此策略。但此策略每次仅调入一页,系统开销较大,增加了磁盘I/O的启动频率。

 

2、从何处调入页面

考虑对换区和文件区的外存分配方式,分为以下三种情况。

系统有足够的对换区空间时:全部从对换区调入所需页面。

系统缺少足够的对换区空间:凡是被不会被修改的文件,直接从文件区调入。反之,则先调到对换区,再从对换区调入。

(因为要重写到磁盘,即做换出操作)

UNIX方式:由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。对于曾经运行过但又被换出的页面,由于被放在对换区,故调入时应从对换区调入。且UNIX允许页面共享,故某进程锁请求的页可能已被其他进程调入内存,此时无需调入。

 

3、页面调入过程

看上图

 

4、缺页率

f=访问页面失败次数/访问总次数

相关因素:页面大小、进程所分配物理块、页面置换算法、程序固有特性。

 

5.3 页面置换算法

页面置换算法即为选择换出页面的算法。一个好的页面置换算法应具有较低的页面更换频率。

 

5.3.1 最佳置换算法和先进先出算法

1、最佳(Optimal)置换算法(向未来看)

这是一种理论算法。其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再访问的页面。其可保证获得最低的缺页率。

 

2、先进先出(FIFO)页面置换算法

淘汰最先进入内存的页面。实现简单,不用硬件支持,但是效果不好

 

5.3.2 最近最久未使用和最少使用置换算法

1、最近最久未使用算法(Least Recently Used)(向过去看)

选择最近最近未使用的页面予以淘汰。

不足:需要较多的硬件支持。每个内存中的页面都要配置一个移位寄存器。且需要用栈保存当前使用的各个页面的页面号。

 

3、最少使用置换算法(Least Fequently Used)

选择在最近使用最少的页面淘汰。其使用了移位寄存器,但是由于存储器具有较高的访问速度,在1ms内可能访问成千上万次,故用计数器不现实,只能用一个较大的时间间隔来纪录对某页的访问。故该算法不能能真正反应页面的使用情况,因为在某时间间隔内,对某页访问一次和1000次可能是完全等效的。

 

5.3.3 Clock置换算法/最近未用算法(Not Recently Used)

1、简单的Clock置换算法

其为每页设置一位访问位,将内存中所有的页面通过链接指针链接成一个循环队列。检查页面顺序为FIFO。与上相比,该算法无需硬件支持。过程如下图:

“Clock置换算法流程”的图片搜索结果

 

2、改进型Clock算法

在基本Clock算法基础上,增加置换代价的考虑。由访问位A和修改位M组成下面四种类型的页面:

1类(A=0,M=0):表示该页面最近既未被访问,又未被修改,是最佳淘汰页。

2类(A=0,M=1):表示该页最近未被访问,但已被修改,并不是很好的淘汰页。(故淘汰优先级,1类>2类)

3类(A=1,M=0):表示最近都已被访问,但未被修改,该页有可能再次被访问。

4类(A=1,M=1):表示最近已被访问且被修改,该页可能再被访问。

(算法具体步骤太长了,看书P167)

该算法与简单Clock比较,可减少磁盘的I/O次数,但是算法为了找到可置换页可能要经过几轮的扫描,故本身的开销有所增加。

 

5.3.4 页面缓冲算法(自学)

1、影响页面换进换出效率的因素

页面置换算法、写回磁盘频率、读入内存频率。

 

2、页面缓冲算法PBA

特点:显著地降低了页面换出、换进的频率,使磁盘I/O的操作次数大大减少,因而减少了页面换进、换出的开销;由于换入换出的开销大大减少,使其能使用一种较简单的置换策略,如FIFO。

下面介绍的是VAX/VMS操作系统中所使用的页面缓冲算法:

内存分配策肋采用了可变分配和局部置换方式。系统为每个进程分配一个数目的物理块,内存自己保留一部分空闲物理块。其在内存中设置了空闲页面链表和修改页面链表。

空闲页面链表:当进程读入一个页面,用该链表的第一个物理块来装入此页,当有一个未修改的页要换出时,把它们所在的物理块挂在空闲链表的末尾。这样可免除从磁盘读入数据的操作,减少页面开销。

修改页面链表:当进程需要将一个已修改的页面换出时,把它所在物理快挂在修改页面链表的末尾。可降低将该页面写回磁盘的频率,降低将磁盘内容读入内存的频率。

 

5.4 “抖动”与工作集

1、产生抖动原因

同时在系统中运行的进程太多,分配给每一个进程的物理块太少,导致进程运行时频繁出现缺页,必须请求系统将所缺之页调入内存。

 

2、工作集

1、基本概念

基于局部性原理,程序运行期间,可能访问仅局限于一些较少的页面,这些页面被称为活跃页面。若能够预知程序在某段时间间隔内要访问哪些页面,并将它们调入内存,将会大大降低缺页率,显著提高处理机的利用率。

2、定义

所谓工作集,是指在某段时间间隔▲里,进程实际所要访问的页面集合。某进程在时间t的工作集记为w(t,▲),其中的变量▲称为工作集的“窗口尺寸”。

 

3、“抖动”的预防方法

1.采取局部置换策略

2.把工作集算法融入到处理机调度中

3.利用“L=S”准则调节缺页率

4.选择暂停某些当前活动的进程

 

5.新增新增新增新增新增新增新增新增新增新增新增新增新增新增。)、《》<edafadf>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值