操作系统笔记合集

第一章:计算机系统概述

一:操作系统的基本概念

  • 操作系统的概念

计算机系统的层次结构:(自下而上)硬件、操作系统、应用程序(软件)、用户。

操作系统的功能:负责管理协调硬件、软件等计算机资源的工作;为上层的应用程序、用户提供简单易用的服务;操作系统是系统软件,而不是硬件。

操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件

  • 操作系统的特征

并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。

共享:资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。(互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,一个时间段内只允许一个进程访问该资源   同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问)

虚拟:是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是实际存在的,而逻辑上对应物是用户感受到的。

异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进。

并发和共享互为存在条件

没有并发和共享,就谈不上虚拟和异步,因此并发和共享是操作系统的两个最基本的特征

  • 操作系统的功能

作为系统资源的管理者:(功能)处理机管理、存储器管理、文件管理、设备管理。(目标)安全、高效。

作为用户和计算机硬件之间的接口:(功能)[联机、脱机]命令接口、程序接口、GUI/图形用户界面。

{用户接口

命令接口:允许用户直接使用。联机命令接口:用户说一句,系统做一句。  脱机命令接口:用户说一堆,系统做一堆。

程序接口:允许用户通过程序间接使用。由一堆系统调用组成。 程序接口=系统调用=系统调用命令=广义指令。}

作为最接近硬件的层次:实现对硬件机器的拓展。

二:操作系统的发展与分类

  1. 手工操作阶段
  2. 批处理阶段—单道批处理系统
  3. 批处理阶段—多道批处理系统(资源利用率大幅度提升)
  4. 分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,多个用户可通过终端与计算机交互。主要优点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户服务一个时间片。
  5. 实时操作系统:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。(及时性和可靠性)[硬实时系统:必须在绝对严格的规定时间内完成处理][软实时系统:能接受偶尔违反时间规定]
  6. 其他几种操作系统:网络操作系统、分布式操作系统、个人计算机操作系统。

三:操作系统的运行环境

  • 操作系统的运行机制

指令”处理器(CPU)能识别、执行的最基本命令

——特权指令:不允许用户程序使用

——非特权指令

处理器状态

——用户态(目态)只能执行非特权命令

——核心态(管态)

程序

——内核程序:操作系统的内核程序是系统的管理者,既可以执行特权命令,也可以执行非特权指令,运行在核心态

——应用程序:为了保证系统安全运行,只能执行非特权指令,运行在用户态

内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。

实现操作系统内核功能的那些程序就是内核程序

原语:是一种特殊的程序;处于操作系统最底层,最接近硬件的部分;这种程序的运行具有原子性—只能一气呵成,不可中断;运行时间较短、调用频繁。

  • 中断和异常

为了解决系统资源利用率低的问题,发明了操作系统引入中断机制,实现了多道程序并发执行。

本质:发生中断就意味着需要操作系统介入,开展管理工作。

中断过程:

当中断发生时,CPU立即进入核心态

当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理

对于不同的中断信号,会进行不同的处理

用户态、核心态之间的切换是怎么实现的?

用-->核:只能通过中断

核-->用:执行一个特权指令,将程序状态字PSW标志位设置为“用户态”

中断:(王道)

内中断(异常、例外、陷入):自愿中断(指令中断);强迫中断:硬件故障、软件中断;

外中断:外设请求;人工干预。

中断:

内中断(内部异常):陷阱、陷入;故障;终止。

外中断:I/O中断请求;人工干预。

外中断的处理过程:

  1. 执行完每个指令之后,CPU都要检查当前是否有外部中断信号;
  2. 如果检测到外部中断信号,保护被中断进程的CPU环境(PSW、PC、各种通用寄存器);
  3. 根据中断信号类型转入相应的中断处理程序;
  4. 恢复原进程的CPU环境并退出中断,返回原进程继续往下执行。
  • 系统调用

按功能分类:设备管理、文件管理、进程控制、进程通信、内存管理。

过程:传递系统调用参数à执行陷入指令[唯一一个只能在用户态执行的指令](用户态)à执行系统调用相应服务程序(核心态)à返回用户程序

四:操作系统的体系结构

  • 大内核:将操作系统的主要功能模块都作为系统内核,运行在核心态。 优点:高性能。  缺点:内核代码庞大,结构混乱,难以维护。
  • 微内核:只把最基本的功能保留在内核。 优点:内核功能少,结构清晰,方便维护。  缺点:需要频繁的在核心态和用户态之间切换,性能低。

第二章:进程管理

一:进程与线程

  • 进程的概念和特征

引入多道程序技术之后,为了方便操作系统管理,完成个程序并发执行,引入了进程、进程实体的概念。

系统为每个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息

程序段、数据段、PCB三部分组成了进程实体。创建进程就是创建PCB,撤销进程就是撤销PCBPCB是进程存在的唯一标志。

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

进程是动态的、进程实体是静态的。

程序段:存放要执行的代码。

数据段:存放程序运行过程中处理的各种数据。

PCB:{进程描述信息[进程标识符PID、用户标识符UID]、

进程控制和管理信息[进程当前状态、进程优先级]、

资源分配清单[程序段指针、数据段指针、键盘、鼠标]、

处理剂相关信息[各种寄存器值]}

进程的组织方式:链接方式[按照进程状态将PCB分为多个序列、操作系统持有指向各个队列的指针]、索引方式[根据进程状态的不同,建立几张索引表、操作系统持有指向各个索引表的指针]

进程的特征:

动态性(最基本的特征):进程是程序的一次执行过程,是动态地产生、变化和消亡的;

并发性:内存中有多个进程实体,各进程可并发执行;

独立性:进程是能独立运行、独立获取资源、独立接受调度的基本单位;

异步性:各进程按各自独立的不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题;

结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。

  • 进程的状态与转换

进程的三种基本状态:

运行态:占有CPU,并运行;

就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行;

阻塞态:因等待某一事件而暂时不能运行。

另外两种状态:创建态(新建态)、终止态(结束态)。

进程状态间的转换:

就绪-->运行:进程被调度

运行-->就绪:时间片道,或CPU被其他高优先级的进程抢占

运行-->阻塞:等待系统资源分配,或等待某事件发生(主动行为)

阻塞-->就绪:资源分配到位,等待的事件发生(被动行为)

创建-->就绪:系统完成创建进程相关的工作

运行-->终止:进程运行结束,或运行过程中遇到不可修复的错误

  • 进程控制

主要功能是对系统中的所有进程实施有效的管理,有创建新进程、撤销已有近程、实现进程状态转换等功能。

用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。不可被中断的操作即原子操作。“关中断指令”“开中断指令”

进程状态转换相关原语,无非做三类事情:

  1. 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)[所有的进程控制原语一定都会修改进程状态标志;剥夺当前运行进程的CPU使用权必然需要保存其运行环境;某进程开始运行前必然要恢复其运行环境]
  2. 将PCB插入合适的队列
  3. 分配回收资源

进程的创建:

创建原语(申请空白PCB、为新进程分配所需资源、初始化PCB、将PCB插入就绪队列)

引起进程创建的事件(用户登录、作业调度、提供服务、应用请求)

进程的终止:

撤销原语(从PCB集合中找到终止进程的PCB、若进程正在运行,立即剥夺CPU,将CPU分配给其他进程、终止其所有进程、将该进程拥有的所有资源归还给父进程或操作系统、删除PCB)

引起进程终止的事件(正常结束、异常结束、外界干预)

进程的阻塞和唤醒:

进程的阻塞(阻塞原语[找到要阻塞的进程对应的PCB、保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行、将PCB插入相应事件的等待队列]、引起进程阻塞的事件[需要等待系统分配某种资源、需要等待相互合作的其他进程完成工作])

进程的唤醒(唤醒原语[在事件等待队列中找到PCB、将PCB从等待队列移除,设置进程为就绪态、将PCB插入就绪队列,等待被调度]、引起进程唤醒的事件[等待事件发生])

进程的切换:

切换原语(将运行环境信息存入PCB、PCB移入相应队列、选择另一个进程执行,并更新其PCB、根据PCB恢复新进程所需的运行环境)

引起进程切换的事件(当前进程时间片到、有更高优先级的进程到达、当前进程主动阻塞、当前进程终止)

  • 进程的通信

共享存储

基于数据结构的共享:比如共享空间里只能放一个长度为10的数组,这种共享方式速度慢、限制多,是一种低级通信方式

基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式

管道通信:用于连接读写进程的一个共享文件。其实就是在内存中开辟一个大小固定的缓冲区

管道只能采用半双工通信,某一时间段内只能实现单向传输,如果要实现双向同时通信,则需要设置两个管道;

各进程要互斥地访问管道;

数据以字符流的形式写入管道,写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程read()将数据全部取走后,管道变空,读进程将被阻塞;

如果没写满,就不允许读。如果没读空,就不允许写;

数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

消息传递:进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送、接收消息”两个原语进行数据交换

直接通信方式:直接挂到接收进程的消息缓冲队列上;

间接通信方式:消息先发到中间体(信箱)

  • 线程概念和多线程模型

引入线程后,进程只作为除CPU外的系统资源的分配单元。

线程属性

是处理机调度的单位;

多CPU计算机中,多个线程可占用不同的CPU;

每个线程都有一个线程ID、线程控制块TCB;

线程也有就绪、阻塞、运行三种基本状态;

线程几乎不拥有系统资源;同一进程的不同线程间共享进程的资源;

由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预;

同一进程中的线程切换,不会引起进程切换;

不同进程中的线程切换,会引起进程切换;

切换同进程内的线程,系统开销很小;

切换进程,系统开销较大。

线程的实现方式

用户级线程:线程切换在用户态即可完成。对用户不透明,对操作系统透明。

内核级线程:由操作系统内核完成。内核级线程的切换必然需要在核心态下才能完成。对用户透明。

在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式,将n个用户级线程映射到m个内核级线程上。(n>=m)

多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级进程。 优点:用户级线程的切换在用户空间即可完成,线程管理的系统开销小,效率高。  缺点:当一个用户级进程被阻塞,整个进程就会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。  优点:当一个线程被阻塞,别的线程还可以继续进行,并发能力强。多线程可在多处理机上并行执行。  缺点:一个用户进程会占用多个内核级线程,线程切换由系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对多模型:n用户级线程映射到m个内核级线程。克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

二:处理机调度

  • 处理机调度概念、层次

高级调度(作业调度):辅存(外存)与内存之间的调度。每个作业只调度一次,调出一次。作业调入时会建立相应的PCB,作业调出时撤销PCB。

中级调度:将暂时不能运行的进程调至外存等待。等它具备了运行条件且内存又空闲,重新调入。调出时PCB会留在内存。暂时调到外存等待的进程状态为挂起状态。被挂起进程的PCB会被放到挂起队列中。

进程的挂起态与七状态模型

低级调度(进程调度):主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。最基本的调度。

  • 调度的时机、切换与过程

需要进行进程调度:当前运行的进程主动或被动放弃处理机。

不能进行进程调度的情况:处理中断;进程在操作系统内核程序临界区中;原子操作过程中。

临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(各就绪进程的PCB组成)

非剥夺调度方式(非抢占方式):只允许进程主动放弃处理机。系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。

剥夺调度方式(抢占方式):适合于分时操作系统、实时操作系统。

“狭义的进程调度”指的是从就绪队列中选中一个要运行的进程。

进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。

广义的进程调度包含了选择一个进程和进程切换两个步骤。

进程切换的过程主要完成:对原来运行进程各种数据的保存;对新的进程各种数据的恢复。

  • 调度算法的评价指标

CPU利用率:指CPU“忙碌”时间占总时间的比例。

系统吞吐量:单位时间内完成作业的数量。

周转时间:从作业被提交给系统开始,到作业完成为止的时间间隔。(作业在外存后备队列上等待作业调度的时间+进程在就绪队列上等待的时间+进程在CPU上执行的时间+进程等待I/O操作完成的时间)

平均周转时间:各作业周转时间之和/作业数。

带权周转时间:作业周转时间/作业实际运行时间。

平均带权周转时间:各作业带权周转时间之和/作业数。

等待时间:指进程、作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

对于进程:等待时间就是指进程建立后等待被服务时间之和,在等待I/O完成的期间其实进程也是在被服务的,不计入等待时间。

对于作业:不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间。

响应时间:从用户提交请求到首次产生响应所用的时间。

  • 调度算法

下面三种都用于作业调度和进程调度

先来先服务FCFS:非抢占式,不会导致饥饿 (优点:公平、算法实现简单。 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。)

短作业优先SJF:有抢占式(SRTN最短剩余时间优先算法)和非抢占式,在所有进程几乎同时到达/同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少,如果不断有短作业到来,长作业会“饥饿” (优点:“最短的”平均等待时间、平均周转时间  缺点:不公平。对短作业有利,长作业不利。另外,作业/进程运行时间是由用户提供的,并不一定真实,不一定能做到短作业优先)

高响应比优先HRRN:综合考虑作业/进程的等待时间和要求服务时间。响应比=等待时间+要求服务时间要求服务时间。非抢占式。不会导致饥饿  (优缺点:综合考虑了等待时间和运行时间(要求服务时间),等待时间相同时,要求服务时间短的优先,服务时间相同,先来的优先)

算法

抢占?

优点

缺点

考虑等待时间&运行时间?

饥饿

FCFS

公平、实现简单

对短作业不利

等待时间

不会

SJF/SPF

都有

“最短”平均等待/周转时间

对长作业不利

运行时间

HRRN

上述的权衡折中

等待+运行时间

不会

时间片轮转(RR:公平、轮流地为各个进程服务。按到达顺序让进程都执行一个时间片,用完重新排队。用于进程调度。抢占式。不会饥饿。 (优点:公平、响应快,适用于分时操作系统; 缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度)

优先级调度算法:设置优先级。用于作业和进程调度。抢占式非抢占的都有。会饥饿。 (优点:用优先级区分紧急程度、重要程度,适用于实时操作系统。 缺点:若不断有高优先级进程到来,可能导致饥饿)

多级反馈队列调度算法:对其他算法折中权衡。用于进程调度。抢占式。会饥饿。  思想:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。新进程到达先进入第1级队列,按FCFS原则等待分配时间片。若用完进程还未结束,则进程进入下一级队列队尾。若已经是最下级,则放入本级队尾。只要当k级队列为空,才会对k+1级队头进程分配时间片  (优缺点:对各类型进程相对公平,每个新到达的都可以很快得到响应,短进程用时少,不必实现估计进程的运行时间,可将因I/O而阻塞的进程

算法

抢占?

优点

缺点

饥饿

时间片

公平,适用于分时系统

频繁切换有开销,不区分优先级

不会

优先级

都有

区分优先级,适用于实时系统

饥饿

多级

平衡优秀

重新防回原队列,I/O型进程就可以保持较高优先级)

三:进程同步

  • 进程同步、互斥

同步亦指直接制约关系,为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。直接制约关系源于它们之间的相互合作。

临界资源:一个时间段内只允许一个进程使用的资源。

对临界资源的互斥访问,可以在逻辑上分为:进入区、临界区、退出区、剩余区四个部分。

互斥访问原则

  1. 空闲让进;
  2. 忙则等待;
  3. 有限等待;
  4. 让权等待。
  • 进程互斥软件实现方法

单标志法:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。主要问题是:违背“空闲让进”原则

双标志先检查法:标记进入临界区的意愿,检查对方想进入就等待,不想则改变标记位,进入。主要问题:违背“忙则等待”原则。因为进入区的检查和上锁不是一气呵成的。

双标志后检查法:先改变自己的标记,再判断对方是否进入。违背了“空闲让进”、“有限等待”

Peterson算法:表示自己有进入的意愿,都愿意让对方先进。只有对方想进,并且最后一次是自己让,自己就循环等待。未遵循让权等待。

  • 进程互斥硬件实现方法

中断屏蔽方法:利用“开关中断指令”实现。 优点:简单、高效。缺点:不适用于多处理剂,只适用于操作系统内核进程,不适用于用户进程。只能运行在内核态。

TestAndSet指令:简称TS指令,或TSL指令。执行过程不允许被中断。查询当前是否上锁,如果上锁,则等待,若否,则上锁并进入(一气呵成)。 优点:实现简单,无需严格检查是否有逻辑漏洞适用于多处理机系统。 缺点:不满足“让权等待”,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,造成忙等。

Swap指令:执行不允许被中断。与TSL类似。 优点:实现简单,无需严格检查是否会有逻辑漏洞,适用于多处理机环境。 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,造成忙等。

  • 信号量机制

整型信号量:用一个整数型变量作为信号量,用来表示系统中某种资源的数量。Wait原语申请资源,检查上锁一气呵成;signal退出区,释放资源。存在问题:不满足“让权等待”。

记录型信号量:wait操作申请资源,当资源数小于零,使用block原语是进程从运行态进入阻塞态,并挂到信号量S的等待队列中。Signal原语释放资源,若有进程等待将该进程从阻塞态变为就绪态。

信号量机制实现进程互斥

  1. 分析并发进程的关键活动,规定临界区;
  2. 设置互斥信息量mutex,初值为1
  3. 在临界区之前执行P(mutex);
  4. 在临界区之后执行V(mutex)。

注:对不同的临界资源需要设置不同的互斥信息量。

信号量机制实现进程同步(保证一前一后执行)

1.分析什么地方需要实现“同步关系”;

2.设置同步信息量S,初始化为0

3.在“前操作”之后执行V(S);(相当于释放操作)

4.在“后操作”之前执行P(S)。

信号量机制实现前驱关系

1.要对每对前驱关系各设置一个同步变量;

2.在“前操作”之后对相应的同步变量执行V操作;

3.在“后操作”之前对相应的同步变量执行P操作。

  • 生产者—消费者问题

PV操作题目分析步骤:

1.关系分析。找出各个进程,分析它们之间的同步、互斥关系;

2.整理思路。确定PV操作大致顺序;

3.设置信号量。并根据题目条件确定信号量初值。

(P操作互斥一般在同步之后进行)

多生产者—多消费者问题。

  • 吸烟者问题
  • 读者写者问题
  • 哲学家进餐问题
  • 管程

为什么要引入管程?

信号量机制:编写困难、易出错。

管程是一种特殊的软件模块,由以下部分组成

1.局部于管程的共享数据结构说明;

2.对该数据结构进行操作的一组过程;

3.对局部于管程的共享数据设置初始值的语句;

4.管程有一个名字。

管程的基本特征

1.局部于管程的数据只能被局部于管程的过程所访问;

2.一个进程只有通过调用管程内的过程才能进入管程访问共享数据;

3.每次只允许一个进程在管程内执行某个内部过程。

补充:各进程必须互斥访问管程的特性是由编译器实现的;可在管程中设置条件变量及等待/唤醒操作以解决同步问题。

四:死锁

  • 死锁的概念

在并发环境下,各进程因竞争资源而造成的一种互相等待双方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。

死循环:某进程执行过程中一直跳不出来某个循环的现象。可能是bug,可能是故意设计。

共同点

区别

死锁

都是进程无法顺利向前推进的现象

死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。

饥饿

可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态,也可能是就绪态

死循环

可能只有一个进程发生死循环。死循环的进程可以上处理机运行,只不过无法像期待的那样顺利推进。死锁和饥饿是管理者(操作系统)的问题,死循环是被管理者的问题。

死锁产生的必要条件:(4个)

互斥条件:只有对必须互斥使用的资源的争夺才会导致死锁。

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程以获得的资源同时被下一个进程所请求。

什么时候会发生死锁?

1.对系统资源的竞争;

2.进程推进顺序非法;

死锁处理策略:

1.预防死锁;(不允许死锁发生、静态策略)

2.避免死锁;(不允许死锁发生、动态策略)

3.死锁的检测和解除。(允许死锁发生)

  • 预防死锁

破坏互斥条件:把只能互斥使用的资源改造为允许共享使用。SPOOLing技术。缺点:可行性不高,很多时候无法破坏互斥条件。

破坏不剥夺条件:1.申请的资源得不到满足,立即释放拥有的所有资源;2.申请的资源被其他进程占用,由操作系统剥夺。缺点:实现复杂,剥夺资源可能导致部分工作失效,反复申请和释放导致系统开销大,可能导致饥饿。

破坏请求和保持条件:运行前分配好所有需要的资源,之后一直保持。缺点:资源利用率低,可能导致饥饿。

破坏循环等待条件:给资源编号,必须按编号从小到大的顺序申请资源。缺点:不方便增加新设备,会导致资源浪费,用户编程麻烦。

  • 避免死锁

安全序列:系统按照这个序列分配资源,每个进程都能顺利完成。

若找不出安全序列,系统就进入了不安全状态。

银行家算法

  • 死锁的检测和解除

检测:1.用某种数据结构来保存资源的请求和分配信息;2.提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

数据结构

两种结点:进程结点(对应一个进程)、资源结点(对应一类资源,一类资源可能有多个)。

两种边:进程节点à资源结点:(表示进程想申请几个资源(每条边代表一个))、资源结点à进程节点(表示已经为进程分配了几个资源(每条边代表一个))。

如果上述数据结构构成的图是不可完全简化的。此时一定发生死锁

解除:用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程。

解除死锁主要方法:

1.资源剥夺法:挂起某些死锁进程,并抢占它的资源,分配给其他死锁进程,但是防止被挂起进程长时间得不到资源而饥饿。

2.撤销进程法。(终止进程法)强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。优点:实现简单。但付出的代价可能会很大。

3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。要求记录进程的历史信息,设置还原点。

如何决定对谁动手?

1.进程优先级;

2.已执行多长时间;

3.还要多久能完成;

4.进程已经使用了多少资源;

5.进程是交互式的还是批处理式的。

第三章:内存管理

一:内存管理概念

  • 基础知识

逻辑地址:CPU生成的地址。是内部和编程使用的,并不唯一。

物理地址:加载到内存地址寄存器中的地址,内存单元真正地址。

装入的三种方式:

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。(只适用于单道程序环境)

静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址。(特点是在一个作业装入内存时,必须分配其要求的全部内存空间,若没有足够内寸,就不能装入,作业一旦进入内存,运行期间不能再移动,也不能在申请内存空间)

动态重定位:又称动态运行时装入。编译链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才运行。这种方式需要一个重定位寄存器支持。

链接的三种方式:

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

装入时动态链接:将各目标模块装入内存,边装入边链接的链接方式。

运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。优点是便于修改和更新,便于实现对目标模块的共享。

  • 内存管理的概念

内存空间的分配和回收;内存空间的扩充;地址转换;存储保护。

存储保护:

法一:在CPU设置一对上下限寄存器,存放上下限地址。进程的指令要访问某个地址时,检查是否越界。

法二:采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。

  • 覆盖与交换

覆盖技术思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。内存分为一个“固定区(运行过程中不会被调入调出)”和若干个“覆盖区(会根据需要调入调出)”。

必须由程序员声明覆盖结构,操作系统完成自动覆盖。缺点:对用户不透明,增加了用户编程负担。

交换技术思想:内存空间紧张时,系统将内存中某些进程暂时调出外存,把外存中某些已具备运行条件的进程换入内存。

具有对换功能的操作系统通常把磁盘分为文件区和对换区。

交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。

优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间。

  • 内存空间的分配和回收

连续分配管理方式:

单一连续分配方式:内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序。(优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护)(缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低)

固定分区分配:将整个用户空间划分为若干个固定大小(分区大小可相等可不等[分区说明表])的分区,每个分区只装入一道作业。(优点:实现简单,无外部碎片)(缺点:当用户程序太大,可能所有的分区都不能满足要求,此时不得不采用覆盖技术来解决,但这又会降低性能;会产生内部碎片,内存利用率低)

动态分区分配:(可变分区匹配)不会预先划分内存分区,在进程装入内存时,根据进程的大小动态的建立分区。系统通常使用:空闲分区表[每个空闲分区对应一个表项,表项中含有分区号、分区大小、分区起始地址等信息]、空闲分区链[每个分区的起始部分和末尾部分分别设置前向指针和后向指针。起始部分处还可记录分区大小等信息]记录内存的使用情况。支持多道程序,在进程装入内存时,根据进程的大小动态的建立分区,无内部碎片,有外部碎片

  • 动态分区分配算法

首次适应FirstFit:(效果最好)从低地址开始查找,找到第一个能满足大小的空闲分区。

最佳适应BestFit:空闲分区按容量递增次序链接,每次分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。(缺点:最后会产生很多外部碎片)

最坏适应WorstFit:按容量递减次序排序,顺序查找找到满足的第一个空闲分区。(缺点:如果之后有“大进程”到达,就没有内存分区可用)

邻近适应NextFit:按地址递增排列成循环链表,从上次结束的时候开始查找

算法

思想

排列顺序

优点

缺点

首次适应

从头到尾找

地址递增

综合性能最好,算法开销小,回收分区后一般不需要对空闲分区队列重新排序

最佳适应

优先更小的

容量递增

会有更多大分区保留

外部碎片,算法开销大,回收分区后可能需要重新排序

最坏适应

优先大的

容量递减

减少小碎片

算法开销大、不利于大进程

邻近适应

首次适应从上次结束位置开始查找

地址递增

算法开销小

会使高地址的大分区也被用完

  • 基本分页存储管理的基本概念(非连续分配)

将内存空间分为一个个大小相等的分区,每个分区就是一个“页框”(页帧、内存块、物理块),每个页框都有一个编号,“页框号”(内存块号、页帧号、物理块号)从0开始。

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“”(页面),每个页面也有一个编号,页号,从0开始。

如何实现地址转换

1.算出逻辑地址对应的页号;

2.知道该页号对应页面在内存中的起始地址;

3.算出逻辑地址在页面当中的“偏移量”;

4.物理地址=页面始址+页内偏移量。

页号=逻辑地址/页面长度(取整)

页内偏移量=逻辑地址%页面长度(取余)

页面大小为2的整数幂时,可以用移位计算。

页表:记录每个页面在内存的存放位置。一个进程对应一张页表,每一页对应一个页表项,页表记录进程页面和实际存放的内存块间的对应关系。(页表的页号是隐含的,只需要知道页表存放起始地址和页表项长度,就可找到各个页号对应的页表项存放位置)

  • 基本地址变换机构

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

1.根据逻辑地址计算页号、页内偏移量;

2.判断页号是否越界;

3.查询页表、找到也好对应的页表项,确定页面存放的内存块号。

4.用内存块号和页内偏移量得到物理地址;

5.访问目标内存单元。

理论上,页表项长度为3B即可表示内存块号的范围,但为了方便页表查询,会让一个页表项占更多的字节,使得每个页面恰好可以装下整数个页表项。

第一次访问内存:查页表;第二次:访问目标内存单元。

  • 具有快表的地址变换机构

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行,如果某个数据被访问过,不久之后该数据很有可能再次被访问。

空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。

快表,又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。内存中的页表常称为慢表

引入快表后,地址变换过程

1.CPU给出逻辑地址,有某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。

2.如果找到匹配的页号,说明要访问的页表项在快表中有副本,直接从中取出该页对应的内存块号。最后访问该物理地址对应的内存单元。若块表命中,则只需一次访存。

3.如果没有找到匹配的页号,需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,访问物理地址对应的内存单元。若未命中,则需要进行两次访存。

  • 两级页表

单级页表存在的问题:页表必须连续存放,当页表很大时,需要占用很多个连续的页框。没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

解决方法:为离散分配的页表再建立一张页表,称为页目录表。(外层页表/顶层页表)

两级页表地址变换

1.按照地址结构将逻辑地址拆分成三部分;

2.从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置;

3.根据二级页号查表,找到最终想访问的内存块号;

4.结合页内偏移量得到物理地址。

需要注意的细节

1.若采用多级页表机制,各级页表大小不能超过一个页面

2.两级页表访存次数分析:第一次:访问内存中的页目录表;第二次:访问内存中的二级页表;第三次:访问目标内存单元。

  • 基本分段存储方式

进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程)每段从0开始编址。

内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。

分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。

段号的位数决定了每个进程最多可以分几个段,段内地址位数决定了每个段的最大长度是多少。

段表:1.每个段对应一个段表项,其中记录了该段在内存中的起始位置(基址)和段的长度。

2.各个段表项的长度是相同的。(段号16位,段内地址16位)

段表寄存器:存放段表始址F+段表长度M

1.根据逻辑地址得到段号、段内地址;

2.判断段号是否越界;

3.查询段表,找到对应的段表项,段表项的存放地址为F+S*段表项长度;

4.检查段内地址是否超过段长;

5.计算物理地址;

6.访问物理地址。

分段、分页管理的对比

页是信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户不可见。

段是信息的逻辑单位。分段的主要目的是更好的满足用户需求,一个段通常包含一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程需要显式地给出段名。

分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。

分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

分段比分页更容易实现信息的共享和保护

不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的是不能共享的。

分页:第一次访存---查内存中的页表,第二次访存---访问目标内存单元。两次。

分段:第一次访存---查内存中的段表,第二次访存---访问目标内存单元。两次。

  • 段页式管理方式

分页、分段管理方式中最大优缺点

优点

缺点

分页管理

内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片

不方便按照逻辑模块实现信息的共享和保护

分段管理

很方便按照逻辑模块实现信息的共享和保护

如果段长过大,为其分配很大的连续空间会很不方便。另外,段式管理会产生外部碎片

段页式管理:将进程按逻辑模块分段,再将各段分页。

将地址空间按照程序自身的逻辑关系划分为若干个段,再将各段分为大小相等的页面。

将内存空间分为与页面大小相等的一个个内存块,系统以块为单位为进程分配内存。

每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始地址)组成。每个段表项相等,段号是隐含的。

进程上处理机之前,从PCB中读取段表始址、段表长度。

逻辑地址结构:段号、页号、页内偏移量

地址转换

  1. 根据逻辑地址得到段号、页号、页内偏移量;
  2. 判断段号是否越界;
  3. 查询段表,找到对应的段表项,存放地址为始址+段号*段表项长度;
  4. 检查页号是否越界;
  5. 根据页表存放块号、页号查询页表,找到对应页表项;
  6. 根据内存块号、页内偏移量得到最终的物理地址;
  7. 访问目标内存单元。

第一次:查段表、第二次:查页表、第三次:访问目标单元。

可引入快表机构,以段号和页号为关键字查询块表,即可直接找到最终的目标页面存放的位置。引入快表后仅需一次访存。

二:虚拟内存

  • 虚拟内存管理

传统存储管理方式的特点/缺点:

一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:1作业很大时,不能全部装入内存,导致大作业无法运行;2当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。

驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分即可正常运行,就导致内存中驻留大量、暂时用不到的数据,浪费了宝贵的内存资源。

高速缓冲技术:将近期会频繁访问的数据放到更高速的存储器中,暂时用不到的数据放在更低速存储器中。

易混知识点:

虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的;虚拟内存的实际容量=min(内存和外存容量之和,CPU寻址范围)

虚拟内存有以下三个主要特征

多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。

对换性:在作业运行时无需一直常驻内存,而是允许在内存运行过程中,将作业换入、换出。

虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

虚拟内存技术,允许一个作业多次调入内存,如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。

虚拟内存的实现:请求分页存储管理;请求分段存储管理;请求段页式存储管理。

传统的非连续分配存储管理与虚拟内存实现的区别:

在程序运行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。(请求调页/段功能)

若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。(页面置换或段置换功能)

请求分页存储管理与基本分页存储管理的主要区别:

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

  • 请求分页管理方式:页表机制、缺页中断机构、地址变换机构

页号

内存块号

状态位

访问字段

修改位

外存地址

0

0

0

0

X

1

B

1

10

0

Y

2

C

1

6

1

z

状态位:是否已经调入。

访问字段:记录最近被访问的次数,或记录上次访问的时间,供置换算法选择换出页面时参考。

修改位:调入后是否被修改过。

外存地址:外存中的地址。

在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。若没有空闲块,由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回内存。

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,属于内中断。一条指令在执行期间,可能产生多次缺页中断。

新增步骤(请求调页、页面置换、需要修改请求页表中新增的表项

补充细节:

  1. 只有“写指令”才需要修改“修改位”。一般来说只需修改块表中的数据,只有要将快表项删除时才需要写回内存中的慢表。减少访存次数。
  2. 和普通中断处理一样,缺页中断需要保留CPU现场。
  3. 需要用某种“页面置换算法”来决定一个换出页面。
  4. 换入/换出页面都需要启动慢速的I/O操作,可见,如果换入/换出太频繁,会有很大开销。
  5. 页面调入内存后,需要修改慢表,同时也需要将快表项复制到快表中。
  • 页面置换算法

缺页率=缺页中断次数/访问页面次数

最佳置换算法(OPT):每次选择淘汰的页面将是以后永不使用,或是在最长时间内不再被访问,保证最低的缺页率。但实际上,操作系统是无法预测页面访问序列,因此,最佳置换算法是无法实现的。

先进先出置换算法(FIFO):每次选择最早进入内存的页面淘汰。把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。(Belady异常:当为进程分配的物理块数增加时,缺页次数不减反增的异常现象)只有FIFO有Belady异常。实现简单,但与实际运行时的规律不适应,算法性能差。

最近最久未使用置换算法(LRU):淘汰最近最久未使用的页面。实现需要专门的硬件支持,性能好,但是实现困难,开销大。

时钟置换算法(CLOCK):或称最近未用算法(NRU)。

简单的CLOCK算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问,访问位置为1,需要淘汰时,只检查访问位,0将页换出,1将1换为0,暂不换出,继续检查直到遇到0。(最多会经历两轮扫描)

改进型的时钟置换算法:淘汰没有修改过的页面。(访问位,修改位)

算法规则:将所有可能被置换的页面排成一个循环队列。

第一轮:从当前位置开始扫描到第一个(0,0)的帧用于置换。本轮不修改任何标志位。(没有访问和修改)

第二轮:第一轮失败,查找第一个(0,1)的帧用于置换。本轮将所有扫描过的访问位设为0。(没有访问,但修改过)

第三轮:第二轮失败,查找第一个(0,0)的帧用于置换。不修改任何标志位。(最近访问过,但是没有修改过)

第四轮:第三轮失败,查找第一个(0,1)的帧用于置换。(最近访问和修改过)

最多会进行四轮扫描。

算法规则

优缺点

OPT

优先淘汰最长时间内不会访问的页面

缺页率最小,性能最好;但无法实现

FIFO

优先淘汰最先进入内存的页面

实现简单,但性能很差,可能出现Belady异常

LRU

优先淘汰最近很久没访问的页面

性能很好,但需要硬件支持,算法开销大

CLOCK

循环扫描,优先淘汰没访问过的

实现简单,算法开销小;但未考虑页面是否修改过

改进型CLOCK

四轮

算法开销小,性能也不错

  • 页面分配策略

驻留集:指请求分页存储管理中给进程分配的物理块的集合。

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变,即驻留集大小不变。

可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即驻留集大小可变。

局部置换:发生缺页时只能选进程自己的物理块进行置换。

全局置换:可将操作系统保留的空闲物理块分配给缺页进程,也可将别的进程持有的物理块置换到外存,再分配给缺页进程。

固定分配局部置换:缺点:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。

可变分配全局置换:只要某进程发生缺页,就能获得新的物理块。若被选中调出的页的进程物理块会减少,缺页率会增加。

可变分配局部置换:刚开始为每个进程分配一定数量的物理块。缺页时只允许从该进程自己的物理块中选出一个换出外存。若在运行中频繁的缺页,系统会为该进程多分配几个物理块,直至缺页率到适当程度;反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

何时调入页面?

1.预调页策略:根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更高效。预测不久可能访问到的页面成功率只有50%,这种策略主要用于进程的 首次调入。

2.请求调页策略:运行期间发现缺页时才将所缺页面调入内存。这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘I/O操作,因此I/O开销较大。

从何处调入页面?

1.系统拥有足够的对换区空间:页面的调入调出都是在内存与对换区之间进行,这样可以保证页面的调入调出速度很快。在金策哼给你运行前,需将进程相关的数据从文件区复制到对换区。

2.系统缺少足够的兑换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。

3.UNIX方式:运行之前进程有关的数据全部放在文件区,都可从文件区调入。若被使用过的页面需要调出,则写回对换区,下次需要时从对换区调入。

抖动现象:刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数。

工作集:指在某段时间间隔内,进程实际访问页面的集合。

实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小给进程分配若干内存块。一般来说,驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

第四章:文件管理

一:文件

  • 初识文件管理

文件:一组有意义的信息、数据集合。

文件的属性:文件名、标识符、类型、位置、大小、创建时间、修改时间、保护信息、文件持有者信息。

文件内部的数据应该怎样组织起来?

无结构文件:由一些二进制或字符流组成,又称“流式文件”。

有结构文件:由一组相似的记录组成,又称“记录式文件”。

记录是一组相关数据项的集合;

操作系统向上提供的功能

创建文件create、删除文件delete、读文件read、写文件write、打开文件open、关闭文件close。

操作系统以“”为单位为文件分配存储空间。

  • 文件的逻辑结构

有结构文件一般可以选择一个数据项作为关键字。根据各条记录的长度又可分为定长记录和可变长记录。

顺序文件:记录顺序排列,记录可以是定长或可变长的。各个记录在物理上可以顺序和链式存储。按是否与关键字有关分为:串结构(记录之间顺序与关键字无关)、顺序结构(按关键字顺序排列)。链式存储:无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找。顺序存储:可变长记录:无法实现随机存取,每次只能从第一个记录开始依次往后寻找。定长记录:可实现随机存取,记录长度为L,则第i个记录存放的相对位置是i*L;若采用串结构,无法快速找到关键字对应的记录;若采用顺序结构,可以快速找到某关键字对应的记录。

考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。

索引文件:建立一张索引表以加快文件检索速度。每条记录对应一个索引项。这些顺序项要连续存储。文件中的这些记录在物理上可以离散地存放。

索引表本身是定长记录的顺序文件。

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表。并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。

例子:文件有10000个记录。顺序文件:从头开始查找:平均5000次。

若采用索引顺序文件:分为100组,找到分组平均需要50次,在分组中找到该记录平均需要50次。平均查找次数减少为50+50=100次。

为了进一步提高搜索效率,为顺序文件建立多级索引表。为多级索引顺序文件。

  • 文件目录

文件控制块:目录本身就是一种有结构文件,由一条记录组成。每条记录对应一个在该目录下的文件。目录文件中的一条记录就是一个“文件控制块(FCB)”。FCB实现了文件名和文件之间的映射。

需要对目录进行那些操作?

搜索:用户要使用一个文件时,要根据文件名搜索目录,找到该文件对应的目录项。

创建文件:创建一个新文件,需要在其所属的目录中增加一个目录项。

删除文件:删除一个文件时,还要删除文件对应的目录项。

显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性。

修改目录:文件的某些属性是保存在目录中的,这些属性变化时需要修改相应的目录项。

目录结构

单级目录结构:整个系统建立一张目录表,每个文件占一个目录项。不适用于多用户操作系统。

两级目录结构:分为主文件目录(记录文件名及相应用户文件目录的存放位置)和用户文件目录(由该用户的文件FCB组成)。用户无法对自己的文件进行分类。

多级目录结构(树形):目前使用的结构。描述查找一个文件的完整路径叫做绝对路径。

当前目录:设置当前目录后,不需从根目录开始查找,可以直接从当前目录查找。这样的路径称为相对路径。引入当前目录和相对路径后,磁盘/IO次数减少,提升了访问文件的效率。

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。提出了“无环图目录结构”。

无环图目录结构:在树形目录结构的基础上,增加了一些指向同一节点的有向边。使整个目录称为一个有向无环图,实现文件共享。但这样需要为共享节点设置一个共享计数器,用于记录此时有多少个地方在共享该节点。只有共享计数器减为0时,才删除节点。

索引结点(FCB的改进):将除文件名以外的属性都放到索引结点

存放在外存中的索引结点称为“磁盘索引结点”,放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,如:文件是否被修改,此时有几个进程正在访问该文件等。

  • 文件的物理结构(文件分配方式)

连续分配方式:文件在磁盘上占有一组连续的内存块。优点:支持顺序访问和直接访问;连续分配的文件在顺序访问时速度最快。缺点:不方便文件拓展,存储空间利用率低,会产生磁盘碎片。

文件目录中记录存放的起始块号和长度。

链接分配:采用离散分配方式,可以将文件分配离散的磁盘块。分为隐式链接和显式链接。隐式链接:目录中记录文件存放起始块号和结束块号。也可以增加一个字段来表示文件的长度。除了文件的最后一个磁盘块之外,每个磁盘块都会保存指向下一个盘块的指针,这些指针对用户是透明的。隐式链接只支持顺序访问,不支持随机访问,查找效率低。但很方便文件拓展,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。显式链接:把用于链接文件各物理块的指针显示地存放在一张表中,即文件分配表(FAT)。目录中只需记录文件的起始块号,文件分配表中有磁盘的所有物理块,每个物理块记录文件的下一个块号。-1代表是文件的结尾。注:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT各表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。缺点:文件分配表的需要占用一定的存储空间。

索引分配:允许文件离散的分配在各个磁盘块中,系统会为每个文件建立一张索引表,记录了文件各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表---建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。索引分配方式可以支持随机访问、文件拓展也很容易实现。

如果一个文件的大小的索引表一个磁盘块是装不下的:

链接方案;多层索引;混合索引。

链接方案:可以将多个索引块链接起来。如果文件非常大也是很低效的。

多层索引:原理类似多级页表。若采用k层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要k+1次读磁盘操作。

混合索引:多种索引分配方式的结合。一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引。

  • 文件存储空间管理

存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)。

存储空间的初始化:将每个磁盘分为文件区和目录区,目录区主要存放文件目录信息(FCB)、存储磁盘存储空间管理的信息(文件目录、空闲表、位示图、超级块等用于文件管理的数据)。文件区用于存放文件数据。有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷。

存储空间管理:

空闲表法:存储每个连续块的第一个空闲盘块号和连续的空闲盘块数。可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。

回收磁盘快需要注意表项的合并问题:回收区的前后都没有相邻空闲区、回收区前后都是空闲区、回收区前面是空闲区、回收区后面是空闲区。

空闲链表法:空闲盘块链:以盘块为单位组成一条空闲链。空闲盘区链:以盘区为单位组成一条空闲链(连续的磁盘块可以组成盘区、盘区的第一个盘块内记录了盘区的长度、下一个盘区的指针)。适用于离散分配的物理结构。

位示图法:0表示空闲,一表示占有。

成组链接法:重点是理解超级块的构造和链接。

超级块:下一组空闲盘块数+空闲块号(第一个空闲块号指向的块中存储下一组空闲盘块数+空闲盘号)

文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。超级块中记录下一组空闲盘块数和空闲块号。

  • 文件共享

注意:多个用户共享一个文件是指系统中只有“一份”数据。只要某个用户修改了文件的数据,其他用户都可以看到文件的变化。

分类:基于索引结点(硬链接)/符号链(软链接)的共享方式。

索引结点:两个文件目录中的索引结点指针指向同一个索引结点。

符号链:索引结点指针指向新的索引结点,这个索引结点指向一个链接文件(相当于一个快捷方式)。软链接方式访问共享时需要查找多级目录,进行多次/IO操作,因此此种方法比硬链接慢。

  • 文件保护

口令一般存放在文件对应的FCB或索引结点中,用户访问文件前先输入口令,对比正确后允许用户访问。优点:保存口令的空间开销不多,验证时间开销也很小。缺点:口令存放在系统内部,不够安全。

加密保护:使用某个“密码”对文件进行加密,在访问文件时提供密码进行解密。密码错误无法得到正确的文件内容。优点:保密性好,不需要在系统中存储“密码”。缺点:编码/译码,或者说加密/解密要花费一定时间。

访问控制:在每个文件的FCB增加一个访问控制列表(ACL),记录了各用户对文件执行那些操作。实现灵活、可以实现复杂的文件保护功能。

访问类型:读、写、执行(将文件装入内存并执行)、添加(将新信息添加到文件结尾部分)、删除、列表清单(列出文件名和文件属性)。

  • 文件系统的层次结构

用户接口:文件系统需要向上层用户提供一些简单易用的功能接口。主要用于处理用户发出的系统调用请求。

文件目录系统:用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成。

存取控制模块:验证用户是否有访问权限,主要完成文件保护相关功能。

逻辑文件系统与文件信息缓冲区:用户指明想要访问文件记录号,这一层需要将记录号转换为对应的逻辑地址。

物理文件系统:将文件的逻辑地址转换为物理地址。

辅助分配模块:负责分配和回收存储空间。

设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。

二:磁盘

  • 磁盘的结构

磁盘:表面由一些磁性物质组成,可以用这些磁性物质记录二进制数据。

磁盘的盘面划分为一个个磁道

一个磁道又被划分成一个个扇区。每个扇区就是一个磁盘快。每个扇区存放的数据量相同。最内侧扇区数据密度最大。

读写数据:将磁头移动到想要读写的扇区所在的磁道。目标扇区从磁头下面划过才能完成对扇区的读写操作。

磁盘的物理地址柱面号,盘面号,扇区号来定位任意一个磁盘块。

柱面号用来定位磁道,盘面号用来选择盘面,扇区号来选择扇区。

读取步骤

1.    根据柱面号移动磁臂,让磁头指向指定柱面;

2.    激活指定盘面对应的磁头;

3.    磁盘旋转过程中,指定的扇区会从磁头下面划过。

活头磁盘:磁头可以移动。

固定头磁盘:磁头不能移动。每个磁道都有一个磁头。

固定盘磁盘:磁盘不可更换。

可换盘磁盘:磁盘可更换。

  • 磁盘调度

一次磁盘读/写操作需要的时间=寻找时间+延迟时间+传输时间

寻找时间(寻道时间):Ts在读写数据前,将磁头移动到指定磁盘所花的时间。

1.启动磁头臂s

2.移动磁头每跨越一个磁道耗时m

寻找时间=s+m*n

延迟时间Tr:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r(单位:转/秒或转/分),平均所需延迟时间Tr=(0.5)*(1/r)=1/2r

传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上字节数为N。则:Tt=(1/r)*(b/N)=b/(rN)[读写一个磁道所需的时间刚好又是转一圈所需的时间1/r]

延迟时间和传输时间都与磁盘转速相关,而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间。

磁盘调度算法:

先来先服务(FCFS:根据进程请求访问磁盘的顺序进行调度。优点:公平,如果请求访问的磁道比较集中的话,算法性能还算过得去。缺点:如果有大量进程竞争使用磁盘,在性能上很差,寻道时间长。

最短寻找时间优先(SSTF:优先处理离当前磁头最近的磁道。保证每次的寻道时间最短,但不能保证总的寻道时间最短。优点:性能较好,平均寻道时间短。缺点:可能产生饥饿现象。

扫描算法(SCAN:只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是“扫描算法”的思想。由于磁头移动的方式很像电梯因此也叫电梯算法。优点:性能较好,平均寻道时间较短,不会产生饥饿现象。缺点:1.只有到达最边上的磁道时才能改变磁头移动方向。2.对各个位置的响应频率不均。

LOOK调度算法:扫描算法中如果在移动方向没有请求,可以立即改变磁头移动方向。边移动边观察。优点:比起SCAN算法,不需要每次都移动到最外侧。

C-SCAN算法:只有磁头朝某个特定方向移动时才处理磁头访问请求,返回时直接快速移动至起始端而不处理任何请求。优点:比起SCAN,对每个位置磁道的响应频率很平均。

C-LOOK算法:C-SCAN的基础上,若移动方向没有磁道访问请求,可以立即返回磁头,并且只需返回到有磁道访问请求的位置即可。

  • 减少磁盘延迟时间的方法

(柱面号,盘面号,扇区号)读取相邻物理地址的数据时,不改变柱面号,不需要移动磁头臂,只需要激活相邻盘面的磁头即可。

交替编号:让编号相邻的扇区在物理上不相邻。

错位命名:盘面的扇区序号不垂直对应。

  • 磁盘的管理

磁盘初始化:

1.进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域、尾三个部分。管理扇区所需要的各种数据结构一般存放在头尾部分,包括扇区验证码(奇偶、CRC验证码)

2.将磁盘分区,每个分区由若干柱面组成。

3.进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(位示图、空闲分区表)

引导块:ROM中只存放很小的自举装入程序,完整的自举程序放在磁盘的启动块(引导块、启动分区)上,启动块位于磁盘的固定位置。

坏块的管理:对于简单的磁盘,可以在逻辑格式化时(建立文件系统),对整个磁盘进行坏块检查,标明哪些扇区是坏扇区。(FAT文件分配表)。对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)就将坏块链进行初始化。为保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明。

第五章:输入输出(I/O)管理

(一)I/O(输入输出)设备的概念和分类

I/O设备按使用特性分类:人机交互类外部设备(数据传输速度慢)、存储设备(数据传输速度快)、网络通信设备(速度介于两者之间)。

传输速率分类:低速设备、中速设备、高速设备。

信息交换的单位:块设备(传输速率较高,可寻址,对它可随机读写)、字符设备(传输速率较慢,不可寻址,输入输出时常采用中断驱动方式)。

(二)I/O控制器

机械部件(可见的部分)+电子部件(插入主板扩充槽的印刷电路板)

CPU无法直接控制I/O设备,因此需要一个电子部件作为CPU和I/O设备机械部件之间的“中介”,实现CPU对设备的控制。I/O控制器又称设备控制器

I/O控制器功能:接受和识别CPU发出的命令(I/O控制器会有相应的控制寄存器,存放命令和参数)、向CPU报告设备的状态(I/O控制器有相应的状态寄存器存放设备当前的状态)、数据交换(会有数据寄存器)、地址识别(区分各个寄存器,通过CPU提供的地址判断CPU要读写哪个寄存器)。

I/O控制器包括:CPU与控制器的接口、I/O逻辑、控制器与设备的接口。

内存映像:不独立编址。只要像操纵内存地址一样操纵。

寄存器独立编址:缺点:需要设置专门的指令实现对控制器的操作,不仅要指明寄存器的地址,还要指明控制器的编号。

(三)I/O控制方式

注意的问题:完成一次读/写操作的流程;CPU干预的频率;数据传送的单位;数据的流向。

程序直接控制方式:1.cpu向控制器发出读指令。于是设备启动,并且状态寄存器设为1;2.轮询检查控制器的状态(若状态位一直是1,说明设备还没准备好要输入的数据,于是cpu会不断的轮询);3.输入设备准备好数据后将数据传给控制器,并报告自身状态;4.控制器将输入的数据放到数据寄存器中,并将状态寄存器改为0;5.cpu发现数据已就绪,将数据寄存器中的内容读入cpu的寄存器中,再把cpu寄存器中的内容放入内存;6.若还要继续读入数据,则cpu继续发出指令。

cpu干预频率:很频繁,I/O操作开始之前、完成之后需要CPU介入,并且在等待I/O完成的过程中CPU需要不断地轮询检查。

数据传送的单位:字。

数据的流向:读:I/OàCPUà内存 写:内存àcpuàI/O

优点:实现简单,在读写指令之后,加上实现循环检查的一系列指令即可。缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。

中断驱动方式:cpu发出指令后,可将等待I/O的进程阻塞,先切换到别的进程执行。当I/O完成后,控制器向CPU发出一个中断信号。CPU会在每个指令周期的末尾检查中断。

cpu干预频率:每次I/O操作之前、完成之后需要CPU,等待I/O完成的过程CPU可以切换到别的进程运行。

数据传送单位:字。

数据流向同上一种方式。

优点:CPU、I/O可以并行工作,CPU利用率得到明显提升。

缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会消耗较多的CPU时间。

DMA方式:直接存储器存取,主要用于块设备,改进如下:数据的传送单位是“块”。数据直接从设备放入内存,或者从内存直接到设备。不需要cpu中转。仅在传送一个或多个数据块的开始和结束时,才需要cpu干预。

DMA控制器:主机—控制器接口+I/O控制逻辑+块设备—控制器接口。寄存器:DR数据寄存器。MAR内存地址寄存器,输入时表示数据应存放在内存的什么位置,输出时表示输出的数据放在内存的什么位置。DC数据计数器,表示剩余要读写的字节数。CR命令/状态寄存器,用于存放CPU发来的I/O命令,或设备的状态信息。CPU干预频率:仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。数据传送的单位:每次读/写一个或多个快(每次读写的只能是连续的多个块,且这些块读入内存后在内存中也必须是连续的)。数据流向:读:I/O à内存 写:内存àI/O。优点:数据以块为单位,cpu介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU、I/O设备的并行性得到提升。缺点:cpu每发出一条I/O指令,只能读写一个或多个连续的数据块。

通道控制方式:通道:一种硬件,可以识别并执行一系列通道指令(指令单一,并且与CPU共享内存)。1.cpu向通道发出I/O指令,指明通道程序在内存中的位置,并指明要操作的是哪个I/O设备,之后CPU就切换到其他进程执行了。2.通道执行内存中的通道程序(其中指明了要读入/读出多少数据,读写的数据应放在内存的什么位置等信息)。3.通道执行完规定的任务后,向CPU发出中断信号,之后CPU对中断进行处理。CPU干预频率:极低,会根据CPU指示执行相应的通道程序,完成一组数据块的读写后才需要发出中断信号,请求CPU干预。数据传送的单位:一组数据块。数据流向:读:I/O à内存 写:内存àI/O。缺点:实现复杂,需要专门的通道硬件支持。优点:CPU、通道、I/O设备可并行工作,资源利用率很高。

(四)I/O软件层次结构

用户层软件、设备独立性软件、设备驱动程序、中断处理程序、硬件。

中间三个属于操作系统内核部分,即I/O系统或称I/O核心子系统。

用户层软件:实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务。

设备独立性软件:设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。主要实现功能:向上层提供统一的调用接口;设备的保护;差错处理;设备的分配与回收;数据缓冲区管理;建立逻辑设备名到物理设备的映射关系。

设备独立性软件需要通过“逻辑设备表LUT”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。两种方式:整个系统只设置一张LUT;为每个用户设置一张LUT。

设备驱动程序:负责对硬件设备的具体控制,将上层发出的一系列指令特化成特定设备“能听得懂”的一系列操作。驱动程序一般会以一个独立进程的方式存在。

中断处理程序:进行中断处理。

(五)I/O核心子系统

用户层软件:假脱机技术SPOOLing技术(408大纲将假脱机技术归为“I/O核心子系统”的功能);

设备独立性软件:I/O调度、设备保护、设备分配与回收、缓冲区管理(缓冲与高速缓存)

I/O调度:用某种算法确定一个好的顺序来处理各个I/O请求。

(六)假脱机技术

脱机:脱离主机的控制进行的输入、输出操作。

磁盘开辟出两个存储区域---“输入井”+“输出井”

内存中有输入输出缓冲区+输入进程+输出进程

输入进程:模拟脱机输入时的外围控制机。

输出进程:模拟脱机输出时的外围控制机。

共享打印机原理分析

1.在磁盘输出井为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打印的数据送入其中。

2.为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户的打印数据存放位置等信息的),再将该表挂到假脱机文件队列上。

用SPOOLing技术将独占式的打印机“虚拟”成共享打印机。

(七)设备的分配与回收

设备分配时应考虑的因素:设备的固有属性(独占设备、共享设备、虚拟设备)、设备分配算法、设备分配中的安全性(安全分配方式[为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒]、不安全分配方式[进程发出I/O请求后,系统为其分配设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞])。安全分配:优点:破坏了“请求和保持”条件,不会死锁。缺点:对于一个进程来说,CPU、I/O只能串行工作。不安全分配:优点:进程的计算任务和I/O任务可以并行处理,使进程迅速推进。缺点:有可能发生死锁。

静态分配与动态分配:静态(运行前就分配所有所需资源,运行结束后归还资源)、动态(运行过程中动态申请设备资源)

设备分配管理中的数据结构:(一个通道可以控制多个控制器,每个设备控制器可以控制多个设备)系统为每个设备配置一张DCT(设备控制表)[设备类型、设备标识符、设备状态、指向控制器表的指针、重复执行次数和时间、设备队列的队首指针],用于记录设备情况。每个设备控制器都会对应一张COCT(控制器控制表)[控制器标识符、控制器状态、指向通道表的指针、控制器队列的队首指针、控制器队列的队尾指针]。操作系统分根据COCT信息对控制器进行操作和管理。每个通道都会对应一张DHCT(通道控制表)[通道标识符、通道状态、与通道连接的控制器首址、通道队列的队首指针、通道队列的队尾指针],对通道进行操作和管理。SDT(系统设备表)记录系统中全部设备的情况,每个设备对应一个表目[设备类型、设备标识符、DCT、驱动程序入口]。

设备分配的步骤

1.根据进程请求得物理设备名查找SDT;

2.根据SDT找到DCT,若设备忙碌则进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程;

3.根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程;

4.根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。只有设备、控制器、通道三者都分配成功时,设备分配才算成功,之后便可启动I/O设备进行数据传送。

(缺点:用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程;若换了一个物理设备,则程序无法进行;若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待)改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名。

设备分配步骤的改进方法

1.根据进程请求得逻辑设备名查找SDT;

2.查找SDT,找到用户进程指定类型的、空闲的设备,将其分配给该进程,操作系统在逻辑设备表中新增一个表项;

3.根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程;

4.根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

逻辑设备表的设置问题:

整个系统只有一张LUT,各用户所用的逻辑设备名可重复,适用于多用户操作系统。

(八)缓冲区管理

缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合。

一般情况下,更多使用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区。

缓冲区作用

缓和CPU和I/O设备之间速度不匹配的矛盾;

减少对CPU的中断频率,放宽对CPU中断相应时间的限制;

解决数据粒度不匹配的问题;

提高CPU与I/O设备之间的并行性。

单缓冲(初始状态:工作区满,缓冲区空

计算每处理一块数据平均需要多久?(Max(C,T)+M)

技巧:假定一个初始状态,分析下次到达相同状态需要多少时间,这就是处理一块数据平均所需的时间。

双缓冲区(工作区空,其中一个满另一个空(Max(C+M ,T))

循环缓冲区

缓冲池:由系统中共用的缓冲区组成。这些缓冲区按使用状态可以分为:空缓冲队列、装满输入数据的缓冲队列、装满输出数据的缓冲队列

根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:收容输入、提取输入、收容输出、提取输出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值