导图社区 考研408操作系统笔记汇总
这是一篇关于考研408计算机操作系统的思维导图,分为五页,包含 I/O设备管理、文件管理、内存管理、进程管理、操作系统概述等。
编辑于2024-05-09 19:09:01目录
第1章 操作系统概述
第2章 进程管理
第3章 内存管理
第4章 文件管理
第5章 I/O设备管理
第1章 操作系统概述
基本概念
操作系统(operating system,简称OS)是一组控制和管理计算机硬件和软件资源,合理地对各类作业进行调度,方便用户使用的计算机的程序集合。 Linux操作系统是用C语言、汇编语言编写的。 Windows的大部分内核是用C语言写的。  操作系统是用户和计算机硬件系统之间的接口,那么操作系统提供了很多服务使得用户可以使用计算机。
目标及作用
操作系统设计的三个目标: 方便:操作系统使计算机更易于使用; 有效:操作系统允许以更有效的方式使用计算机系统资源; 扩展的能力:在构造操作系统时,应该允许在不妨碍服务的前提下有效地开发、测试和引进新的系统功能。 设计现代OS的主要目标是提高资源利用率和方便用户。
基本特征
并发
并发是指多道程序环境下,一段时间内,宏观上有多道程序同时运行,而在每个时刻,单处理机系统的环境下每时刻仅有一道程序执行,微观上这些程序是分时交替执行。 单处理机系统中,每一时刻仅能有一道程序执行,所以微观上这些程序是分时的交替执行。 如果计算机系统有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,每个处理机可以来处理一个可并发执行的程序,这样多个程序便可以实现并行。
并行和并发的区别
并行性是指两个或多个事件在同一时刻发生。 并发性是指两个或多个事件在同一时间间隔内发生。
共享(资源共享)
操作系统的共享是指系统中的软硬件资源可供多个用户共同使用,不再为某个程序独有。
互斥共享
打印机,磁带机等等
资源特点
一段时间内只允许一个进程使用,只有当前作业释放后,才能允许其他作业使用
同时访问
磁盘,可重入代码等
资源特点
可以供多个作业在一段时间内“同时访问”,这里的同时指得是宏观上。微观上,这些作业是交替访问该资源进行“分时共享”,但是作业访问资源的顺序不会影响访问结果。
概要
并发和共享是操作系统的最基本的两个特征,他们之间互相依存 如果操作系统不支持程序并发,则不存在资源共享问题。 如果操作系统不能对资源共享实施管理,则影响并发。
虚拟(虚拟技术)
虚拟指的是通过某种技术将一个物理实体变成若干个逻辑上对应的功能
空分复用技术
虚拟存储器技术
逻辑上扩充存储器容量
时分复用技术
虚拟处理机技术
在一段时间内单台处理器可以同时运行多道程序,给人感觉每道程序都有一个CPU为其提供服务,这样便把一台物理上的CPU虚拟为多台逻辑上的CPU。
虚拟设备技术
独占设备变为独享设备
异步
异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。 异步:进程的执行以“走走停停”的方式运行,因为要使用I/O等资源而暂停执行,处理机调度另外的进程执行,而原进程I/O处理结束后又得等待处理机的再次调度。故进程在某个时刻的状态难以重现。 异步性:操作系统必须随时对不可预测的次序发生的时间做出响应,具体表现在两点: 1.进程的运行速度不可预知 2.难以重现进程在某个时刻的状态
主要功能和服务
服务员
用户接口
命令接口
在字符界面下,用户必须通过命令接口方能取得操作系统的服务
联机命令接口
为了使用户能通过联机命令接口与计算机进行交互,系统中必须配置键盘终端处理程序和命令解释程序这两类软件,以及一组联机命令。
终端处理程序
在键盘终端处理程序中,有面向字符方式和面向行方式两种方式实现字符接收的功能。键盘终端处理程序负责接收用户键入的终端命令,并将它显示在终端屏幕上。
命令解释程序
命令解释程序:MS-DOS中的COMMAND.COM或UNIX中的Shell,它们放在操作系统的最高层,其主要功能是解释并执行终端命令。
一组联机命令
脱机命令接口
程序接口
用户程序必须通过程序接口方能取得操作系统的服务,该接口主要是由一组系统调用组成的。 程序接口,是OS专门为用户程序设置的,它由一组系统调用(system call)组成,因此也可以说,系统调用是OS与应用程序之间的接口,它是用户程序取得OS服务的唯一途径。
图形接口
图形用户接口使用了WIMP技术,将窗口、图标、菜单、指点设备(如鼠标)和面向对象技术集成在一起,形成了一个视窗操作环境。
管理员
处理器管理(进程管理)
存储器管理
设备管理
文件管理
对软件资源的管理,形成了操作系统的文件管理(系统)。
网络与通信管理
发展和分类
无操作系统的计算机系统
人工操作方式 用户采用人工操作方式直接使用计算机硬件 程序员将事先已打孔的纸带装入纸带输入机,在启动的同时将程序和数据输入计算机,然后启动计算机运行。 缺点:用户独占主机、CPU资源浪费 早期计算机体积大,输入设备十分落后,没有键盘和鼠标,需要通过无数的开关输入信息,计算机处理信息后,输出设备也相当简陋,就是一堆信号灯,无法处理复杂信息,只能进行数字运算。人们感到计算机输入和输出方式太落后,在输入方面,为了不再每次扳动成百上千的开关,人们发明了纸带机。纸带的每一行都标明了26个字母、10个数字和一些运算符号,如果这行的字母A上面打了一个孔,说明这里要输入的是字母A,同理,下面的行由此类推。这样一个长长的纸带就可以代表很多的信息,人们把这个纸带放入纸带机,纸带机再把纸带上的信息翻译给计算机。
批量处理系统
必须提供相应的控制信息 批处理系统中,作业执行时用户无法干预其运行,只能通过事先编制作业控制说明书来间接干预,缺少交互能力。
单道批处理系统
 单道批处理系统是在解决人机矛盾和CPU与I/O设备速度不匹配的矛盾中发展起来的。
多道批处理系统
 多CPU并非多任务操作系统的必备硬件,单CPU可运行多任务 优点:资源利用率高,由于内存中装入了多道程序,使资源一直处于使用状态,从而使资源得到了充分的利用;系统吞吐量大,由于CPU和其他资源一直保持“使用”状态,仅当作业完成或者其他原因时才会进行切换,所以系统开销比较小,吞吐量比较大。 缺点:平均运转周期较长,作业的周转时间是指从作业进入系统开始到完成并退出系统经历的时间,由于作业在外存中要形成“后备队列”,进而内存有优先顺序,因而作业可能很长时间不能运行,所以周期较长;无交互能力,当作业提交给系统后,用户不能再与作业交互,无法修改或者调试。
单道和多道的区别

分时操作系统
多个用户都想要使用计算机,而且需要交互(一定有交互)  分时操作系统是利用分时技术实现多道程序设计的一种操作系统,它允许多个用户同时使用计算机。 分时操作系统使一台计算机能够同时为多个终端用户服务,并保证每个用户有足够快的响应时间,并且还要提供人机交互功能。故,分时操作系统需要使用多道程序设计技术来为多用户服务,使用中断处理技术来进行用户切换。为满足用户交互,还需要有终端命令解释程序来接收用户的命令。将这些命令进行解释并执行还需要操作系统提供系统调用功能。 分时系统具有以下特征: (1)多路性。一台主机上连有多个终端,因此允许多个用户同时共享一台主机,从而显著地提高系统资源的利用率。 (2)独立性。各个用户像独占主机一般,独立地工作,互不干扰。 (3)及时性。系统能按人们所能接受的等待时间(通常为1~3秒)及时响应用户的请求。 (4)交互性。用户能与系统进行广泛的人机对话,以请求系统为他提供诸如文件编辑、数据处理、对数据库的访问以及数据打印等多方面的服务。 分时系统中,分时的第一种含义是及时接收,它属于硬件设计技巧;分时的第二种含义是及时处理,它属于多道程序设计技巧。
实现方式
 为了使多个用户能同时与系统交互,关键的问题是短时间内所有用户程序都能运行
实时操作系统
实时操作系统是系统能及时响应外部时间的请求,并在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致。 实时是指计算机对于外来信息能够以足够快的速度进行处理,并在被控对象允许的时间范围内做出快速响应。因此,实时操作系统与分时操作系统的第一点区别是交互性强弱不同,分时系统交互型强,实时系统交互性弱但可靠性要求高,第二点区别是对响应时间的敏感性强,对随机发生的外部事件必须在被控制对象规定的时间做出及时响应并对其进行处理;第三点区别是系统的设计目标不同,分时系统是设计成一个多用户的通用系统,交互能力强;而实时系统大都是专用系统 设计时应首先验证它的实时性和可靠性,其次才是系统效率。
软实时操作系统
实时信息处理系统
飞机订票系统
银行管理系统
硬实时操作系统
实时控制系统
飞机自动控制系统
自动驾驶系统
网络操作系统和分布式操作系统
网络操作系统
网络操作系统 ,是一种能代替操作系统的软件程序,是网络的心脏和灵魂,是向网络计算机提供服务的特殊的操作系统。借由网络达到互相传递数据与各种消息,分为服务器(Server)及客户端(Client)。而服务器的主要功能是管理服务器和网络上的各种资源和网络设备的共用,加以统合并控管流量,避免有瘫痪的可能性,而客户端就是有着能接收服务器所传递的数据来运用的功能,好让客户端可以清楚的搜索所需的资源。
分布式操作系统
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。系统中存在一个以全局的方式管理计算机资源的分布式操作系统。通常,对用户来说,分布式系统只有一个模型或范型。在操作系统之上有一层软件中间件(middleware)负责实现这个模型。一个著名的分布式系统的例子是万维网(World Wide Web),在万维网中,所有的一切看起来就好像是一个文档(Web页面)一样。
区别
在计算机网络中,每个用户或任务通常只使用一台计算机,若要利用网络中的另一台计算机,则需要远程注册。在分布式计算机系统中,用户进程在系统内各个计算机上动态调度,并根据运行情况由分布式操作系统动态地、透明地将机器分配给用户进程或任务。
运行环境
内核模式和用户模式(处理器的执行状态)
CPU运行的两种程序: 操作系统内核程序:管理程序:执行一系列特权指令 用户自编程程序:应用程序,执行用户指令
内核模式
别名:管态、系统态 能够执行包括特权指令的一切指令,能访问所有的寄存器和存储器 什么是特权指令? 特权指令:如I/O指令,设置中断屏蔽指令,清除内存指令等等 为什么要有特权指令? 为了避免操作系统及其关键数据受到用户程序的破坏 内核模式有哪些东西呢? 时钟管理、中断处理、设备驱动、进程管理、存储器管理、设备管理等等。
用户模式
别名:目态 只能执行规定的指令,只能访问指定的寄存器和存储器
内核模式和用户模式的区别
本质上内核模式和用户模式的区别在于对资源的使用权限有所不同。
用户态程序如何调用内核模式程序
首先,用户态程序不可直接调用内核模式程序。  内核模式程序到用户模式程序有三种方法:中断,异常和系统调用。 主动:由用户模式程序发起-系统调用 被动:不是用户程序发起的-中断和异常
三种转换方式
主动
系统调用
系统调用是用户程序取得操作系统服务的唯一途径,是操作系统提供给应用程序的接口  每一个系统调用子功能称为一个系统调用命令。 因为系统中的各种共享资源都由操作系统统一掌握,这些子功能不能直接让用户程序自己编写调用。  用户程序通过执行陷入指令(访管指令、trap指令)来发起系统调用,请求操作系统提供服务,即用户程序执行访管指令,使CPU的状态由用户模式转化成内核模式,之后由操作系统内核程序再对系统调用请求做出处理。处理完成后,操作系统内核程序再把CPU的使用权还给用户程序(即CPU状态会从内核模式返回用户模式) 用户模式到内核模式,不仅状态需要切换,所用的堆栈也可能需要从用户堆栈切换为系统堆栈。程序运行时要想从用户模式到内核模式,需要通过访管指令,但是访管指令只能在用户模式使用,不是特权指令。
被动
中断和异常
事件来自CPU执行指令外部
中断
中断:也可以叫做外中断,指的是来自CPU执行指令以外的事件发生,如外围设备中断,时钟中断,这类中断通常与当前处理机执行的程序无关。
自愿中断:指令中断
强迫中断
硬件故障
软件中断
事件来自CPU执行指令内部
异常
异常:也可以叫做内中断和陷入,指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算法溢出、虚拟系统的缺页及专门的陷入指令等引起的事件。
外设请求
人的干预
程序的编译、连接和装入
假如我们编写了一个c程序,他从一个源程序如何变成一个进程执行的呢?  
编译
编译:由编译程序将用户源代码编译成若干个模块。
链接
链接:由链接程序将编译后形成的一组目标模块、以及它们所需要的库函数链接在一起,形成一个完整的装入模块。
静态链接
装入程序运行之前,生成可执行文件时进行,将多个目标模块及所需库函数链接成一个整体,以后不再拆开。 时间:生成可执行文件时,装入前
装入时动态链接
将从用户源程序编译后所得的一组目标模块开始装入,采用边装入边链接的方式。 时间:装入时
运行时动态链接
运行时用到了再装入 时间:运行时
注意
注意:三种方式的主要不同点在于链接的时间
装入
装入:由装入程序将装入模块装入内存,构造PCB,形成进程,插入就绪队列准备运行。 装入程序将模块放入内存 ,放入内存后才有物理地址
绝对装入方式
绝对装入:完全按照目标程序中所给定的地址装入内存,程序中使用的是绝对地址,绝对地址来自于程序员。
可重定位方式
用户的目标程序地址往往是从0开始的,而程序中的其他地址也往往用相对地址形式表示,因此采用可重定位装入方式,逻辑地址和物理地址不相同,所以这两种地址需要转换。 重定位指的是装入时对指令地址和数据地址的修改过程。
静态重定位
静态重定位:在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成的,以后不再改变。 静态重定位的缺点: 不允许目标程序运行时在内存中移动位置。 不允许程序运行时动态扩充内存。
动态重定位
动态重定位:动态运行的装入程序把装入模块装入内存之后,并不立即把装入模块的逻辑地址进行转换,而是把这种地址转换推迟到程序执行时才进行,装入内存后的所有地址都仍是逻辑地址。这种方式需要寄存器的支持,其中放有当前正在执行的程序在内存空间中的起始地址。
动态运行时装入方式
动态运行时装入又称动态重定位装入,在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址都仍是相对地址。为使地址转换不影响指令的执行速度,这种方式需要特殊硬件的支持。
程序运行时内存映像与地址空间
①代码段
代码段由程序中执行的机器代码组成。程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器指令,并由处理器依次处理。
②只读数据段
只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表的操作,由于这些变量不会被更改,因此只要放置在只读存储器中即可。
③已初始化读写数据段
已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器空间,在程序执行时他们需要位于可读写的内存区域,并具有初值,以供程序运行时读写。
④未初始化数据段
未初始化数据段是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器空间。
⑤堆
堆内存只在程序运行时出现,一般由程序员分配和释放。在具有操作系统的情况下,如果程序没有释放,操作系统可能在程序(例如一个进程)结束后进行回收内存。
⑥栈
栈内存只在程序运行时出现,在函数内部使用的变量、函数的参数以及返回值将使用栈空间,栈空间由编译器自动分配和释放。
体系结构
无结构
主要任务是功能实现和系统高效,不考虑操作系统的结构性。
缺点
庞大杂乱,缺乏清晰的程序结构。 程序错误多,调试难、阅读难、理解难、维护难。
特点
由众多的过程直接构成。 各过程之间可任意相互调用。 操作系统内部不存在任何结构,又称为整体系统结构。
模块化结构
遵循20世纪60年代出现的结构化程序设计方法。
缺点
模块及接口划分较困难。 未区别共享资源和独占资源。 管理差异导致OS结构不够清晰。
优点
提高了OS设计的正确性、可理解性和可维护性。 增强了OS的可适用性。 加速了OS的开发过程。
分层式操作系统
特点
每一步设计都建立在可靠的基础上,结构更清晰。 调试和验证更加容易,正确性更高。 按分层式结构设计的基本原则,将OS划分为若干个层次。 每一层都只能使用其底层所提供的功能和服务。 从硬件开始,在其上一层一层、自底向上增添相应功能对应的软件。
微内核结构操作系统
适用于分布式系统环境,支持多处理机运行的操作系统。 实例:Windows 2000/XP,Mach OS 在OS内核中只保留最基本的功能,将其它服务分离出去,形成“客户/服务器”模式。客户进程可通过内核向服务器进程发送请求,以取得OS的服务。操作系统分为两部分: 微内核 多个服务器
特点
足够小的内核:操作系统最基本的部分。 基于“客户/服务器”模式。 应用“机制与策略分离”原理。
优点
提高了系统的可扩展性。 增强了系统的可靠性。 可移植性强。 提供了对分布式系统的支持。 融入了面向对象技术。
缺点
系统效率降低。
刷题笔记
缺页时的调页操作
缺页时候的调页操作需要对硬件操作,需要通过操作系统的特权指令来操作,其只能在核心态下执行
系统调用表的本质
为方便系统调用处理,操作系统内部设立存有系统调用号与子程序入口地址映射关系的系统调用表。系统调用表指明了操作系统各项服务所对应的程序的位置,该表实际上是一个索引表。实现方式是使用函数指针数组。数组的下标为系统调用号,服务程序的地址为数据的内容项,是一个函数指针。
Linux
Linux操作系统是免费的且是开放源代码的多用户多任务类型的操作系统,其内核的创始人是Linus Torvalds,Linux可以自由修改和发布,所以linux是一个"Free Software"
Spooling技术
Spooling技术是一种虚拟外部设备技术,它可以把一台独占设备改造成虚拟的共享设备,当进程所需的物理设备不存在或被占用的情况下,仍可使用该设备。Spooling技术是用于解决资源互斥和提高设备利用率的关键技术,但不是提高单机资源利用率的关键技术。
虚拟内存技术
虚拟内存技术主要指内存的虚拟化,它具有请求调页功能和内存置换功能。虚拟内存技术是能把作业的一部分装入内存就可以运行作业的内存管理系统。它是能从逻辑上对内存容量进行扩充的一种虚拟存储技术。虚拟内存技术是提高内存利用率的关键技术而不是提高单机资源利用率的关键技术。
交换技术
交换技术(Swapping)是指在多个程序并发执行时,换出,可以将暂时不能执行的程序从内存换到外存中,从而获得内存空间装人新程序;换入,将保存在外存中而处于就绪状态的程序装入内存。交换技术是解决内存容量不足的矛盾而不是提高单机资源利用率的关键技术。
多道程序设计技术
多道程序设计技术是提高单机资源利用率,特别是处理机的利用率的关键技术。
寄存器清零指令
对于不同状态的程序来说,有不同的寄存器可操作,用户态可以把自己运算可以操作的寄存器清零,系统态可以把全部可清零的寄存器清零,所以不能单凭清零的动作判断是在用户态还是系统态。
java软件的层次结构
由低到高依次为操作系统->JVM->java类库->java应用程序
Linux操作系统部分命令
1.more命令:用于查看内容较多的纯文本文件,格式:more [选项] 文件。 2.tail命令:用于查看纯文本文档的后 N行或持续刷新内容,格式:tail [选项] [文件]。 3.head命令:用于查看纯文本文档的前 N行,格式: head [选项] [文件]。 4.chmod命令:用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。
时钟中断服务程序
当定时器产生时钟中断后,由时钟中断服务程序更新的部分内容包括内核中时钟变量的值、当前进程占用CPU的时间和当前进程在时间片内的剩余执行时间
异常的处理
内中断不能被屏蔽,一旦出现应立即处理,故内部异常的响应发生在指令执行过程中
外部中断的数据保存
外部中断处理过程,PC值由中断隐指令自动保存,而通用寄存器内容由操作系统保存。
软中断指令
INT指令为 软件中断指令,是CALL指令的一种特殊形式,call指令调用的子程序是用户程序的一部分,而INT指令调用的则是操作系统或者BIOS提供的特殊子程序。 INT n就好像是调用子程序,只不过其调用的是中断处理程序。
缺页异常
缺页指的是当软件试图访问已映射在虚拟地址空间中,但是并未被加载在物理内存中的一个分页时,由中央处理器的内存管理单元所发出的中断。
CPU处理中断过程
系统开销
系统开销指的是运行操作系统程序对系统进行管理而花费的时间和空间。批处理操作系统中,系统开销指除处理作业外的时间。
多道批处理系统程序执行总时间
多道批处理系统程序执行总时间=作业时间+系统开销
多道程序设计的基本特征
制约性、间断性、共享性
单道程序设计的基本特征
封闭性和顺序性
键盘输入过程
从键盘输入,直接输入到内存缓冲区,并不是先输入到磁盘。
系统响应时间
系统响应时间,是计算机对用户的输入或请求作出反应的时间,包括处理机对请求信息进行处理的时间、从键盘输入的请求信息传送到处理机的时间、所形成的响应回送到终端显示器的时间等
操作系统的加载
系统开机后,操作系统的程序会被自动加载到内存中的系统区,这段区域是RAM
滑动窗口协议帧序号范围
帧序号的数字范围是0到窗口大小。
API
应用程序界面,定义为应用程序可用以与计算机操作系统交换信息和命令的标准集。一个标准的应用程序界面为用户或软件开发商提供一个通用编程环境,以编写可交互运行于不同厂商计算机的应用程序。
操作系统部分功能
API创建、线程管理
操作系统提供的服务(系统观点)
资源分配、资源管理、程序执行控制等
通道数据传输过程
通道完成一次数据传输的主要过程分为如下三步: 在用户程序中使用访管指令进入管理程序,由CPU通过管理程序组织一个通道程序,并启动通道。 通道执行CPU为它组织的通道程序,完成指定的数据输入输出工作。 通道程序结束后向CPU发中断请求,CPU响应这个中断请求后,第二次进入操作系统,调用管理程序对中断请求进行处理。
IEEE 754标准下非规格化浮点数
在IEEE 754标准中,非规格化浮点数表示为,阶码为0,尾数为任意非0二进制数
个人电脑主流桌面操作系统
WindowsMac OS,Linux
原语
原语是原子操作,在执行过程中不允许被中断。原语在管态下执行。
UNIX操作系统的诞生
1969年,美国贝尔实验室的K.Thompson和D.M.Ritchie在规模较小及较简单的分时操做系统MULTICS的基础上开发出的UNIX,1970年正式投入使用。
联机命令接口
联机命令接口:用户在字符显示方式的命令行界面通过键盘输入系统命令(如dos的dir命令,Linux的ls命令等)
平均周转时间
每个作业自到达内存直至完成的时间的平均值
程序状态字寄存器
中断处理一定会保存,而子程序调用不需要保存其内容
虚拟机
虚拟机 (Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,虚拟机的基本思想是单个计算机(CPU、内存、磁盘、网卡等)的硬件抽象为几个不同的执行部件,所以会给人一种感觉每个独立的执行环境都在自己的计算机上面运行一样。其实目前的一些虚拟机软件就是将物理硬件抽象为独立的然后给虚拟机运行。每个虚拟机都有其自己的虚拟CPU、内存、磁盘驱动、网络接口等。 有了虚拟机,可以在并行的运行不同的执行环境下(即不同的操作系统)能够共享相同的硬件,虚拟机软件本身需要一定的磁盘空间去提供虚拟内存,解决方法就是提供虚拟磁盘就是系统通过在物理磁盘上为虚拟磁盘分配所需要的磁道数,磁道就是当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。 虚拟机上并非所有的指令都能够直接在硬件上执行。
计算机系统的二级存储
计算机系统的二级存储包括主存储器和辅助存储器
不同速度设备间传送数据
可用同步方式,也可以用异步方式
关中断
关中断即就是将允许中断触发器EI置'0'。这一系列的操作都是由CPU硬件自动完成,是机器中没有的指令,所以称为中断隐指令。
计算机启动首先执行代码
PC启动时,首先要做的就是执行BIOS引导程序。而系统BIOS的启动代码首先要做的事情就是进行POST(Power On Self Test,加电自检)。POST的主要任务是检测系统中的一些关键设备是否存在和能否正常工作,如内存和显卡等。
多重处理
多核模式下,同时在每个cpu上运行程序
I/O中断
输入/输出中断是来自通信或各种外部设备的中断,用以反馈通信或设备的工作状况。凡是输入/输出设备引发的中断都是输入/输出中断。
存储映像图
改变存储映像图只能在核心态下执行
在单处理机环境下的多道程序设计
在单处理机环境下的多道程序设计具有多道、宏观上同时运行和微观上交替运行的特点
现代操作系统的新功能
(1)系统安全。现代操作系统采用认证技术、密码技术、访问控制技术以及反病毒技术等多种有效措施,确保计算机系统中存储和传输数据的保密性、完整性和系统可用性。 (2)网络的功能和服务。现代操作系统提供网络通信、网络资源管理和应用互操作等功能,以支持用户联网取得各类网络所提供的服务。 (3)支持多媒体。现代操作系统提供接纳控制和实时调度等功能,采取适当的多媒体文件存储方式,以保证系统能像处理文字、图形信息那样,去处理音频和视频等多媒体信息。
缺页中断处理算法
最佳置换算法(OPT):是从主存中移出永远不再需要的页面,如无这样的页面存在,则选择最长时间不需要访问的页面; 先进先出置换算法(FIFO):是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰,因为最早调入主存的页面不再被使用的可能性最大。
CC_NUMA结构
NUMA:所谓NUMA(Nonuniform-Memory- Access),即非统一内存访问(也称非一致存储访问)。在这种结构的多处理机系统中,其访问时间随存储字的位置不同而变化,系统中的公共存储器和分布在所有处理机的本地存储器共同构成了系统的全局地址空间,可被所有的处理机访问。 CC-NUMA:对于NUMA多处理机结构,为每个CPU再配备各自的高速缓存是为了减少CPU对远程内存的访问。 将每个CPU配备各自的高速缓存的结构称为CC-NUMA
多处理机操作系统相比单机操作系统的新特征
与单机操作系统不同,多处理机操作系统具有并行性、分布性、机间的通信和同步性和可重构性等新特征。
自旋锁和信号量
自旋锁和信号量均可用来实现进程互斥,单处理机系统中不适合用自旋锁;在多处理机系统中,当临界资源被占用时间非常短暂时比较适合用自旋锁,否则更适合用信号量。 在多处理机操作系统中,常为互斥共享的资源设置一把自旋锁,该锁最多只能被一个内核进程持有。在进程请求相应资源时,它先请求自旋锁,如果锁未被占用,那么进程便能访问相应资源;否则,如果锁已被其他进程占用,那么请求锁的进程会—直循环测试锁的状态(即自旋),直到锁被释放为止。 自旋锁适合用在互斥资源被占用时间较短的情况下,此时,阻塞并进行进程切换所花费的开销会比自旋更大,使用自旋锁的效率就会远高于需要阻塞的信号量机制。
网络操作系统模式
网络操作系统有多种模式,传统的小型LAN常采用两层的客户/服务器模式, 大型企业网中应采用三层的客户/服务器模式, 而在基于Internet的Intemet内部网络中,则应采用浏览器/服务器模式。 网络操作系统模式分类: 1.集中模式 集中式网络操作系统是由分时操作系统加上网络功能演变的。系统的基本单元是由一台主机和若干台与主机相连的终端构成,信息的处理和控制是集中的。UNIX就是这类系统的典型。 2.客户机/服务器模式 这种模式是最流行的网络工作模式。服务器是网络的控制中心,并向客户提供服务。客户是用于本地处理和访问服务器的站点。 3.对等模式 采用这种模式的站点都是对等的,既可以作为客户访问其它站点,又可以作为服务器向其他站点提供服务。这种模式具有分布处理和分布控制的功能。
网络操作系统的功能
网络操作系统最基本的功能是数据通信,此外还应具有网络管理、应用互操作和系统容错等功能。 为在不同的计算机之间实现数据传输,网络操作系统应具有以下功能:连接的建立与拆除;报文的分解与组装;传输控制(发送-等待方式、连续发送方式);流量控制;差错的检测与纠正。
信息的互通性与互用性
信息的互通性是指在不同网络结点间实现通信。目前主要利用TCP/IP实现信息互通。 信息的互用性是指在不同网络中的站点间实现信息的互用,即一个网络中的用户能访问另一个网络文件系统或数据库系统中的文件或数据。
回显
回显是指终端处理程序将用户从终端键盘输入的每个字符送屏幕显示。用软件方式来实现回显可以使它更方便、更灵活。
系统调用参数传递方式
将系统调用参数传递给内核函数有多种方式,MS-DOS采用将参数送入寄存器的方式,Unix则常采用参数表方式,有的系统还可以通过陷入指令自带参数方式来传递少量的参数。
现代计算机的并行操作
并行操作是为提高资源利用率而实施的,其中用户程序与用户程序;操作系统程序与用户程序;计算程序与I/O程序的并行操作已成为现代计算机系统的基本特征
DOS操作系统基本组成
DOS操作系统基本部分包括系统引导程序、命令处理程序、基本输入/输出程序、磁盘操作管理程序
操作系统最早出现时间
前两代的批处理计算机和多道程序计算机并不含有操作系统的概念。直到第三代的分时系统才提出了操作系统的概念。因此操作系统最早出现在第三代计算机。
前台和后台作业
在分时和批处理系统结合的操作系统中引入了前台和后台作业的概念,其目的是为了提高CPU的利用率。 在批处理系统兼分时系统的系统中,往往由分时系统控制的作业称为前台作业,而由批处理系统控制的作业称为后台作业。
通用操作系统
通用操作系统:具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。
UNIX的shell
UNIX的shell有两层含义,一是指由shell命令组成的shell命令语言,二是指命令的解释程序。
局部性原理
程序在一个短的时间内运行时,程序的执行仅限于某个部分;相应地,它所访问的存储空间也局限于某个区域,此现象是局部性原理。 局部性原理是指程序在执行时将呈现出局部性规律,即在一个较短的时间内,程序的执行仅局限于某个部分。 时间局限性:如果程序中的某条指令一旦执行,则不久以后该指令可能再次执行,如果某数据被访问过,则不久以后该数据可能再次被访问 空间局限性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范闱之内,其典型便是程序的顺序执行。
临界资源
临界资源:一次仅允许一个进程使用
地址映射
程序装入存储空间时逻辑地址到物理地址的转换过程
单体内核
单体内核是一个提供操作系统应该提供的功能的大内核,包括调度、文件系统、网络、设备驱动程序、存储管理等。内核的所有功能成分都能够访问它的内部数据结构和程序。
文件的组织形式
同一文件在不同的存储介质上必定用不同的组织形式。
设备的独立性
设备的独立性是指用户程序使用的设备与实际使用哪台设备无关的一种特性。
引入多道程序技术的前提
系统具有中断功能。
第2章 进程管理
进程
进程的基本概念和特征
程序的执行方式
程序(一个进程独占处理器)的顺序执行
在早期无操作系统及单道批处理系统时,程序的顺序执行是指一个程序的若干程序段在执行时必须按照某种先后次序执行,仅当前一段程序执行完后才能执行后一段程序,即必须按照前驱图的顺序执行。
前驱图
有向无环图,用于描述进程或程序各部分之间的执行顺序。 节点:表示一个进程、程序段,或一条语句。 有向边:表示两个节点之间存在前趋、后继关系。 如果进程Pi和Pj之间存在前趋后继关系,可表示为Pi→Pj,即Pj开始执行之前Pi必须完成 Pi是Pj的直接前趋 Pj是Pi的直接后继  初始节点:前趋图中不存在前趋的节点,如P1。 终止节点:前趋图中没有后继的节点,如 P8。 每个节点还可有一个权重,表示该节点所含有的程序量或程序的执行时间。
程序顺序执行的基本特性
程序顺序执行的基本特性:顺序性、封闭性、可再现性 顺序性:处理机严格按照程序所规定的顺序执行,即任一操作必须在下一个操作开始之前结束。 封闭性:程序在封闭环境中运行。 可再现性:只要程序执行时的环境和初始条件相同,都可获得相同的执行结果 程序运行时独占全机资源。 资源的状态(除初始状态外)只有本程序才能改变。程序一旦开始执行,其执行结果不受外界因素影响 缺点:系统吞吐量小。资源利用率低。
程序的并发执行
程序的并发执行:多道程序技术使得不存在前驱关系的程序或程序段间有可能“同时”执行,而并发执行在提高系统性能的同时,也为程序的执行带来不确定性。 多道程序环境下,在一段时间内,宏观上有多道程序在同时执行。 单处理机系统中,每一时刻只有一道程序执行,故微观上多道程序分时交替执行。
特征
间断性:并发执行的程序共享全机资源,相互制约,一个程序的执行过程未必连续。 失去封闭性:任一程序的执行受其他并发程序影响。 不可再现性:任一程序的执行结果受并发程序的总体执行速度影响。 
优缺点
优点 系统吞吐量大。 资源利用率高。 缺点:程序之间互相制约,正确性保证难度大。
进程的定义
进程:程序在某数据集上的一次执行,是系统进行资源分配和调度的独立单位。
作用
为使程序能够并发执行,并能对并发程序加以描述和控制,引入进程概念。
与程序的区别

结构特征
结构特征:由进程控制块(PCB)、程序、数据三部分组成。(程序的内存映像和地址空间章节)
动态性
进程最基本的特征,一次执行过程,具有生命周期。
并发性
多个进程实体同存于内存,且能在一段时间内同时运行。
独立性
能够独立运行、独立分配资源和独立接受调度的基本单位。
异步性
按各自独立的、不可预知的速度向前推进。
进程的状态和转换
进程有哪些状态
就绪(后备)
进程已获得除CPU之外的所有必需资源,一旦得到CPU控制权,可以立即运行。
执行
进程已获得运行需要的所有资源,对应程序正在处理机上执行。
阻塞
正在执行的进程由于发生某事件而暂停执行,放弃处理机而处于的状态,又称等待状态。
进程的状态如何转换
 执行->阻塞:主动 阻塞->就绪:被动
进程控制
主要负责进程状态的改变,一般由操作系统内核中的原语来体现。
操作系统内核
操作系统中和硬件密切相关的模块(如中断处理程序)、常用设备驱动程序、运行频率较高模块(时钟管理、进程调度)等紧靠硬件的软件层,并常驻内存,称为OS内核。 设置目的 便于对内核软件的保护,防止遭受其他程序破坏。 提高操作系统运行效率。
创建进程
通过操作系统调用进程创建原语完成。
创建进程的过程
申请空白PCB,填写控制和管理进程的信息。 为新进程分配资源:含各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。 初始化PCB。 如果进程就绪队列能够接纳新进程,则将新进程按某种策略插入就绪队列。
引起进程创建的事件
用户登录
分时系统中,用户登录成功后,系统将为其建立一个进程并插入就绪队列。
作业调度
多道批处理系统中,作业调度程序将后备队列的某作业调入内存,为其创建进程,并插入就绪队列。
提供服务
运行中的进程提出某请求,比如打印数据,系统将创建一个进程为用户提供服务。
应用请求
用户进程自己创建的进程,如输入数据,处理数据,显示结果等,为使各操作并发执行,加快任务的完成速度,用户进程可创建输入进程、数据处理进程、输出进程。
终止进程
进程完成任务或发生意外,将被终止。 注:终止态的进程以后不能再执行,但在操作系统中保留一个记录,保存状态码和一些计时统计数据,供其他进程收集。一旦其他进程完成了对其信息提取之后,操作系统将删除该进程,即将其PCB清零,并将该空白PCB返还系统。
进程终止过程
根据被终止进程的标识符,从PCB表中检索出该进程的PCB,读出该进程的状态。 若被终止进程处于执行状态,应立即终止其执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。 若被终止进程还有子孙进程,应同时终止其所有子孙进程。 将被终止进程所拥有的全部资源归还其父进程或系统。 将被终止进程的PCB从所在队列/链表中移出,归还系统/加入空闲PCB列表。
引起进程终止的事件
正常结束
进程执行到自然结束点。
异常结束
出现了无法克服的错误。 越界错误:超出允许访问的范围。 异常结束:出现了无法克服的错误。 保护错:试图访问不允许访问的资源,或以不适当方式访问允许访问的资源。 非法指令:不正确的指令,或不允许使用的指令。 特权指令错:用户程序试图执行只允许操作系统执行的指令。 运行超时:运行时间超出约定值。 等待超时:等待时间超出约定值。 算术运算错:被除数为0 I/O故障:外设出错。
外界干扰
某种原因被操作系统或其他有终止权的进程终结,如发生死锁。
含创建及终止的进程状态转换图

挂起/激活进程
进程执行期间由于某事件的发生将被挂起或激活。处于执行状态的进程被挂起后将暂停执行,处于就绪态的进程被挂起后将暂停处理机调度。与挂起对应的是激活。 挂起目的:便于系统和用户观察和分析进程。 挂起效果:活动状态变静止状态(激活效果反之)。 运行状态转为暂停执行状态。 就绪状态转为暂不接受调度状态。 阻塞状态转为暂不接受所需事件状态。
挂起进程
引起进程挂起的事件
终端用户需要
终端用户在其程序运行期间希望暂停执行,以观察中间结果,分析执行问题时,可将进程挂起。
父进程请求
父进程希望考察或修改某子进程,或协调诸子进程之间的活动,可挂起若干进程。
负荷调节的需要
实时系统为保证实时性,可由系统将不重要进程挂起,确保实时系统的正常运行。
操作系统的需要
操作系统需要检查资源使用情况或记账时,可挂起部分进程。
挂起/激活操作增加的进程状态
活动就绪
活动就绪:未被挂起的就绪状态。
静止就绪
挂起、不接受调度的就绪状态。
活动阻塞
未被挂起的阻塞状态。
静止阻塞
挂起、暂不接受所需事件的阻塞状态。
挂起/激活原语导致的进程状态转换
挂起原语Suspend导致的进程状态转换
活动就绪→静止就绪 活动阻塞→静止阻塞
激活原语Active导致的进程状态转换
静止就绪→活动就绪 静止阻塞→活动阻塞
含挂起的进程状态转换图

含创建、终止和挂起的进程状态转换图

进程阻塞
进程阻塞过程
立即停止被阻塞进程的执行。 将被阻塞进程PCB的现行状态由“执行”改为“阻塞”。 将被阻塞进程的PCB插入等待事件对应的阻塞队列。 调度程序重新进行调度,按某种策略将处理机分配给另一个就绪进程,使其进入执行态。 按照新执行态进程的PCB相关信息设置CPU环境。
引起进程阻塞的事件
注:进程通过调用阻塞原语将自己阻塞,即自我阻塞。
请求共享资源失败
正在运行的进程向系统申请资源得不到满足,无法继续运行,而进入阻塞状态。
等待某操作完成
系统启动某操作后,需等待该操作完成才能继续运行时,进入阻塞状态。
新数据尚未到达
相互合作的进程,需要等待数据的一方只能处于阻塞状态,待所需数据到达后可由阻塞转为就绪。
等待新任务的到达
完成任务后即进入阻塞状态,待新任务到达被唤醒。比如网络环境下,完成数据包发送功能的发送进程,将所有数据包发送完毕后即进入阻塞状态,新数据包到来后,再被唤醒。
进程唤醒
进程被动唤醒
被阻塞进程所等待的事件发生,则由相关进程调用唤醒原语,将等待该事件的进程唤醒。
引起进程唤醒的事件
请求的共享资源被释放
等待的操作完成
需要的数据到达
等待的新任务到达
进程唤醒过程
将被阻塞进程从阻塞队列移出。 将被阻塞进程PCB中的现行状态由“阻塞”改为“就绪”。 将被阻塞进程PCB按某种策略插入就绪队列。 block原语和wakeup原语是一对作用相反的原语,使用时必须成对出现。被阻塞进程通过自我调用block原语来实现的阻塞,而wakeup原语则是相关进程调用来实现唤醒。在信号量机制中,一般通过PV原语来实现进程的阻塞和唤醒。
进程的层次结构
操作系统允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,而把被创建的进程称为子进程。子进程可继续创建更多的孙进程,由此形成进程的层次结构,组成进程家族关系,其中子进程可继承父进程的所有资源。
进程图
描述进程家族关系的有向树,其中双亲节点为父进程,孩子节点为父进程创建的进程。 
PCB
进程控制块:PCB,进程存在的唯一标志。 为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(ProcessControl Block)。 PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息。OS是根据PCB来对并发执行的进程进行控制和管理的。进程在执行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也都需要访问PCB。当进程由于某种原因而暂停执行时,又须将其断点的处理机环境保存在PCB中。 PCB可以被操作系统中的多个模块读或修改,如被调度程序、资源分配程序、中断处理程序以及监督和分析程序等读或修改。由于PCB经常被系统访问包含一些频率很高的进程及分派程序访问,故PCB应常驻内存。系统将所有的PCB组织成若干个链表(或队列),存放在操作系统中专门开辟的PCB区内。 Linux系统中用task_struct数据结构来描述每个进程的进程控制块,Windows操作系统中则使用一个执行体进程块(EPROCESS)来表示进程对象的基本属性。
资源信息表
操作系统为所有资源均设置了特有的数据结构,用于表征对应实体,称为资源信息表。 进程:进程控制块PCB(进程存在的唯一标志)。 内存:分区表、页表、段表等。 设备:设备控制表DCB等。 文件:文件控制块FCB等。 磁盘文件:位示图等。
作用
独立运行基本单位的标志:系统为新创建的进程建立PCB,直至终止才撤销其PCB。PCB是进程存在的唯一标志。 实现间断性运行方式:PCB可保存CPU现场信息,能够保证多道程序环境下程序走走停停的间歇式运行方式的正确性。 实现与其它进程的同步与通信:PCB包含信号量、通信区域、通信队列指针等用于进程同步和通信的信息。 提供进程管理所需要的信息:PCB记录了进程对应的程序和数据的内存或外存的地址、进程运行所需资源清单,操作系统可根据PCB记录的信息对进程进行控制和管理。 提供进程调度所需要的信息:PCB记录了进程的状态、优先级、等待时间、执行时间等进程调度需要的信息。
内容
进程标识符:唯一标识一个进程,类似学号(内部标识符)和姓名(外部标识符)。 处理机状态:又称处理机的上下文,指处理机中的各寄存器内容。 进程调度信息:存放与进程调度/对换有关的信息,如进程当前状态,进程优先级,阻塞原因等。 进程控制信息:用于进程控制所必须的信息,如程序和数据的地址,进程同步和通信机制,资源清单等。
进程标识符
用于唯一地标识一个进程。一个进程通常有两种标识符:内部标识符、外部标识符。 内部标识符,在所有的操作系统中,都为每一个进程赋予了一个唯一的数字标识符,方便系统使用。 外部标识符,由创建者提供,通常由字母、数字组成。往往由用户(进程)在访问该进程时使用。为了描述进程的家族关系,还应设置父进程标识以及子进程标识等。
处理机状态
主要由处理机的各种寄存器中的内容组成的。主要四个寄存器:通用寄存器、指令计数器、程序状态字PSW、用户栈指针 通用寄存器,又称用户可视寄存器,它们是用户程序可以访问的,用于暂存信息。 指令计数器,存放了要访问的下一条指令的地址。 程序状态字PSW,含有状态信息如条件码、执行方式、中断屏蔽标志等 用户栈指针,每一个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址,栈指针指向该栈的栈顶。
进程调度信息
存放一些与进程调度和进程对换有关的信息。 进程状态,指明进程的当前状态,作为进程调度和对换时的依据。 进程优先级,用一个整数描述进程使用处理机的优先级别。 进程调度所需的其他信息,这些信息与所采取的进程调度算法有关。比如进程已等待CPU的时间总和等。 事件,指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因。
进程控制信息
程序和数据的地址,指进程的程序和数据所在的内存或外存地址,以便再调度到该进程执行时,能从PCB中找到其程序和数据。 进程同步和通信机制,指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等。 资源清单,一张列出除CPU以外的、进程所需的全部资源及已经分配到该进程的资源的清单。 链接指针,给出本进程PCB所在队列中的下一个进程的PCB的首地址。
PCB的组织方式
线性表方式
将所有PCB都放到一个表(连续的线性存储区)中 
索引表方式
建立索引表和阻塞索引表,用指针连接 索引方式:对于各种状态的PCB,先建立相应索引表,并把各索引表在内存中的首地址记录在内存的专用单元中,通过索引表查找某PCB。相比链接方式,索引方式可以更快地找到所需PCB。 
线程
进程中某个单一顺序的控制流,也称为轻量进程,是进程中的一个实体,作为系统调度和分派的基本单位。 线程和进程一样具有生命期,因创建而产生,由调度而执行,随终止而消亡。
线程的引入背景
引入背景:进程的引入解决了单机环境下的程序并发执行问题,线程引入的目的在于提高程序并发执行的速度。具体引入原因如下: 减少程序并发执行时的时空开销:由于进程是资源拥有者,因此其创建、撤销和切换时的开销较大,多处理机环境下尤其显著。 提高操作系统的并发性:进程操作开销大,限制了系统的进程数量,而且进程切换也不宜过于频繁,进一步限制了并发程度的提高。 注:进程既是资源的拥有单位,又是资源的调度和分派单位;线程将这两个属性分开。
线程的实现方式
不同操作系统的线程实现方式各不相同。
用户级线程
在用户空间中实现,线程的创建、撤消、同步与通信等功能均无需内核支持,内核不知道用户级线程的存在
优点
优点如下。 线程切换不需要转换到内核空间,切换开销小。 每个进程可以使用专用调度算法,对所属线程进行管理。 用户级线程的实现和操作系统无关,线程管理代码属于用户程序的一部分,所有应用程序均可共享。
缺点
处理机调度以进程为单位进行,诸进程包含的线程数不一定相同,在时间片轮转算法中,不同进程中的每个线程获得的处理机时长不等。 系统调用的阻塞问题:基于进程机制的操作系统中,大多数系统调用将使进程阻塞。因此,当线程执行某系统调用时,将使所在进程的所有线程全部阻塞。而内核支持线程方式,进程中的其它线程仍然可以运行。 单纯的用户级线程实现方式中,多线程应用不能利用多处理机进行多重处理的优点,内核每次给一个进程分配一个CPU。因此,进程中仅有一个线程能执行,在该线程放弃CPU之前,同进程的其它线程只能等待。
内核级线程
所有进程(系统进程和用户进程)均在操作系统内核支持下运行,内核支持线程也在内核支持下运行。内核根据TCB感知线程存在,线程所有操作均在内核空间实现。当前大多数操作系统均支持内核支持线程。 内核支持线程是指由操作系统内核创建和撤销,内核维护进程及线程的上下文信息以及线程切换。
优点
多处理器系统中,内核能够同时调度同一进程的多个线程并行执行。 如果进程的一个线程被阻塞,内核可以调度该进程的其它线程占有处理并运行,也可以运行其它进程中的线程。 内核支持线程具有很小的数据结构和堆栈,线程的切换比较快,切换开销小。 内核本身也可以采用多线程技术,以提高系统的执行速度和效率。
缺点
缺点如下。 由于用户进程的线程在用户态运行,而线程调度和管理在内核实现,所以同一进程中的两个线程之间进行切换需要从用户态转核心态,系统开销较大。
线程状态
和进程类似。 注:多线程操作系统中的进程是拥有资源的基本单位,但不是可执行实体。线程具有和PCB类似的TCB,用于记录所有控制和管理线程的信息。
执行状态
线程已获得处理机,正在运行。
就绪状态
就绪状态:仅缺处理机的线程状态。
阻塞状态
执行中因某事件受阻而处于的暂停状态。
线程创建
应用程序在启动时,通常仅有一个线程在执行,称为“初始化线程”,主要用于创建新线程。 创建新线程需要利用线程创建函数(或系统调用),并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小,以及用于调度的优先级等。 线程创建函数执行后,返回线程标识符。
线程终止
线程完成了自己的任务,或在运行过程中出现异常情况而被强行终止时,由终止线程通过调用相应函数(或系统调用)对其执行终止操作。 有些线程,如系统线程,一旦被创建便一直运行不被终止。 大多数操作系统的线程被终止后并不立即释放所占有的资源。 只有当进程中的其它线程执行了分离函数后,被终止的线程才与资源分离,资源可被其他线程利用。 已被终止但未释放资源的线程可被其他线程调用,重新恢复执行。
线程和进程的对比
进程是资源拥有、调度、分配单位;线程是资源调度、分派单位。 进程调度需要上下文切换,而同进程内的线程之间切换不需要上下文切换,时空开销小。 进程拥有独立资源,同进程的各线程共享进程大部分资源,每个线程仅有必不可少、能保证独立运行的少量资源。 进程和线程都具有并发性。 进程之间的独立性高于同进程内不同线程之间的独立性。 多处理机系统中,每个进程只能运行于一个处理器,而进程内的各线程可分布于多个处理器,并行执行。 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
1)地址空间和其它资源(如打开文件)
进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信
线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换
线程上下文切换比进程上下文切换要快得多。同─进程内各线程间切换由于有许多上下文相同而简化。
4)
在多线程OS中,进程不是一个可执行的实体
调度
调度的基本概念
调度的本质是资源分配方式。在多道程序环境下,系统具有一个处理机,内存存在多个作业,每个作业对应多个进程。 处理机调度是将处理机资源分配给其中一个处于就绪态的进程、使之处于运行态的方法。 在多道程序系统中,进程只有通过处理机调度后,才可以获得处理机而执行。但一般情况下,进程的数量都远远比处理机的个数多,如何将处理机分配给进程是操作系统的核心问题。
为什么要进行调度(调度目标)
处理机调度目标
资源利用率高:使所有资源处于尽可能忙的状态。 公平性:使所有进程根据其特征获得合理的CPU时间。公平是相对概念,进程特征不同,合理的时间长度也不同。 平衡性:根据内存诸进程各自的特点,合理调度,使得系统所有资源处于尽可能忙的状态,避免部分资源忙,另一部分资源闲的情况发生,保持系统资源使用的平衡性。 策略执行性强:哪怕影响效率,所有策略也要在需要时立刻执行。
批处理系统调度目标
平均周转时间短 周转时间T:作业从提交到系统至完成之间的时间间隔。 等待调度时间:外存后备队列等待作业调度的时间。 就绪队列等待时间:作业调度成功后进入就绪队列等待进程调度的时间。 执行时间:进程被调度成功后,在 CPU上的运行时间。 等待I/O时间:进程执行过程中等待I/O的时间。 作业希望自己的周转时间最短。 操作系统希望能所有作业的平均周转时间最短。 有效提高系统资源利用率。 使大多数用户满意。 带权周转时间:周转时间和执行时间的比,能够更清晰地描述每个进程的周转时间中,等待时间和服务时间的占比。 平均周转时间为所有作业需要的周转时间的平均值。 系统吞吐量高:尽量选择短作业运行。 吞吐量:单位时间内系统所完成的作业数。 吞吐量和批处理作业的平均长度及调度算法有关。 处理机利用率高:尽量选择计算量大的作业运行。处理机利用率是衡量系统性能的重要指标。 调度方式和算法对处理机利用率具有重要作用。
分时系统调度目标
响应时间快:分时操作系统中调度算法的主要准则。从键盘提交一个请求到屏幂显示处理结果的时间间隔含以下部分。 请求时间:从键盘输入请求信息到处理机接收到请求信息的时间。 处理时间:处理机处理请求信息的时间。 回送时间:响应信息送回显示器的时间。 均衡性:系统响应时间的快慢与用户所请求服务的复杂性相关,即用户尤其对复杂任务的响应时间较长,简单任务的响应时间较短。
实时系统调度目标
截止时间的保证:截止时间是某任务必须开始执行的最迟时间,或必须完成的最迟时间,保证截止时间是实时系统的主要目标。 硬实时周期任务HRT:必须确保。 软实时非周期任务SRT:基本保证。 可预测性:连续性的保障,如视频处理中第i帧和第i+1帧具有连续性,所以可预测。
三种调度
高级调度(作业调度)
批处理系统中,将外存上后备队列中的某些作业调入内存,为其创建进程,分配资源、插入就绪队列;作业运行结束,回收所分配的系统资源,撤销相应数据结构(如作业控制块JCB)的过程。 分时系统和实时系统中,为做到及时响应,作业被直接送入内存,不需作业调度。
中级调度(内存调度/交换调度)
引入目的 提高内存利用率。 提高系统吞吐量。 短期平滑和调整系统负荷(主要指内存资源)。 引入中级调度是为了提高内存利用率和系统吞吐量。即系统把内存中暂时阻塞的进程调到外存等待。 在内存使用紧张的情况下,将暂不具备运行条件的进程挂起,释放其所占内存资源,调至外存。 内存空闲区满足挂起状态的某进程需求时,由中级调度算法决定把外存上的、具备运行条件的某挂起进程重新调入内存。 换出至外存的进程状态可能为就绪,也可能是阻塞,由于换至外存后处于挂起状态(即静止就绪或静止阻塞状态),故不能参与低级调度(进程调度)。
低级调度(进程调度/线程调度)
将处理机分配给就绪队列中的某进程。 最基本的调度,操作系统的核心部分。 批处理操作系统、分时操作系统、实时操作系统等必备功能。
进程调度的三个步骤
1.保存处理机的现场信息 2.按基础算法选取进程 3.把处理器分配给进程 所以进程调度应包括排队器、分派器及上下文切换机制三大基本机制
排队器
为了提高进程调度的效率,在系统中,所有的就绪进程按照一定的方式排成一个或多个队列,以便调度程序能快速地找到它。
分派器
进程调度程序将选定的进程从就绪队列中取出。
上下文切换机制
对处理机进行切换时,会出现两次的上下文切换,系统首先保存当前进程的上下文,装入分派程序的上下文,最后移出分派程序。把选中的进程的CPU现场信息装入各个对应的寄存器。
三种调度间的关系(比较)
执行频率:高级调度<中级调度<低级调度。 低级调度是各类操作系统都必备的功能。 多道批处理系统:既有高级调度(作业调度),又有低级调度(进程调度),也可以采用中级调用。 分时、实时系统或具有虚拟存储器的操作系统中,为提高内存利用率和作业吞吐量,一般没有高级调度,只有低级调度,并专门引入中级调度。
调度准则
面向用户
周转时间:尽量短。 响应时间:尽量快,分时系统选择调度算法的重要准则。 截止时间:尽量满足,实时系统选择调度算法的重要准则。 优先权准则 通过给不同的任务设定不同的优先级,并根据优先级的高低进行调度,以便让紧急任务能够得到及时处理的准则。 某些特殊要求的系统,如实时系统,可能采用抢占式调度方式保证紧急任务得到及时处理。 优先权准则可应用于批处理系统、分时系统和实时系统。
面向系统
吞吐量:单位时间内系统完成的作业数尽量多。 CPU利用率 某段时间内CPU处于忙状态的时间百分比。 不同时间段,CPU的利用率可能不同。 CPU利用率是影响系统性能的一个重要指标,主要应用于低级调度。单用户系统或实时系统中,该准则并不重要。 系统资源平衡利用:尽可能使系统的所有资源处于忙碌状态。 公平性:没有特殊要求时,应平等对待系统中的各调度对象。
调度算法
作业调度
1)批处理系统中,作业是进程的任务实体,进程是作业的执行实体。 2)没有作业进程无事可做,没有进程则作业无法完成。 3)作业多用于批处理操作系统,进程则用于多道程序设计。 批处理作业从预输入到缓输出需要经历的状态转换图,包含三个阶段,四个状态。  提交状态:作业的信息正由输入设备预输入。 后备状态:作业预输入结束,且已放入外存,但尚未被作业调度算法选中。 执行状态:作业已被作业调度算法选中,进入内存,并生成进程。 完成状态:作业已运行结束,或撤离,正等待缓冲输出运行的结果。
作业
用户提交给操作系统的一个独立任务。
作业步
每个作业必须经过若干相对独立、相互关联的加工步骤才能得到结果,其中每个加工步骤称为作业步。如一个作业可分成编译、链接、装入和运行这4个作业步,上一个作业步的输出往往是下一个作业步的输入。
作业控制块JCB
为管理和调度作业,在多道批处理系统中,为每个作业设置了一个作业控制块,JCB是作业存在的标记,含系统对作业进行管理和调度的全部信息。如作业标识、用户名称、用户账号、作业类型(CPU繁忙型、I/O 繁忙型等)、作业状态、调度信息(优先级、作业运行时间)、资源需求(预计运行时间、要求内存大小)、资源使用情况。JCB的作用如下: 1)作业进入系统,由作业注册程序为其建立JCB,插入作业后备队列等待作业调度程序调度其进入内存。 2)作业运行期间,系统按照JCB的信息对作业进行控制和管理。 3)作业运行结束,系统回收其占用资源,撤销其JCB。
分时系统的作业和进程
1)系统启动时通过与系统连接的终端,为每一个终端创建一个终端进程来接收终端用户的作业处理要求。 2)终端进程执行命令解释程序,从终端设备读入用户提交的命令并解释执行。 3)分时系统中用户可以通过命令解释程序逐条输入命令,提交一个作业或作业步。 4)分时系统的作业提交是一次用户上机交互过程。因此可把终端进程的创建看作一个交互作业的开始。 (1)分时系统通过命令解释程序应答式地逐条输入命令。 (2)对于每一条终端命令,系统为其创建一个子进程。 (3)如果当前提交的是一条后台命令,则可以与下一条中断命令并行处理。 (4)各个子进程在运行过程中可以根据自己的需要创建子孙进程。 (5)终端命令对应的进程结束后,对命令的处理随之结束。
作业调度的任务
根据作业JCB信息,检查系统资源满足哪些作业需求。 按照某作业调度算法,从作业后备队列选择资源得到满足的若干作业调入内存。为调入内存的作业创建进程、分配必要资源。 新创建进程插入进程就绪队列,等待进程调度,使之执行。
作业调度需要决定的事情
接纳多少作业 由多道程序度决定。 多道程序度由系统规模、运行速度、作业大小、系统性能等因素决定。 接纳哪些作业 由作业调度算法决定。 分时系统、实时系统为满足及时响应,不需作业调度,但需要某种接纳措施控制进系统的用户数量。
作业调度算法
在OS中调度的实质就是一种资源分配策略,因此,调度算法是指根据系统的资源采用某分配策略对资源进行分配的方式方法。为实现不同的系统目标采用不同的调度算法。常见的经典调度算法如下。
先来先服务(FCFS)调度算法
FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度,也可以用于进程调度。在作业调度中,该算法调度是按照先来先服务的方式将最先进入就绪队列的作业最先分配处理机而运行,直到完成或因某种原因而阻塞时才释放处理机。  先来先服务(First Come First Served,FCFS):以等待时间为优先级的调度方法。从后备作业队列中选择一个或多个最先进入该队列的作业调入内存,为其分配资源、创建进程,然后放入就绪队列。 FCFS属于调度算法属于不可剥夺算法。从等待时间上看,它是相对公平的。但它对短作业来说,如果之前有长作业先占有CPU,则短作业就会等待很长时间。因此在分时系统和实时系统的一般不采用此调度算法。 特点:算法简单,但效率低;对长作业比较有利,但对短作业不利;有利于CPU繁忙型作业,而不利于I/O繁忙型作业
短作业优先(SJF)调度算法
短作业优先调度算法是指对短作业(进程)优先调度的算法。SJF调度算法是从外存后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行,直到完成或等待某事件发生而阻塞时,才释放处理机。  短作业优先(Short Job First,SJF):以运行/计算时间为优先级,优先将运行/计算时间短的作业调入内存,是优先权调度算法的一种特例。 SJF调度算法有以下几点不可忽视的缺点: 该算法对长作业不利,由表2.3、表2.4可知,SJF调度算法中长作业的周转时间会增加。例如,如果有一个长作业进入系统的后备队列,由于调度程序总是优先调度短作业,将导致长作业长期不被调度,可能会出现“饥饿”现象。 没有考虑作业的紧迫程度,因而不能保证紧迫性作业会得到及时处理。 由于作业的长短只是根据用户所提供的估计执行时间而定的,而用户有可能会有意或无意地缩短其作业的估计运行时间,致使此算法不一定能真正做到短作业优先调度。注意:SJF调度算法的平均等待时间、平均周转时间最少。
优先权调度算法
优先权调度算法(Priority Scheduling Aigorithm,PSA):以外部赋予作业的紧迫性程度为优先级的调度方法,批处理操作系统和实时操作系统均可用。
高响应比优先调度算法
优先权(响应比)=(等待时间+要求服务时间)/要求服务时间=1+等待时间/要求服务时间。
进程调度
进程调度是对系统性能影响最大的调度。 进程调度的任务 保存处理机的现场信息:保存的前进程的效果信息,如程序计数器内容、程序状态字等。 按某种调度算法选取进程:从就绪队列选取一个进程,状态改运行。 将处理器分配给选中的进程:将处理器分配给选中的进程。 
进程调度机制

排队器
将系统中所有的就绪进程按照一定方式排成一个或多个队列。 当进程状态变为就绪时,排队器将其插入相应就绪队列。 目的:提高进程调度效率。
分派器
将进程调度程序所选定的进程从就绪队列中取出,进行上下文切换并将处理机分配给新选中进程。
上下文切换器
处理机进行将发生两次上下文切换: 1.保存当前进程的上下文,装入分派程序的上下文,以便分派程序运行。 2.移出分派程序,把新选中进程的CPU现场信息装入处理机的相应寄存器中。 注:上下文切换需要较大系统开销,可用两套寄存器,通过修改指针指向不同套寄存器完成上下文切换。
进程调度方式
非抢占式
系统将处理机分配给当前就绪队列的某进程后,便一直执行下去,直到完成。引起进程调度的因素。 正在执行的进程运行完毕。 发生某事件导致当前运行进程无法继续运行。 正在执行的进程因I/O请求暂停执行。 进程通信或同步过程中,执行了某种原语,导致其停止执行。
抢占方式
允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机分配给另一进程。抢占原则如下。 优先级原则:为紧迫的作业赋予较高的优先级,这种作业到达系统或由阻塞状态被唤醒后,若其优先级高于当前正在运行的进程的优先级,可以剥夺其CPU,立即投入运行。 短进程优先原则:若一个进程到达系统,其运行时长比当前运行的进程运行时长明显小,则剥夺当前运行进程的CPU,立即投入运行。 时间片原则:在时间片轮转算法中,CPU轮流为诸多进程服务,每个进程用完自己的时间片后,系统自动将CPU交给下一个进程使用。
进程调度算法
简单时间片轮转调度算法
分时操作系统为保证响应用户请求的及时性,通常采用基于时间片的轮转进程调度算法。(是绝对抢先的算法)
原理
简单时间片轮转调度算法:原理 1.操作系统将所有就绪进程按FCFS原则排成一个队列。 2.将CPU分配给队首进程,并令其执行一个时间片(大小从几ms到几百ms)。 3.时间片用完即停止该进程的执行,将其送往就绪队列的末尾。 4.重复2和3。
进程切换时机
进程切换时机 1.若一个时间片尚未用完,正在运行的进程便已经执行完毕。 立刻激活进程调度程序,将该进程从就绪队列中删除。 调度就绪队列的队首进程运行,同时启动一个新的时间片。 2.时间片用完,进程还没执行完毕。 调度程序将其插入就绪队列末尾。 激活计时器中断处理程序,启动一个新的时间片。
时间片大小确定
时间片大小确定 时间片的大小对系统性能具有很大影响。 小时间片有利于短作业运行,但对于大作业则增加了进程调度和上下文切换的开销。 大时间片有利于长作业运行,但会使算法退化为FCFS。 可行方法为时间片略大于一次典型交互时间。
特点
确保就绪队列的所有进程在一定时间内均能获得一个时间片的处理机执行时间。 系统能在给定时间内能够响应所有用户的请求。 注:单处理机系统中的先来先服务调度算法经常和其他调度算法结合使用。
多级反馈队列调度算法
设置多个就绪队列。 各队列赋予不同的优先级:第一个队列优先级最高,其后队列优先级依次降低。 各个队列中进程执行时间片的大小设置规则为:优先权越高时间片越短。  新进程进入内存 1.放入第1个队列的末尾,按FCFS 原则排队等待调度。 2.轮到该进程执行时 若它能在该时间片内完成,则可准备撤离系统。 若它在一个时间片结束时尚未完成,则调度程序将该进程转入第2队列的末尾,按FCFS原则等待调度执行。 若它在第2队列中运行一个时间片后仍未完成,则将它放入第3队列,......。重复,直至降至第n个队列。 3.仅当第1队列空闲时,调度程序才调度第2队列中的进程运行。 4.仅当第1~i-1队列均空闲时,才会调度第i队列中的进程运行。 5.当处理机正在为第i个就绪队列的某进程服务时,第1~i-1队列有进程进入,则立即停止正在运行的进程,将其插入第i个就绪队列的末尾,并将处理器分配给新进入的高优先级进程。
优点
优点(较好满足各种类型用户需要)。 终端型作业用户:大多属于较小的交互性作业,只要能使作业在第1队列的时间片内完成,便可令用户满意。 短批处理作业用户:周转时间仍然较短,至多在第2到3队列即可完成。 长批处理作业用户:将依次在1~n级队列中轮转执行,不必担心作业长期得不到处理。
特性
资源利用率高;响应速度快;系统开销大;并行度高。
优先级调度算法
静态优先权
创建进程时确定,在进程的整个运行期间保持不变。确定进程优先权的依据如下。 进程类型:一般系统进程高于用户进程。 进程对资源的需求:进程的估计时间及内存需求量少的进程赋予较高优先权。 用户要求:由用户进程的紧迫程度及用户所付费用的多少来确定优先权。
动态优先权
在创建进程时所赋予的优先权可以随进程的推进或随其等待时间的增加而改变。
优点
批处理操作系统中可避免长进程长时间占用CPU。 分时操作系统中,只有抢占式有可能实现人机交互。 实时操作系统中,抢占式能满足实时任务需求。
缺点
复杂。 系统开销大。
多队列调度算法
系统中设置多个就绪队列。 相同类型或性质的进程处于同一就绪队列。 同一就绪队列的各进程可以有不同的优先级。 不同就绪队列可以有不同优先级、采用不同调度策略。 优点:满足不同用户的不同需求。
多处理机系统
可为每个处理机设置一个就绪队列。 不同处理机可采用不同调度策略。 可将一个进程的多个线程分配在一个处理机上。 可将一组需要合作的进程或线程分配到一组处理器对应的多个就绪队列,使其能够同时获得处理机执行。 优点:满足不同用户的不同需求。
进程同步
进程同步的基本概念
进程对系统的影响
引入进程可使多道程序并发执行,同时使系统环境变得复杂。 有效改善资源利用率。 显著提高系统的吞吐量。 进程对系统资源的无序争夺不加管理的话会造成系统混乱。
进程同步
为保证多个进程能够有条不紊工作,需要引入同步机制,对多个相关进程的执行顺序进行协调,合理使用资源。 某进程未获得合作进程发来消息之前等待,消息到来之后可继续执行的合作关系。
进程同步的主要任务
使并发执行的诸进程之间能有效共享资源和相互合作,从而使程序的执行具有可再现性。
进程间的相互制约关系
多道程序环境下,同一系统的多个进程,由于共享相同资源,或为完成一个任务而相互合作,具有如下两种制约关系。
间接制约
资源共享引起。为保证进程的有序执行,这类资源由系统统一分配,用户使用之前必须向系统提出申请,不可直接使用。
直接制约
进程合作引起。
临界资源
一次仅允许一个进程访问的资源,如打印机、公共变量等。对临界资源采用互斥方式访问。
临界区
进程中访问临界资源的代码段。访问临界区的程序设计模式如下: 
临界区访问示例

实现临界区互斥的基本方法
进程互斥
两进程不能同时进入同一临界资源的临界区,互斥关系。
同步机制
实现进程间同步/互斥的方法。遵循的规则如下。 空闲让进:无进程进入临界区,则允许一个请求进去临界区的进程进入。 忙则等待:有进程位于临界区,其他预进入的进程需等待。 有限等待:预进入临界区的进程,应在有限时间内有机会进入临界区。 让权等待:进程无法进入自己临界区时,应立即释放处理机。
软件方法
在访问临界资源的临界区时,临界区的前后分别有进入区和退出区,在进入区要设置和检查一些标志来显示是否有进程已经进入临界区中,如果已有进程占有临界区,则在进入区通过循环检查进行等待,当进程释放资源离开临界区后,在退出区进行访问临界区的标志修改。
1)单一标志法
该算法是设置一个公用整型变量turn,用来表示允许进入临界区的进程编号,即若turn=0,则允许P进程进入临界区,否则循环检查当前允许进入临界区的编号是否与自己的进程编号一致,如一致,则允许进程进入临界区,否则还继续等待。当该进程完成资源访问并释放临界资源后,再退出去修改允许进入临界区的标志为下一个要访问临界区的进程编号。例如两个进程P0,P1通过单一标志法来访问同一临界资源过程如下:  该方法可以保证对临界资源互斥地访问,但该算法存在的主要问题是,两个进程必须交替次序进入临界区,这样很容易造成“空闲等待”的现象,如当进程P0退出临界区后将turn置为1,以便允许进程P1进入临界区,但如果进程P1暂时不需要访问该临界资源,这样允许P0进入临界区的标志就不能得到满足,进而P0无法再次进入临界区访问临界资源,严重违背了“空闲让进”的同步机制准则,造成资源无法利用充分。
2)双标志法先检查
算法的基本思想是每个进程在访问临界区资源之前,先查看一下临界资源是否正被访问,若正被访问,该进程需等待;否则,进程才进入自己的临界区。为此,该算法设置了一个数据flag[i],该数据是为了显示第i个进程是否进入临界区,如第i个元素值为FALSE,表示Pi进程未进入临界区,值为TRUE,表示Pi进程进入临界区。算法思路:如果两个进程Pi和Pj在进入临界区访问临界资源之前,先判断一方是否已经进入临界资源,如果是,另一方就进入等待,否者进入临界区,并标志flag[]的状态为true。例如下面一段代码:  本算法改进后,本算法不用交替进入临界区,可以连续使用,解决了上一算法违背“空闲让进”的问题。本算法的缺点是当两个进程都未进入临界区时,它们各自的访问标志都为FALSE,若此时刚好两个进程同时或时间允许范围内都想进入临界区,在进入区前,两个进程都检查发现对方的标志值为FALSE,这时两个进程同时进入了各自的临界区违背了同步机制准则“忙则等待”。例如:上面算法按照①②③④执行时,会同时进入临界区(违背“忙则等待”)。即在检查对方flag之后和切换自己flag之前有一段时间,结果都检查通过。
3)双标志法后检查
“双标志法先检查算法”的算法思想是先检查另一方的进程是否进入临界区的状态标志,然后再设置自己的状态标志。由于进程在检测和放置中可插入另一个进程到达的这一个时间段,可能会造成两个进程在分别检测后,出现了两个进程同时进入临界区的问题。在“双标志法后检查算法”中,状态标志结构和上一算法类似,不同之处是本算法的设计思想是在检查对方进程是否进入临界区的状态标志之前先设置自己标志为TRUE,如果检查到对方状态标志为TURE,则本进程等待;否则进入临界区。  本算法解决了上一算法的两个进程同时进入临界区的现象。但有可能存在两个进程都进不了临界区的问题。例如,当两个进程同时想进入临界区时,它们首先分别将自己的状态标志设置为TRUE,然后再去检查对方的状态,各自发现对方已经占有临界区,则将自己处于等待状态。结果两个进程同时处于等待状态无法进入临界区访问临界资源。造成“死等”现象,违背了同步机制“有限等待”的准则。
4)Peterson's Algorithm
本算法综合了“双标志法先检查”和“双标志法后检查”的优点,为了避免两个进程同时处于无限期等待而无法进入临界区,又增加了一个变量turn,用来表示是否允许进入临界区的进程标识。  该算法保证两个进程同时要求进入临界区时,只允许一个进程进入临界区,实现完全正常工作。本算法通过flag[]状态标志完成互斥的访问临界区,通过变量turn解决了两个进程同时进入临界区的问题,避免了“饥饿”现象。
硬件方法
利用软件方法解决多进程互斥进入临界区问题,有一定难度且局限性较大。当前计算机系统提供特殊硬件指令解决临界区问题。
关中断
实现互斥最简单的方法之一。过程如下。 关中断:进入临界区之前关中断。 进入临界区:进程在临界区执行期间,系统不响应中断,从而不会引发调度,也就不会发生进程的切换,进而有效地保证了进程互斥进入临界区。 开中断:退出临界区之后打开中断。
缺点
滥用关中断权力可能导致严重后果。 关中断时间过长,会影响系统效率,限制处理器交叉执行程序的能力。 不适用于多CPU系统:因为在一个处理器上关中断并不能防止进程在其它处理器上执行相同的临界区代码段。
两个硬件指令
TestandSet
boolean TestAndSet (boolean* lock) { boolean old; old = *lock; *lock = true; return old; } 借助硬件指令测试并建立TS指令实现互斥的方法,过程如下。 为每个临界资源设置布尔变量lock,初值为FALSE,表示临界资源空闲,取值为TRUE时表示临界资源不可用。 利用TS实现互斥。 do{ ... while TS(&lock); // 若lock为FALSE,则可进入临界区,并将其值设置为TRUE。 critical section; // 临界区 lock=FALSE; // 出临界区,lock设置为FALSE remainder section; // 非临界区 }while(TRUE);
Swap
Swap (boolean* a, boolean* b) { boolean temp; temp =*a; *a = *b; *b = temp; } 对换指令,用于交换两个字的内容,可简单有效地实现互斥。 为每个临界资源设置布尔变量lock,初值为FALSE,表示临界资源空闲,取值为TRUE时表示临界资源不可用。 每个进程中设置一个局部布尔变量key,用于和 lock交换值。 缺点:当临界资源繁忙时,其他访问进程必须不断测试,处于忙等状态,不符合让权等待原则,造成处理机时间浪费,同时很难解决复杂同步问题。 利用swap实现互斥 do{ key=TRUE; do { swap (&lock, &key); // 交换lock和key的值 } while (key!=FALSE); // key不为FALSE,则一直循环测试 critical section; // 临界区 lock=FALSE; // 出临界区,lock设置为FALSE remainder section; // 非临界区 } while (TRUE);
信号量
表示资源数量信息,信号量机制由“信号量”和“PV操作”两部分组成,用于解决n个进程的临界区互斥使用,进程同步,实现前趋关系。
整型信号量
S表示可使用资源数量。除初始化外,仅能通过两个原子操作(不可中断)进行访问。 注:整型信号量的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。 V操作:signal(S) s=S+1; Р操作:wait (S) while (S<=0) do nop; S=S-1; P、V操作是一种低级进程通信原语,可以解决一切互斥问题,但不能用来防止死锁
记录型信号量
整型变量value表示可用资源数,进程链表L用来链接所有等待进程。 注:采取“让权等待”策略,存在多个进程等待访问同一临界资源情况。 typedef struct{ int value; linkProcess L; }semaphore; Р操作:wait(S) S.value=S.value-1; if S.value<0 block(S.L); V操作:signal(S) S.value=S.value+1; if S.value<=0 wakeup(S.L);
信号量应用
实现进程同步
同步问题是多个进程合作的过程。假设进程P1和P2并发执行。其中P1中有一条语句S1,P2中有一条语句S2,要求S1,必须在S2之前执行。为了实现同步,在实现算法中增加一条变量S,表示进程P1、P2同步的公共信号量,初值为0。具体流程如下: semaphore S=0; P1(){ S1; V(S); } P2(){ P(S); S2; }
实现进程互斥
假设有进程P1和P2并发执行,两者有各自的临界区,但系统要求每次只能有一个进程进入自己的临界区。因此采用信号量实现互斥:设置一个表示可用资源数的信号量S,初值为1(因为只有一个资源),要实现两进程的互斥进入临界区,只需要将临界区放在P(S)和V(S)间即可。具体流程如下: semaphore S=1; P1(){ P(S); 临界区 V(S) } P2(){ P(S); 临界区 V(S) }
实现前驱关系
设有两个并发执行的进程P1和P2。P1中有语句S1,P2中有语句S2,希望S1执行后执行S2,可利用信号量实现P1和P2之间的约定执行顺序。具体流程如下: semaphore S; S =0; P1: S1; signal(S); P2: wait(S); S2;
信号量的取值范围
假设一共三个进程,而只允许两个进程进入,则S的最大值为2,若三个进程都没申请资源,则S=2;若三个进程同时申请资源,则S=-1,所以S的范围为[2,-1]。
进程通信
进程之间的信息交换(进程直接知道对方)
低级通信
进程之间进行通信的数据量极少,如进程的互斥与同步。特点如下。 效率低:生产者每次只能向缓冲池投放一个产品/消息,消费者每次只能从缓冲区中取得一个消息。 对用户不透明:操作系统只为进程之间的通信提供了共享存储器。
高级通信
用户直接利用操作系统提供的一组通信命令高效地传送大量数据的通信方式。
共享存储器系统
相互通信的进程共享某些数据结构或存储区,进程之间通过共享空间进行通信。
消息传递系统
进程间的数据交换以格式化消息(如报文)为单位进行。
管道通信
“管道”指用于连接一个读进程和一个写进程,以实现二者之间通信的共享文件,又称 pipe 文件。须提供以下协调能力。 互斥:当某进程正在对pipe执行读/写操作时,其它进程必须等待。 同步:写/输入进程和对pipe的同步使用。 确定对方是否存在,只有确定了对方已存在时才进行通信。
管程
管程的定义
微处理机通过计算机系统对各种硬件资源和软件资源进行管理,为此,所有的软硬件资源均可用数据结构抽象地描述其资源特性,其他的资源信息只是用少量信息和对资源所执行的操作来表征该资源,却没有资源的内部结构和实现细节。 管程是由一组局部的变量对局部变量进行操作的一组过程以及对局部变量进行初始化的语句序列构成的一个软件模块。
管程的组成
如图所示,管程的组成包括以下几个方面: 1)管程的名称的定义; 2)局部于管程的共享结构数据说明; 3)对该数据结构进行操作的一组过程; 4)对局部于管程的共享数据设置初始值的语句。 
管程的基本特性
1)管程内的局部变量只能被局限于管程内的过程所访问;反之亦然,即局部于管程内的过程只能访问管程内的变量。 2)任何进程只能通过调用管程提供的过程入口进入管程。 3)任一时刻,最多只能有一个进程在管程中执行。保证进程互斥进入管程是由编译器负责,即管程是一种编程语言的构件,它的实现需要编译器的支持。 4)管程中引入了面向对象的思想。
管程与进程的区别
管程和进程不同,主要体现在以下几个方面: 1)数据结构定义目的及使用的范围不同。进程定义的是私有数据结构PCB,管程定义的是公共数据结构,如消息队列等。 2)对各自数据结构上的操作不同。进程是由顺序程序执行有关的操作,而管程主要是进行同步操作和初始化操作。 3)引入的目的不同。引入进程的目的在于实现系统的并发性,而引入管程则是解决共享资源的互斥使用问题。 4)工作方式不同。进程通过调用管程中的过程对共享数据结构实行操作,该过程就如通常的子程序一样被调用,因而管程为被动工作方式,进程则为主动工作方式。 5)并发性不同。进程之间能并发执行,而管程则不能与其调用者并发。 6)作用不同。进程具有动态性,由“创建”而诞生,由“撤销”而消亡,而管程则是操作系统中的一个资源管理模块,供进程调用。
经典同步问题
生产者-消费者问题
例1
一组消费者和一组生产者,利用1个缓冲区为n。 一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界资源,它只允许一个生产者放入消息,或者一个消费者从中取出消息。 ①进程之间的关系分析。生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。
算法设计
生产者-消费者进程的算法设计如下: semaphore mutex=1; // 访问缓冲区的互斥信号量 semaphore empty=n; // 空闲缓冲区,当为n时,表示缓冲区空闲个数为n semaphore full=0; // 缓冲区初始化为空,当full为n,表示缓冲区满 producer(){ // 生产者进程 while(1){ produce an item in nextp; // 生产数据 P(empty); // 获取空缓冲区单元 P(mutex); // 进入临界区 add nextp to buffer; // 将数据放入缓冲区 V(mutex); // 离开临界区,释放互斥信号量 V(Full); // 满缓冲区数加1 } } consumer(){ // 消费者进程 while(1){ P(full); // 获取满缓冲区单元 P(mutex); // 进入临界区 remove an item from buffer; // 从缓冲区中取出数据 V(mutex); // 离开临界区,释放互斥信号量 V(empty); // 空缓冲区数加1 consume the item; // 消费数据 } }
例2
多类生产者和多类消费者,利用一个缓冲区为1。 桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。只有盘子为空时,爸爸或妈妈就可向盘子中放一个水果;仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出。
算法设计
semaphore plate=1, apple=0, orange=0; dad() { // 父亲进程 while(1){ prepare an apple; P(plate); // 互斥向盘中取、放水果 put the apple on the plate; // 向盘中放苹果 V(apple); // 允许取苹果 ) ) mom(){ // 母亲进程 while(1){ prepare an orange; P(plate); // 互斥向盘中取、放水果 put the orange on the plate; // 向盘中放橘子 V(orange); // 允许取橘子 ) ) son(){ // 儿子进程 while(1){ P(orange); // 互斥向盘中取橘子 take an orange from the plate; V(plate); // 允许向盘中取、放水果 eat the orange; ) ) daughter() { // 女儿进程 while(1){ P(apple); // 互斥向盘中取苹果 take an apple from the plate; V(plate); // 运行向盘中取、放水果 eat the apple; ) )
哲学家进餐问题
哲学家进餐问题是指环绕一张桌子坐着5位哲学家就餐,桌子上仅有5根筷子,且5根筷子分布在每两个哲学家中间。哲学家在进餐期间只做两个动作:进餐和思考。在进餐时,哲学家需要同时拿起他左边和右边的两根筷子,在思考时,哲学家将同时将两根筷子放回原处。其时哲学家进餐问题可以看作并发进程访问临界资源的一个典型问题。其中,筷子是临界资源,两个哲学家不能同时使用一根筷子。 解决思路:一是让哲学家们能同时拿到两根筷子;二是制定每位哲学家的动作规则,所有的动作按着规则执行。 信号量定义及置初值。对筷子用一个信号量数组chopsticks [5]=(1,1,1,1,1}来表示,用于对5个筷子的互斥访问。其中哲学家序号按顺序编号为0~4,且哲学家i左边筷子的编号为i,哲学家右边筷子的编号为(i+1)%5。 具体算法实现如下:
算法设计1
semaphore chopstick[5] ={1,1,1,1,1}; // 定义信号量数组chopstick[5],并初始化 philosopher(int i){ // i号哲学家的进程 while(1){ P(chopstick[i]); // 取左边筷子 P(chopstick[(i+1)%5]); // 取右边筷子 eat; // 进餐 V(chopstick[i]); // 放回左边筷子 V(chopstick[(i+1)%5]); // 放回右边筷子 think; // 思考 } } 该种方法可以实现互斥,但是当5个哲学家同时就餐时,每个哲学家拿到左手边的筷子,再拿右手边筷子时,所有的筷子已经被占有,所有哲学家处于等待阻塞,从而导致死锁的现象。要解决此问题,需要对哲学家进餐做一些限制条件。具体的方法如下: ①在同一时间内,最多允许4位哲学家进餐。 ②每位哲学家在进餐前,确保其左右两边的筷子同时可用时,他才拿起筷子进餐。 ③对哲学家按顺时针进行编号,并规定奇数号的哲学家先拿左边筷子,偶数号的哲学家先拿右边筷子。
算法设计2
下面采用第二种方法,并设置取筷子的信号量mutex,初值为1,用于表示筷子的互斥量。具体算法实现如下: semaphore chopstick[5] = {1,1,1,1,1}; // 初始化信号量 semaphore mutex=1; // 设置取筷子的信号量 philosopher(int i){ // i号哲学家的进程 while(1){ P(mutex); // 在取筷子前获得互斥量 P(chopstick [i]); // 取左边筷子 P(chopstick[(i+1)%5]); // 取右边筷子 V(mutex); // 释放取筷子的信号量 eat; // 进餐 V(chopstick[i]); // 放回左边筷子 V(chopstick[(i+1)%5]); // 放回右边筷子 think; // 思考 } }
算法设计3
// 采用第三种方法的具体算法实现 semaphore chopstick[5]={1,1,1,1,1}; // 初始化信号量 philosopher(int i)//i=1,2,3,4,5 { while(1){ think; if(i%2!=0) // 判断是否为奇数号哲学家,若为奇数号哲学家,则先拿左边筷子 { P(chopstick [i]); // 取左边筷子 P(chopstick[(i+1)%5]); // 取右边筷子 eat; V(chopstick[i]); // 放回左边筷子 V(chopstick[(i+1)%5]); // 放回右边筷子 } else // 若为偶数号哲学家,则先拿右边筷子 { P(chopstick[(i+1)%5]); // 取右边筷子 P(chopstick [i]); // 取左边筷子 eat; V(chopstick[(i+1)%5]); // 放回右边筷子 V(chopstick[i]); // 放回左边筷子 } } }
读写者问题
读者和写者问题是一个多用户共享数据库系统的建模问题,即多个用户进程共享一个文件或者主存的一块空间的数据区域,只读取数据区域的进程(读者)同时访问数据区域时不会产生副作用,只允许向数据区域写数据的进程(写者)之间或者写者与读者同时访问数据区域时,可能会有数据不一致的冲突问题。为保证读者与写者能够正确的读写,在访问数据区域时做以下要求: 1)允许多个读者同时对文件或者数据区进行读操作。 2)在同一时刻只允许一个写者向文件或数据区中写信息。 3)在任一个写者完成写操作之前不允许其他读者或写者对文件或数据区操作。 4)写者执行写操作前,应等所有正在对文件或数据区进行读写的读者或写者全部退出。 为解决读者与写者的问题,目前有多种不同的策略,都与优先级有关。 1)读者优先:第一读者-写者问题,写者可能饥饿。 2)排队策略或先来先服务。 3)写者优先:第二读者-写者问题,读者可能饥饿。 4)某个进程既是写者又是读者的问题。
读者优先算法
读者优先是指进程在执行的过程中,如果存在读进程,写进程将被向后推迟,并且只要有读进程处于活动状态,访问文件或数据区域的访问权都会首先分配给读进程。 1)允许多个读者同时对文件或者数据区进行读操作。 2)在同一时刻只允许一个写者向文件或数据区中写信息。 3)在任一个写者完成写操作之前不允许其他读者或写者对文件或数据区操作。 4)写者执行写操作前,应等所有正在对文件或数据区进行读写的读者或写者全部退出。
算法设计
int readercount=0; // 用于记录当前的读者数量 semaphore reader_mutex=1; // 用于保证多个读者对于信号量readercount的互斥 semaphore rw_mutex=1; // 用于保证读者和写者互斥地访问文件 writer() { // 写者进程 while(1){ P(rw_mutex); // 互斥访问共享文件 Writing; // 写入 V(rw_mutex); // 释放共享文件 } } reader() { // 读者进程 while(1){ P(reader_mutex); // 互斥访问count变量 if(readercount==0) // 当第一个读进程读共享文件时 P(rw_mutex); // 阻止写进程写 readercount++; // 读者计数器加1 V(reader_mutex); // 释放互斥变量count reading; // 读取 P (reader_mutex); // 互斥访问count变量 readercount --; // 读者计数器减1 if (readercount ==0) // 当最后一个读进程读完共享文件 V(rw_mutex); // 允许写进程写 V(reader_mutex); // 释放互斥变量count ) ) 该算法可以实现读者和写者的互斥的访问资源,当读进程太多时,会出现写进程进入忙等状态。
写者优先算法
和读者优先问题相比,写作优先要求在读进程正在读共享文件时,如果有写进程请求访问文件,此时会禁止后续读进程的请求访问,等当前正在读共享文件的读进程执行完毕便执行写进程,并且只有在无写进程请求访问的才允许读进程再次运行。为了实现写者优先问题,需另设置一个信号量firstw_metux,初始值为1,实现写优先的互斥信号量。其他分析同读者优先问题。
算法设计
int readercount = 0; // 用于记录当前的读者数量 semaphore reader_mutex = 1; // 用于保护更新count变量时的互斥 semaphore rw_mutex =1; // 用于保证读者和写者互斥地访问文件 semaphore firstw_metux=1; // 用于实现“写优先” writer(){ while(1){ P(firstw_metux); // 在无写进程请求时进入 P(rw_mutex); // 互斥访问共享文件 writing; // 写入 V(rw_mutex); // 释放共享文件 V(firstw_metux); // 恢复对共享文件的访问 } } reader(){ // 读者进程 while(1){ P(firstw_metux); // 在无写进程请求时进入 P(reader _mutex); // 互斥访问count变量 if(readercount ==0) // 当第一个读进程读共享文件时 P(rw_mutex); // 阻止写进程写 count++; // 读者计数器加1 V(reader_mutex); // 释放互斥变量count V(firstw_metux); // 恢复对共享文件的访问 reading; // 读取 P(reader_mutex); // 互斥访问count变量 readercount --; // 读者计数器减1 if(readercount ==0) // 当最后一个读进程读完共享文件 V(rw_mutex); // 允许写进程写 V(reader_mutex); // 释放互斥变量count } } 此算法也能保证读者和写者的互斥及同步关系,但是会出现读者忙等的现象。
编程方法
1分析关系 ①定资源 ②连连看 2设置变量
死锁
死锁的概念
多道程序系统可借助多个进程的并发执行改善系统资源利用率,提高系统的吞吐量,但可能导致死锁。 死锁指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态时,若无外力作用,系统将无法向前推进。
资源分类
是否可重用
可重用性资源
可供用户重复使用多次的资源。性质如下: 每个可重用性资源中的单元只能分配给一个进程使用,不允许多进程共享。 进程须按照如下顺序使用可重用性资源 请求资源:如果请求资源失败,请求进程将会被阻塞或循环等待。 使用资源:进程对资源进行操作。 释放资源:进程使用完可重用性资源后自己释放该资源。 系统中每一类可重用性资源中的单元数量相对固定,进程在运行期间既不能创建也不能删除它。
可消耗型资源
在进程运行期间,可由进程动态地创建和消耗的临时性资源。性质如下: 所有消耗性资源的单元数均可在进程运行期间不断变化。 进程在运行过程中,可以不断地创造可消耗性资源的单元,将它们放入该资源类的缓冲区中,以增加该资源类的单元数目。 进程在运行过程中,可以申请若干个可消耗性资源单元,用于进程自己消耗,并不将其返回该资源类。 由生产者进程创建,消费者进程消耗。
是否可抢占
可抢占性资源
某进程在获得这类资源后,该资源可以再被其它进程或系统抢占。 CPU和内存为常见可抢占性资源。
不可抢占性资源
一旦系统把某资源分配给进程后,就不能将它强行收回,只能在进程用完后自行释放。 磁带、打印机为常见不可抢占性资源。
死锁产生原因
根本原因:作业调度不当和进程推进顺序不当
1)系统资源的竞争
竞争不可剥夺性资源。竞争消耗性资源。
2)进程推进顺序非法
请求和释放资源的顺序不当。
产生死锁的四个必要条件
1.互斥使用
进程对所分配到资源的使用具有排他性,即在一段时间内某资源只由一个进程占用,如果此时还有其他进程请求该资源,则请求者只能等待,直至占有该资源的进程使用完毕将其释放。
2.不可抢占
进程已获得的资源,在未使用完之前,不能被其他进程抢占,只能在使用完时由自己释放。
3.请求保持(占有等待)
进程已经保持了至少一个资源,又提出了新的资源请求,且该资源又被其它进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放。
4.循环等待
发生死锁时,必然存在一个进程——资源的环形链。
死锁预防
通过事先采取某种限制措施,破坏产生死锁产生的必要条件以预防死锁的发生。设置某些限制条件,去破坏产生死锁的四个必要条件的一个或几个,来预防发生死锁。预防死锁是一种较易实现的方法,被广泛使用。
1.互斥使用
由设备的固有条件所决定,不仅不能改变,还应加以保证。
2.破坏“不可抢占”条件
(1)已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,必须释放已经保持的所有资源,以后需要时再重新申请。 (2)特点 实现复杂。 代价较大 进程周转时间加长。 系统开销大 系统吞吐量降低
3.破坏“请求保持”条件
(1)请求资源的进程不可持有不可抢占资源。 (2)通过以下2个协议实现。 协议1(静态资源分配策略) 所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。特征如下: 运行期间不再申请新资源,破坏“请求”条件。 等待期间(不能满足所需全部资源),不会占有任何资源,破坏“保持”条件。 简单安全 资源浪费 经常 发生进程饥饿现象
4.破坏循环等待条件(资源有序分配策略)
(1)对系统所有资源类型进行线性排序,并赋予不同的序号。 (2)进程必须按照序号递增顺序申请资源。 (3)特点 资源序号安排很重要。 比起其他策略,系统资源利用率和吞吐量有明显改善。 问题 资源序号的相对稳定性导致新设备的增加受到限制。 作业使用资源手续和系统资源序号手续未必系统,会导致资源浪费。 限制用户编程。
死锁避免
资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁。 避免死锁比预防死锁施加的限制条件弱。较完善的系统常用此方法避免发生死锁。
系统安全状态
系统能按某种进程顺序(P1,P2,...,Pn)(称<P1,P2,...,Pn>序列为安全序列)为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。 (1)如果系统无法找到这样一个安全序列,则称系统处于不安全状态。 (2)只要处于安全状态就不会发生死锁。 (3)并不是所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进而进入死锁状态。 (4)避免死锁的实质是系统在进行资源分配时,设法使系统不进入不安全状态。 (5)允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。 (6)如果不按照安全序列分配资源,则系统可能会由安全状态进入不安全状态。
银行家算法
四个数据结构 设系统有m类资源,n个进程。
可利用资源数组Available
反映系统各类可利用资源的数量。 m个元素的一维数组。 Available[i]=k表示系统有k个第i类可利用资源。
最大需求矩阵Max
反映所有进程对各类资源的最大需求量。 n*m的二维数组。 Max[i][j]=k表示进程i需要k个第j类可利用资源。
分配矩阵Allocation
反映系统各类资源的分配情况。 n*m的二维数组。 Allocation[i][j]=k表示进程i当前已分配到k个第j类可利用资源。
需求矩阵Need
反映所有进程还需要的各类资源数量。 n*m的二维数组。 Need[i][i]=k表示进程i还需要k个第j类可利用资源。
概要
Max[i][j]=Need[i][i]+Allocation[i][i]
算法描述
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: 如果Requesti[j]≤Need[i,j],转下一步;否则出错。 如果Requesti[j]≤Available[j],转下一步;否则Pi须等待。 系统尝试把资源分配给进程Pi,并修改下面数据结构中的数值: Available[j]=Available[j] - Requesti[j]; Allocation[i][j]= Allocation[i][j]+Requesti[j]; Need[i][j]=Need[i][j] - Requesti[j]; 安全性检测:若给进程Pi分配资源后系统安全,则正式将资源分配给进程Pi,完成本次分配;否则,恢复原来的资源分配状态,进程Pi等待。 设置两个向量 √工作向量Work:含m个元素的一维数组,表示系统可提供给进程继续运行所需的各类资源数。执行安全算法时,Work[i]和Available[i]相等。 √结束向量Finish:含m个元素的一维数组,表示系统是否有足够的资源分配给进程,使之运行完成。初值Finish[i]=false;当有足够资源分配给进程时,令Finish[i]= true。 从进程集合中寻找一个能满足以下条件的进程: √Finish[i]为false √Need[i][j]<=Work[j]; 找到 √进程Pi获得所需资源,顺利执行。 √进程Pi完成执行,释放出分配给它的资源: Work[j]= Work[ij]+Allocation[i][i]; Finish[i]=true; √继续从进程集合中寻找能满足条件的进程。 找不到:若所有进程的Finish[i]均为true则表示系统处于安全状态;否则系统处于不安全状态。
算法示例
初始状态
假定系统中有五个进程{P0,P1,P2,P3,P4},三类资源{A,B,C},各资源的数量分别为10、5、7 
T0时刻的系统安全性检查
P1可分配  P1执行完后,归还资源  P1执行完,P3可分配  P1已结束,P3刚执行完,归还资源 
死锁的检测与解除
死锁检测
允许系统在运行过程中发生死锁,并通过系统所设置的检测机构,及时检测死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当的措施,清除已发生死锁的进程。
检测方法
资源分配图 描述系统死锁情况 (1) G=(N, E),其中G为图,N表示G的结/顶点集合,E表示G的边的集合 (2)N分为两个互斥的子集 进程节点集P={P1, P2.....Pn} 资源节点集R={R1,R2.....Rn} N=P∪R  (3)所有e∈E,均连接P的一个节点和R的一个节点。 (4)e1 = <Pi,Rj≥为资源请求边,表示进程Pi请求一个单位的Rj资源。 (5)e2 = <Rj,Pi>为资源分配边,表示把一个单位的资源Rj分配给进程Pi。 共两个请求边<P1,R2>和<P2,R1>,两个分配边<R2,P2>和<R1,P1>,即E={<P1,R2>,<R2,P2>,<P2,R1>,<R1,P1>}
检测定理
死锁定理 (1)利用简化资源分配图检测当前系统是否处于死锁状态。 (2)简化资源分配图 在资源分配图中找出一个既不阻塞又非独立的进程节点Pi。 顺利情况下,Pi可获得所需资源而继续运行,直至运行完毕。 释放Pi占有的全部资源,相当于消去Pi的请求边和分配边,使之成为孤立的节点。 简化资源分配图的生成。 将(a)中P1的两条分配边和一个请求边消去,形成图(b)所示的简化资源分配图。 P1释放资源后,使P2获得资源而继续运行,直至P2完成后释放出它所占有的全部资源,形成图(c)所示的简化资源分配图,即将P的两条请求边和一条分配边消去。 进行一系列简化后,若能消去图中所有的边,使所有进程节点均成为孤立节点,则称该图是可完全简化的;若不能通过任何过程使该图完全简化,则称该图是不可完全简化的。 
数据结构
(1)可利用资源向量Available:表示m类资源中每一类资源的可用数量。 (2)把不占用资源的进程(向量Allocation=0)记入L表,即L∪L。 (3)从进程集合中找到一个Request[i]<=Work[i]的进程,进行如下处理: 将其资源分配图简化,释放出资源,Work[i]=Work[i]+Allocation[i]。 将它记入L表中。 (4)若不能把所有进程都记入L表,表明系统的当前状态的资源分配图是不可完全简化的。因此,该系统状态将发生死锁。
死锁解除
当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。实施方法为回收一些资源,再将这些资源分配给处于阻塞状态的进程,使之转为就绪状态继续运行。
1)抢占资源
2)撤销/挂起/终止进程
(1)终止所有死锁进程
最简单的方法。 终止所有死锁进程,死锁自然解除。 代价可能会很大:比如其中有些进程可能已经运行了很长时间,接近结束,一旦被终止还得从头再来。
(2)逐个终止进程
按照某种顺序,逐个地终止进程,直至有足够的资源,以打破循环等待,把系统从死锁状态解脱出来为止。 稍微温和的方法。 付出的代价也可能很大 每终止一个进程,都需要用死锁检测算法确定系统死锁是否已经被解除,若未解除还需再终止另一个进程。 采取逐个终止进程策略时,涉及到如何选择待终止的进程。主要依据为死锁解除所付出的“代价最小”而“代价最小”很难精确度量。
死锁处理方法比较

刷题笔记
进程和程序的本质区别
进程是动态执行的,具有异步性;程序是静态存储的,具有可再现性。
进程现场信息
用于存放该进程运行时的处理器现场信息,包括: 用户可见寄存器内容:数据寄存器、地址寄存器; 控制与状态寄存器内容:PC、IR; PSW栈指针内容:核心栈与用户栈指针 不包括进程的就绪、阻塞、执行等基本状态
多线程系统的特长
利用线程并行地执行矩阵乘法运算; Web服务器利用线程请求HTTP服务; 基于GUI的debugger 用不同线程处理用户的输入、计算、跟踪等操作;
键盘响应的实现
键盘响应由系统中断完成,不需要多线程。
可重入函数与不可重入函数
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误; 而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的,因此可重入函数不可以调用不可重入函数。
自动变量
自动变量是局部变量归线程私有,线程之间无法共享,无法访问不同线程的自动变量,因此,不需要保护。
共享存储
共享存储是在内存中开辟出一段空间用于需要通信的进程进行相应的读写信息的操作。尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的; 可以使用shmget函数来创建共享内存; 共享的存储块是临界资源,传递消息过程中的读写信息的控制需要信号量来控制。共享存储方式本身是不提供同步机制的。
用PV操作实现进程同步时信号量的初值
同步是指协同完成任务的多个进程因为需要协调工作次序而等待、传递信息所产生的制约关系。实现同步的信号量的初值应根据具体场景需求来确定。若期望的资源尚未产生,则对应的初值应为0;若期望的资源已经存在,则信号量的初值应设为一个非0的正整数。
进程通信时的消息形式
在消息传递系统中,进程间的数据交换是以消息(在计算机网络中又称为报文)为单位的。消息的一般结构形式有发送进程名、接收进程名、消息长度、消息正文。
线程系统调度占用的时间片
在引入线程的操作系统中,线程是进程中的一个实体,是系统独立调度和分派的基本单位。但是线程自己基本上不拥有系统资源,所以它不是资源分配的基本单位,它只拥有一部分在运行中必不可少的与处理机相关的资源,如线程状态、寄存器上下文和栈等,它同样有就绪、阻寒和执行三种基本状态。它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 由于用户线程不依赖于操作系统内核,因此,操作系统内核是不知道用户线程的存在的,用户线程是由用户来管理和调度的,用户利用线程库提供的API来创建、同步、调度和管理线程。所以,用户线程的调度在用户程序内部进行,通常采用非抢先式和更简单的规则,也无须用户态和核心态切换,所以速度很快。由于操作系统不知道用户线程的存在,所以,操作系统把CPU的时间片分配给用户进程,再由用户进程的管理器将时间分配给用户线程。那么,用户进程能得到的时间片即为所有用户线程共享。因此,系统调度执行时间上占用1时间片。
调度算法设计的基本准则
设计操作系统的调度目标和基本准则主要有以下几点: (1)公平性:确保每个进程都能获得公平的CPU时间片; (2)高效性:尽可能保持CPU和外部设备100%的时间都在工作; (3)响应时间:系统对用户的反应时间; (4)吞吐量:单位时间内系统处理的作业量; (5)周转时间:用户从提交作业到最后获得结果的整个时间段。 针对用户角度来说,公平性、响应时间和周转时间是需要着重考虑的。
微型计算机编址方式
微型计算机内存储器是按字节编址 按字编址由于编址单位比较大(1字=32bit=4B),从而编码较少,而按字节编址由于编码单位较小(1字节=1B=8bit),从而编码较多。
设计批处理操作系统的准则
对于大型机广泛使用的批处理操作系统,吞吐量和周转时间是首先考虑的目标,同时需要兼顾计算机系统的效率,因为大型机一般都比较昂贵,保证系统一定的负荷量是系统设计者所必须考虑的。
作业控制方式
把用户根据操作系统提供的手段来说明加工步骤的方式称为“作业控制方式”,具体分为批处理方式和交互式方式。 批处理方式:也称为脱机控制方式或自动控制方式。用户使用操作系统提供的“作业控制语言”对作业执行的控制意图写好一份“作业控制说明书”,连同该作业的程序和初始数据一同提交给系统,操作系统按照用户说明的控制意图来自动控制作业的执行。这种控制方式称为批处理方式,把采用批处理控制方式的作业称为批处理作业。 交互控制方式:也称为联机控制方式。用户使用操作系统提供的“操作控制命令”来表达对作业的控制意图。用户通过逐条输入命令,操作系统把命令执行情况通知用户并让用户再输入下一条命令,以控制作业执行直到结束。这种方式也适用于终端用户使用。采用交互控制方式的作业称为“交互式作业”,对于来自终端的作业也称为“终端作业”。
作业状态
作业的状态一般分为四种: (1)提交状态:程序员把已经存储了作业实体的某种介质提交给了计算机,管理员正在向计算机输入其作业时所处的状态称为提交状态。 (2)后备状态:作业信息输入到计算机系统的硬盘输入井的作业缓冲池中,正在等待作业调度将其调入内存前的状态,称为后备状态。 (3)运行状态:作业在输入井的缓冲池中由作业调度根据算法选中被调入内存,创建为进程后,作业的状态就变为运行状态。由于在内存中进程的调度是微观调度,取决于并发进程的数最和所采用的进程调度算法,例如是否分时轮转,还是实时独占,单道运行或多道运行等。对于作业来讲,被调入内存后其状态宏观上就认为是运行状态,只要属于作业的任何部分被调入内存成为进程,则该作业的状态即为运行状态。 (4)完成状态:作业正常运行结束或因发生错误而终止时,释放其占有的所有资源,准备离开系统时的作业状态,称为完成状态,此时作业调度需要审计、输出结果等。 
降低进程优先级的合理时机
进程时间片用完可以降低其优先级,完成IO的进程应该提升其优先级,处于就绪队列等待调度的进程一般不会改变其优先级。 这类题目一般在采用多级反馈队列调度算法的系统中应用。其具体算法为:设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二队次之,其余队列优先级依次降低。赋予各个队列中进程运行时间片的大小也各不相同。在优先级越高的队列中,每个进程的运行时间片就越小。当一个新进程进入内存后,首先将它放入第一队列的末尾,也就是优先级最高,按先来先服务的原则排队等待调度。当轮到该进程运行时,如能在该时间片内完成,便可准备撤离系统。如果它在一个时间片结束时尚未完成,调度程序便将该进程转人第二队列的末尾,此时其优先级降低了一级,再同样地按先来先服务原则等待调度运行。如果它在第二队列中运行一个时间片后仍未完成,再以同样方法,将它转入第三队列。它的优先级又降低了一级。如此下去,当一个长作业从第一队列降到最后一个队列后,在最后一个队列中,使用时间片轮转方式运行。此时优先级也就再也无法降低了。仅当第一队列空闲时,调度程序才调度第二队列中的进程运行。仅当第一至N队列均为空时,才会调度第N+1队列中的进程运行。如果处理机正在第J队列中为某进程服务时,又有新进程进入优先级较高的队列,那么要考虑是否是可抢先式调度算法,若是,则新进程将抢占正在运行进程的处理机,而由调度程序把正在运行的进程放回到第J队列末尾,将处理机分配给新进程。若不是,则需要等待直到当前的进程完成它的时间片再调度,此时会产生优先级翻转的情形,亦即在处理机上运行的进程其优先级低于就绪队列中的某个进程。这种情形非常糟糕,极易引起死锁。一般应该避免。
UNIX系统进程控制块的proc结构
proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
分段存储管理方式中段的共享
段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本来实现的,因此在内存中仅保存一份段s的内容。段s对于进程P1,P2来说,使用位置可能不同,所以在不同进程中的逻辑段号可能不同。段表项存放的是段的物理地址,对于共享段s来说物理地址唯一。为了保证进程可以顺利使用段s,段s必须确保在没有任何进程使用它后才能被删除。
时钟中断更新的内容
时钟中断的主要工作是处理和时间有关的信息以及决定是否执行调度程序,更新和时间有关的所有信息,包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器
进程互斥的TSL指令实现机制
当进程退出临界区时置lock为FALSE,会负责唤醒处于就绪状态的进程。若等待进入临界区的进程会直停留在执行while (TSL(&lock))的循环中,不会主动放弃CPU。让权等待,即当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。通过B选项的公析中发现上述伪代码并不满足“让权等待”的同步准则。若while (TSL(&lock))在关中断状状态下执行,当TSL(&lock)一直为true时,不再开中断,则系统可能会因此终止。
Belady异常
在先进先出算法(FIFO)——选择装入最早的页面置换的过程中,可以通过链表来表示各页的装入时间先后。FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。所谓Belady现象是指:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
抢占式短作业优先算法
又叫最短剩余时间优先算法,如果新到达的进程剩余时间比当前运行时间的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。短作业的短是指作业的运行时间短。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。
缺页处理程序
缺页处理程序属于中断,在核心态执行。
命令解释程序
命令解释程序属于命令接口,它在用户态执行。
系统抖动现象
系统抖动,解释为在请求分页存储管理中,从主存(DRAM)中刚刚换出(Swap Out)某一页面后(换出到Disk),根据请求马上又换入(Swap In)该页,这种反复换出换入的现象。 解决办法:好的页替换算法;减少运行的进程数;增大内存。
用户级线程的切换
内核级线程是由操作系统进行调度的,用户级线程是由用户来控制调度的。
进程状态字
程序状态字(PSW)是一段包含被操作系统和硬件使用的程序状态信息的内存或硬件区域,一般用一个专门的寄存器来指示处理器状态。 所以程序状态字反映了与处理器有关的系统状态。
进程阻塞与通信的关系
阻塞就是让当前调用线程一直处于停止等待当中,挂起的状态,线程函数会被卡住。非阻塞则是不管运行结果如何,都会继续往下执行(往往都要处理很多返回结果),线程函数里一般都是一个循环,不停的轮询。这样就决定了非阻塞的收发是最难实现的。
用户程序请求外部设备的方式
用户程序是通过系统调用向操作系统提出使用外部设备的要求。
磁盘调度策略的目的
由于读写总花费时间中寻道时间和旋转延迟占比比较大,因此从这两方面出发优化读写效率。对于旋转延迟一般和磁盘转速有关,因此主要提高转速。寻道时间则主要从寻道策略中优化。
多道程序设计
多道程序设计是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。两个或两个以上程序在计算机系统中同处于开始到结束之间的状态。这就称为多道程序设计。
分时系统响应时间
分时系统的响应时间(及时性)主要是根据用户所能接受的等待时间确定的
文件首次打开时操作系统的工作
系统会在内存中维护一个以打开文件列表,如果打开文的文件不在此列表中,会将该文件的FCB读取到内存,文件信息都存储在FCB中,然后更新已打开文件列表。
管道通信的数据格式
管道是指用于连接一个读进程和一个写进程以实现进程之间通信的一种共享文件。向管道提供输入的是发送进程,也称为写进程,负责向管道输入数据,数据的格式是字符流。接受管道数据的接受进程为读进程。
缺页中断处理后执行的指令
缺页中断是由正在执行的指令自己产生的,而且该指令没有执行完,因此,操作系统处理完缺页中断后返回时,应重新执行被中断的那一条指令。
Solaris系统中的LWS
LWP其实就是内核线程,是Solaris中真正的可调度实体,也就是用户程序和操作系统均可见的实体。
用户线程被阻塞时整个进程的状态
在用户线程这种模式下,进程中的所有线程都对应一个内核调度实体,并且内核不知道这个进程有哪些线程,内核调度实体无法将其它线程调度到其它处理器上,因此该进程中的所有线程被阻塞。
鸵鸟算法
鸵鸟算法是解决死锁发生影响系统正常运行的一种手动干预策略。 在计算机科学中,鸵鸟算法是一个忽略潜在问题的一种算法策略,这种策略对计算机程序可能出现的问题采取无视态度(类似于鸵鸟在遇到危险时将头埋在地里,装作看不见)。鸵鸟算法的使用前提是,问题出现的概率很低。 传说中鸵鸟看到危险就把头埋在地底下。当你对某一件事情没有一个很好的解决方法时,那就忽略它,就像鸵鸟面对危险时会把它深埋在沙砾中,装作看不到。这样的算法称为“鸵鸟算法“。这实在不算是一个算法,但却是目前实际系统采用最多的一种策略。例如在计算机操作系统中,当死锁真正发生且影响系统正常运行时,手动干预—重新启动。
进程共享资源的三个层次
互斥、并发和死锁,不包含饥饿。
计算机判别中断的时机
处理器每执行完一条指令后,硬件的中断装置立即检查有无中断事件发生,若有中断事件发生,则暂停现行进程的执行,而让操作系统的中断处理程序占用处理器,这一过程称“中断响应”。
最短寻找时间优先算法
属于磁盘移臂调度算法
进程调度算法保证最高吞吐率的条件
吞吐率指的是单位时间内通过某通信信道或某个节点成功交付数据的平均速率。进程调度的实质是资源的分配,如何使系统能够保持较短的响应时间和较高的吞吐量,因此,要是系统有最高的吞吐率,就必须保证在单位时间内能够尽可能多的处理系统进程。
同一进程内的线程通信
同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核适合多处理机系统。
系统调用read读磁盘
若文件的数据不在内存中,则进程进入睡眠模式的目的是等待内存对磁盘上文件的映射,因为磁盘的读取比较慢,所以会先进入睡眠模式。read是系统调用,所以CPU从用户态切换到核心态。open系统调用应该包含文件的名称,read只是包含输入流。
进程的分类
操作系统中,进程可以分为系统进程和用户进程两类。
进程上下文
进程上下文,意思是可执行程序代码是进程的重要组成部分,实际上是进程执行活动全过程的静态描述。
进程间的通信机制
信号量机制太过于底层化,而monitor机制是面向编程语言设计的。这两种机制在面对分布式环境下的进程间的同步问题时显得力不从心。所以通信机制被引入,同时被引入的还用两个原语:SEND和RECEIVE,这两个原语和信号量—样属于系统调用,而不是像monitor—样作为编程语言的一种机构。
功能不同的两种作业的优先级
现有两道作业同时运行,一道以计算为主,另一道以输入、输出为主,则应当使输入、输出为主的作业优先级高于以计算为主的作业。因为以输入、输出为主的作业占有CPU的处理时间必定短,运行时间短;而作业调度算法中,短作业优先算法的作业平均周转周期最短。
批量型作业和终端型作业
对于批量型作业而言,通常需要经历作业调度和进程调度两个过程后方能获得处理机;对于终端型作业,通常只需经过进程调度即可获得处理机。因此,终端型作业不属于批处理方式下作业。
信号量与通信机制控制同步互斥的关系
信号量机制控制进程同步和互斥的能力与通信机制是等价的。
空闲进程
空闲进程是一个系统进程,空闲进程这个数值越大CPU的空闲率就越好。空闲进程不是一个真正的进程,是核心虚拟出来的,多任务操作系统都有的。在没有可用的进程时,系统处于空运行状态,以便CPU更快地切换,它是用于计算占用除了当前应用程序所分配的处理器百分比之外的所有占用率的,不需要用到网络。
一定是可抢占式的调度算法
在调度算法中,FCFS、短作业优先调度、高响应比优先调度算法、基于优先权调度算法均可以按照抢占式和非抢占式模式实现。时间片轮转调度算法和多级反馈队列调度算法是基于时间片的调度算法,当进程的时间片用完,一定会被剥夺CPU所以一定是可抢占算法。
进程同步信号量初值的确定
同步是指协同完成任务的多个进程因为需要协调工作次序而等待、传递信息所产生的制约关系。实现同步的信号量的初值应根据具体场景需求来确定。若期望的资源尚未产生,则对应的初值应为0;若期望的资源已经存在,则信号量的初值应设为一个非0的正整数。
第3章 内存管理
存储器的层次结构
 用户需求 访问速度和处理机匹配。 容量足够大。 价格还应该很便宜。 CPU不能直接访问外存,所有的程序只有调入内存中才可以访问,可见操作系统必须对内存空间进行合理划分和有效的动态规划。  存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。每层于下一层相比都拥有较高的速度和较低延迟性,以及较小的容量。 存储器层次结构,对应用程序的性能有着巨大的影响。理解系统是如何将数据在存储器层次结构中上下移动,可写出更符合系统运行的应用程序,运行更快。 从顶层往底层走,存储设备变得更慢、更便宜和更大。在最高层L0,是少量快速的CPU寄存器,CPU可在一个时钟周期内访问它们。接下来是一个或多个基于SRAM的高速缓存,可在几个时钟周期内访问它们。在下一层是基于DRAM的主存,可以在几十到几百个时钟周期内访问它们。接下来是速度更慢的本地磁盘...
基本概念
程序运行之前必须为其建立进程,而创建进程的首要任务是将程序和数据装入内存。用户源程序执行流程如下: 编译:将用户源代码编译为目标代码的过程。 链接:将编译后形成的一组目标代码以及所需库函数链接在一起,形成完整的装入模块。 装入:将装入模块装入内存。 
编译
编译:由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(Object Module)(即若干程序段)。形成的目标代码,每个目标代码都是以0为基址顺序进行编址,原来用符号名访问的单元用具体的数据——单元号取代。这样生成的目标程序占据一定的地址空间,称为作业的逻辑地址空间,简称逻辑空间。
链接
静态链接
程序运行之前,将都从0地址开始的若干目标模块及所需库函数链接为完整、从唯一“0”地址开始的装配模块。 须解决以下两个问题 (1)对相对地址进行修改。在由编译程序所产生的所有目标模块中,使用的都是相对地址,其起始地址都为0,每个模块中的地址都是相对于起始地址计算的。在链接成一个装入模块后,原模块B和C在装入模块的起始地址不再是0,而分别是L和 L+M,所以此时须修改模块B和C中的相对地址,即把原B中的所有相对地址都加上L,把原C中的所有相对地址都加上L+M。 (2)变换外部调用符号。将每个模块中所用的外部调用符号也都变换为相对地址,如把B的起始地址变换为L,把C的起始地址变换为L+M。这种先进行链接所形成的一个完整的装入模块,又称为可执行文件。通常都不再拆开它,要运行时可直接将它装入内存。这种事先进行链接,以后不再拆开的链接方式,称为静态链接方式。 
装入时动态链接
将用户源程序编译后得到的一组目标模块,采用边装入内存边链接的链接方式。 用户源程序经编译后所得的目标模块,是在装入内存时边装入边链接的,即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存。 便于修改和更新。对于经静态链接装配在一起的装入模块,如果要修改或更新其中的某个目标模块,则要求重新打开装入模块。这不仅是低效的,而且有时是不可能的。若采用动态链接方式,由于各目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易的事。 便于实现对目标模块的共享。在采用静态链接方式时,每个应用模块都必须含有其目标模块的拷贝,无法实现对目标模块的共享。但采用装入时动态链接方式,OS则很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。
运行时动态链接
程序执行过程中需要目标模块时,才对其进行链接的链接方式。 每次要运行应用程序的模块可能不同,该方法可以根据运行中间结果动态链接所需目标模块。 这种链接方式是将对某些模块的链接推迟到程序执行时才进行链接,亦即,在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。
装入
绝对装入方式
编译时能够确定程序在内存的驻留位置,则编译程序将产生绝对地址的目标代码,程序中的逻辑地址与实际内存地址完全相同。 仅适用于系统很小、单道程序环境。 绝对装入方式只能将目标模块装入到内存中事先指定的位置。在多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,因此,绝对装入方式只适用于单道程序环境。 在多道程序环境下,所得到的目标模块的起始地址通常是从0开始的,程序中的其它地址也都是相对于起始地址计算的。此时应采用可重定位装入方式,根据内存的当前情况,将装入模块装入到内存的适当位置。
可重定位装入方式
多道程序环境下。编译程序无法预知所编译的目标模块应放在内存的具体位置。 目标模块的起始地址通常从0开始,程序中的其它地址相对于起始地址计算得到。 装入时,根据内存的当前情况,将装入模块装入到内存的适当位置。 地址变换在装入时一次完成,以后不再改变,故又称静态重定位。 注意:运行时,程序在内存中的位置无法移动。 
动态运行时装入方式
装入模块装内存后,不立即将装入模块中的相对地址转换为内存绝对地址,而将地址转换推迟到程序真正执行时进行。 装入内存后的所有地址都仍为相对地址。 地址变换过程在程序执行过程期间,随着对每条指令的访问自动进行,称为动态重定位。 为不影响指令的执行速度,应设置一个重定位寄存器辅助地址转换。
连续存储
单一连续分区
早期单用户单任务操作系统的存储管理模式。 特征 内存分为系统区和用户区两部分。 系统区仅提供给OS使用,通常放在内存低址部分。 除系统区外的全部内存空间为用户区。 只能用于单用户、单任务的操作系统中。 基本没有采取存储保护措施。
固定分区
多道程序系统初期的存储管理模式,是最早、最简单的可运行多道程序的分区式存储管理方式。 特征 内存的用户区划分为若干个固定大小的分区。 每个分区中只装入一道用户作业。 多个分区的多道作业并发执行。 有空闲分区时,可从外存后备作业队列中选择一个适当大小的作业装入该分区。 大小相等 所有内存分区存储空间大小相等。缺乏灵活性。 适用于一台计算机控制多个相同对象的场合。
数据结构
分区使用表 
分配流程
有用户程序欲装入。 检索分区使用表 若有能满足用户程序大小且未分配的分区,则: 用户程序装入满足条件的分区。 分区使用表中该分区状态改已分配。 若找不到满足条件的分区,则拒绝为该用户分配内存。
可变分区
又称动态分区存储管理。根据进程实际需要,动态分配内存空间的的分区式存储管理方式。 特征 作业装入内存时,把用户可用空闲内存区域划分出一个作业大小的连续分区分配给作业,该区域记为已分配。 分区大小和个数由装入作业时间情况确定。 大小不等 内存划分为大小不相等分区的若干分区。 多个较小分区 适量中等分区 少量大分区 根据程序大小选择合适分区,提高存储利用率。 存储分配灵活。 数据结构 空闲分区表 空闲链表 分区起始部分:控制分区分配和链接各分区的前向指针,分区大小,状态位(0表示空闲,1表示已分配)。 设置一后向指针。 通过前、后向链接指针将所有空闲分区链接为双向链表。 
数据结构
空闲分区表 空闲链表  分区起始部分:控制分区分配和链接各分区的前向指针,分区大小,状态位(0表示空闲,1表示已分配)。 设置一后向指针。 通过前、后向链接指针将所有空闲分区链接为双向链表。 
分配算法
首次适应算法
空闲分区表以地址递增顺序排列。 分配内存时,从表首开始顺序查找,找到一个大小能满足要求的空闲分区。 按照作业的大小,从满足条件的分区中分出一部分内存空间分配给请求作业,余下部分仍留在空闲分区表中(修改相应表项内容)。 若不存在满足要求的分区,则分配失败。 优先利用内存低地址部分的内存空间,保留高地址部分的大片连续空闲区域。 方便为大作业分配存储空间。 低地址部分不断划分,产生的小碎片(内存碎片、零头)可能无法利用。 每次查找均从低址部分开始,增加了查找开销。
循环首次适应算法
分配内存时,从上次找到的空闲分区的下一个空闲分区开始查找。 找到一个能满足要求的空闲分区,则从中划出一块与请求大小相等的内存空间分配给作业。否则,分配失败。 注:为实现算法,需要设置起始查寻指针,并采用循环查找方式。 优点 内存空闲分区分布均匀。 从上次找到的空闲分区开始查找,减少查找的开销。避免低址部分留下许多很小的空闲分区。 缺点 缺乏大的空闲分区。
最佳适应算法
所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。 为作业分配内存空间时,把既满足容量要求又最小的空闲分区分配给作业,避免“大材小用”。 优点 对于一次分配来讲为最佳选择。 缺点 小容量空闲分区多,宏观未必好。
最差适应算法
所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链。 为作业分配内存空间时,把既满足容量要求又最大的空闲分区分配给作业,降低剩余空闲区成为“碎片”的可能性。 优点 留下较大空闲分区。 缺点 费时,且最大空闲分区容量变小。
快速适应算法
又称分类搜索算法,将空闲分区按照容量大小进行分类,相同容量的有空闲区归为一类。 每类空闲区设立一个空闲分区链表。 内存设立一个管理索引表,每个索引项对应一类空闲分区,记录该类空闲分区链表的表头指针。 分配内存时,根据进程长度,从索引表中查找能容纳该进程的最小空闲区链表,将第一块分配给它。 特点 空闲区大小由进程常用空间大小决定。 不常使用的特定大小的空闲区归至大小临近的空闲区,或置于特殊空闲链表。 缺点 回收时的合并分区算法复杂。 一个分区一个进程,存在区内空间浪费。 优点 分配存储空间时,不会分割空闲区。 能够保留大分区,满足大进程需求。 不会产生碎片。 查找效率高。
伙伴系统
整个可分配内存空间的初值为2^m。 无论已分配分区或空闲分区,其大小均为2^k的次幂(k为整数,1<=k<=m)。 为大小为n(2^(i-1)<=n<=2^i)进程分配内存时,首次将容量为2^m的可利用空间分为两部分 不小于2^i的最小空间2^j,使得2^m-2^j为2^d,将空间大小为2^j的存储区分配给请求者。 大小为2^d的存储空间为新的空闲分区。 以此类推,系统运行过程中,不断地申请内存、不断地划分,最终形成若干个不连续的内存空闲分区。 将所有空闲分区按大小进行分类。 相同大小的所有空闲分区设立一个空闲分区双向链表。 不同大小的空闲分区形成多个空闲分区链表。
伙伴定义
大小为2^k、起始地址为x的内存块,其伙伴块的地址用表示,其通式如下 
特点
分配和回收分区的性能取决于查找空闲区的位置和分割、合并空闲分区所花费的时间。 时间性能:由于采用索引搜索算法,快于优于顺序搜索,慢于快速适应算法。 空间性能:回收时会对空闲分区进行合并,减少了小空闲分区个数,提高了空闲分区的使用率。空间性能优于快速适应算法,比顺序搜索稍差。 适用于多处理机系统,目前仍被广泛使用。
哈希算法
利用空闲分区链表和分区大小的关系,构造以空闲区大小为关键字Hash函数,快速查找合适链表的方法。
动态可重定位分区
背景 连续分配方式的重要特点为用户程序必须装入连续的内存空间,计算机运行一段时间后,其内存空间会被分割为若干小分区,缺乏大的空闲空间。导致空闲空间总容量较大,但由于不连续而无法装入大程序。 可将通过移动作业位置,将零散空闲区合并为大空闲区,解决空闲区利用率问题,这需要动态重定位支持。 拼接/紧凑 移动内存中的作业,使之邻接;同时将原来分散的空闲小分区拼接成空闲大分区。 动态重定位 系统中增设重定位寄存器,存放程序(数据)在内存中的起始地址。 程序在执行所访问的内存地址由相对地址与重定位寄存器的值相求和得到。 和动态分区分配算法基本相同。 增加拼凑功能:仅当所有空闲空间总容量无法满足用户需求时才分配失败,否则通过拼凑方法为用户提供连续、满足大小要求的空闲区。 优点 内存利用率很高。 缺点 需要硬件支持。 紧凑的开销较大。 用户程序在内存中的地址发生变化,必须重定位。
非连续存储分配
页式存储管理
基本概念
逻辑页:将进程的逻辑地址空间分成若干大小相等的区域,称为页面或页,页编号从0开始。 物理块:将内存空间分成与页面同样大小的若干个存储区域,称为块或页框,块编号从0开始。
分配原则
分配内存时,将进程的一页装入内存的一块。进程最后一页经常装不满而形成“页内碎片”。 为方便地址转换,页面大小一般取2的整数次幂。
地址结构
 若给定逻辑地址A,页面大小为L,则: 页号P=A/L。 页内地址d =A%L。
原理
系统若能满足一个作业要求的全部块数,此作业才能装入内存。 不能满足,则不为作业分配任何内存。 方式不具备页面对换功能,不支持虚拟存储器。
数据结构:页表
页式存储管理允许进程的页离散存储在内存的存储块中。 系统为每个进程建立一个页表,实现逻辑页到物理块之间的地址映射。 说明 进程逻辑空间的一页在页表中对应一项。 表项内容 逻辑页号 存储块号 存取控制字段,对存储块内容预以保护,如读、写、执行等。
地址变换
借助页表实现 任务:将逻辑地址中的页号转换为内存的物理块号。 页表常驻内存,在系统中设置一个页表寄存器PTR,其中存放页表在内存中的起始地址和页表长度。
基本变换方式
基本变换方式 CPU存取数据流程 访问内存读页表。 √根据逻辑页号查找页表,找到给定页所存放的物理块号。 √将块号与页内偏移量拼接形成物理地址。 访问内存读写数据:从物理地址中获得所需数据或向物理地址中写入数据。 单处理机系统需要一个页表寄存器。 进程未执行时,页表始址和长度存放于本进程的PCB中,进程调度成功时将其装入页表寄存器。  从逻辑地址到实际取得数据,要访问2次内存。
快表变换方式
基本的地址变换机构中,CPU存取一个数据需要两次访问内存,时间消耗较大。可考虑在地址变换机构中增设具有并行查找能力(按内容查找)的特殊高速缓冲寄存器,称为“相联存储器”或“快表”,用来存放经常使用的页表项。 CPU存取数据流程 访问快表TLB 找到待查页号。 √直接读出块号并计算物理地址 √访问内存读写数据。 没找到待查页号 √访问内存读页表 根据逻辑页号查找页表,找到给定页所存放的物理块号。 将块号与页内偏移量拼接形成物理地址。 待查页号相关信息写入快表。若快表已满,需要通过一定策略调出页表项。 √访问内存读写数据:从物理地址中获得所需数据或向物理地址中写入数据。 快表容量较小。 
访问内存的有效时间
从进程发出指定逻辑地址的访问请求,经过地址变换,到在内存中找到对应的实际物理地址单元并取出数据需要的总时间。
基本页式存储管理
EAT基本=t +t = 2t 假设访问一次内存的时间为t。 第一次访问内存时间:即查找页表对应的页表项所花费的时间t 第二次访问内存时间:将页表项中的物理块号与页内地址拼接成实际物理地址后,读取数据所花费的时间t
快表页式存储管理
EAT快表=λt+(1-λ)(T+t)+ T=2T+t-λT 命中率:使用快表并在其中成功查找到所需页面表项的比率。 设命中率为λ,t表示访问一次快表所需要的时间,T表示访问一次内存所需要的时间。访问流程如下: 快表命中:读快表查页号t,拼接物理地址读内存取数据T。 快表不命中︰读快表查页号t,读页表查页号T,拼接物理地址,写快表t,读内存取数据T。 查找页号平均用时 λt+(1-λ)(T+t) 访问数据用时 T
分级页表
现代计算机系统地址位数32位或64位,支持庞大的逻辑地址空间(2^32~2^64),导致页表极大。可以采用离散方式(页表在内存的存储空间可以不连续)或仅将当前所需页表项调入内存(部分页表装入)解决整个页表占据过大内存连续空间问题。
两级页表
原理
针对难于找到大的连续内存空间存放页表问题,可将页表分页,形成两级页表。 进程的页表分为若干页面,每个页面包含若干页表项。 页面可离散地存放于不同物理块。 为所有离散页面再建立一个页表,称为外层页表,每个表项记录页面的物理块号。
地址变换机构
性能分析 用离散分配空间方式解决大页表需大片连续存储空间问题。 没有减少页表所需总体内存空间。 两级页表地址变换流程 设置外层页表寄存器,存放外层页表的起始地址。 以逻辑地址中的外层页号P₁为索引,在外层页表中查找指定页面的起始地址P₂。 以P₂为索引,查找页面页表项中该页在内存的物理块号b。 物理块号b和页内地址d构成该逻辑地址所在的内存物理地址。  改进:减少页表所需总体内存空间 外层页表调入内存。 外层页表表项增加一位状态位,表示页面是否在内存。 进程运行时,地址变换机构以逻辑地址中的外层页号Pr为索引,在外层页表中查找指定页面状态位,判断对应页面是否在内存。 在内存 √记录指定页面的起始地址P₂。 √以P₂为索引,查找页面页表项中该页在内存的物理块号b。 √物理块号b和页内地址d构成该逻辑地址所在的内存物理地址。 不在内存 √产生中断,请求操作系统将相应页面调入内存。
段式存储管理
1)以程序的逻辑单位为基准进行内存分配。 2)作业地址空间被划分为若干个段 (1)每个段定义了一组逻辑信息。 (2)所有段都有自己的名字,通常用段号代替段名。 (3)每段从0开始编址,分配至一组连续的地址空间。 (4)段长由逻辑信息的长度决定。 (5)各段长度不等。 (6)作业各段之间不要求连续。 (7)基本分段存储管理要求将整个作业的全部段装入内存。 3)便于编程 (1)用户通常将作业按逻辑关系划分为若干段(函数或过程)。 (2)每段具有自己独立的名字,且都从零地址开始编址。 (3)用户程序通过段名和段内地址访问存储单元。 4)分段共享 (1)程序和数据共享通常以信息的逻辑单位为基础。 (2)分页系统中的每一页只是存放信息的物理单位,其本身没有完整意义,不便于信息共享。 (3)段是信息的逻辑单位,有利于信息共享。 5)分段保护:信息保护针对相对完整意义的逻辑单位(段)。 6)动态链接:当运行过程中需要调用某段时,再将该段(目标程序)调入内存并链接起来。所以,动态链接是以段为基础的。 7)动态增长:实际系统中,有些数据量会不断增长,而事先却无法知道数据的增长规模和特征,分段存储管理方式能较好地解决这个问题。
地址结构
 该地址结构允许一个作业最长有64K个段(段号16位)每段的最大长度为64KB(段内地址16位)。
原理
系统若能满足一个作业要求的段容量要求,此作业才能装入内存。 不能满足,则不为作业分配任何内存。 方式不具备段的对换功能,不支持虚拟存储器。
数据结构:段表
段式存储管理允许进程的段离散存储在内存中。 系统为每个进程建立一段表,实现逻辑段到内存地址之间的地址映射。 说明 进程逻辑空间的一个逻辑段在段表中对应一项。 表项内容 段长 段基址 段表可存放于寄存器中,以加快地址转换,一般放于内存。
地址变换
借助段表实现 任务:将逻辑地址转换为内存的物理地址。 1)系统设置段表寄存器,存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的变换。 2)和基本分页存储管理方式类似,每访问一个数据,需访问两次内存。 3)降低系统效率。 4)类似快表,可增设相联存储器提高速度。 
段页式存储管理
基本原理
分页存储管理以页面为内存分配单位,可有效提高内存利用率。 分段存储管理以程序段为内存分配单位,能更好地满足用户需求。 段页式存储管理结合两者之长。 先将用户程序分为若干段,每段赋予一个段名。 再将每个段分为若干页。
地址结构

地址变换
任务:将逻辑地址转换为内存的物理地址。
地址变换机构
1)段页式存储管理系统获得一条指令或数据,需访问三次内存。 (1)读内存访问段表,获得页表起始地址。 (2)读内存访问页表,获得该页所在内存块号。 (3)由块号和页内偏移地址拼凑得出指令或数据所存放的内存物理地址,按照该地址访问内存单元,读取指令或读写数据。 2)为提高速度,可以增设高速缓冲存储器。 
虚拟存储
引入背景
前述存储管理方法均要求将一个作业全部装入内存后方可运行。缺点如下: 有的作业很大,所要求的内存空间超过内存总容量,作业不能被全部装入内存,致使该作业无法运行。 有大量作业要求运行,但内存容量不足以容纳所有作业,只能将少数作业装入内存运行,其它大量作业驻留外存等待。 解决办法: 从物理上增加内存容量:受地址位数限制。 逻辑上“扩充”内存容量:虚拟存储管理实现逻辑上的内存容量扩充。
基本概念
常规存储器管理方式的特征 一次性 (1)作业必须一次性全部装入内存才能开始运行。 (2)大作业无法在小内存运行。 (3)限制系统的多道程度。 (4)降低处理机利用率。 (5)降低系统吞吐量。 (6)很多作业的运行不需要全部程序和数据。 驻留性 (1)整个作业装入后,一直驻留内存直至运行结束。 (2)运行期间可能因为IO或其他原因被阻塞。 (3)部分程序运行一次后不再需要。
局部性原理
程序执行过程呈现出明显的局部性规律,即在一段较短的时间内,程序的执行仅局限于某个部分。相应地,所访问的存储空间也局限于某个区域。
时间局部性
刚访问的数据不久可能再次被访问。
空间局部性
程序在一段时间内访问的地址空间可能集中在一定范围之内。
虚拟存储器
虚存包含的重要内容 (1)具有请求调入功能和置换功能、能从逻辑上对内存容量加以扩充的一种存储器系统。 (2)逻辑容量由内存容量和外存容量之和,以及计算机系统的地址结构决定。 (3)运行速度接近于内存。 (4)位成本接近于外存。 (5)虚拟存储器的实现建立在离散分配存储管理方式基础上。 特征 (1)多次性:一个作业被分成多次调入内存运行 (2)对换性:允许作业运行过程中进行换进、换出操作。 (3)虚拟性:从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。 说明 (1)虚拟性以多次性和对换性为基础 (2)多次性和对换性必须建立在离散分配的基础上。
对换
对换类型 整体对换:即处理机中级调度,以进程为单位,又称进程对换,广泛应用于多道系统,目的为解决内存资源不足问题。 页面或分段对换:对换为进程的页面或段位单位,又称部分对换,为虚拟存储器基础。
请求页式存储管理
特点
1)在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。 2)允许只装入部分页面的程序(及数据),便启动运行。 3)运行过程中根据需要通过调页功能及页面置换功能,陆续将即将运行的页面调入内存,同时把暂不运行的页面换出至外存。 4)置换以页面为单位。
系统支持
实现请求调页和置换功能,系统必须提供的支持
软件支持
实现请求调页的软件、实现页面置换的软件。
硬件支持
一定容量的内存和外存、页表机制、缺页中断机构和地址变换机构。
页表机制
请求分页系统所需要的主要数据结构是页表,其基本作用是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。 由于只将程序的一部分装入内存,因此须在普通页表中增加若干表项,供程序或数据换进、换出时参考。 页表项 请求分页系统的页表项包括以下部分 页号 物理块号 状态位:表示该页是否已调入内存。 访问字段:记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问。 修改位:表示该页在调入内存后是否被修改过。 外存地址:表示本页在外存的起始地址。
缺页中断机构
请求分页系统中,每当要访问的页面不在内存时,便产生缺页中断,请求操作系统将所缺页调入内存。 缺页中断流程 保护CPU环境 分析中断原因 转入缺页中断处理程序进行处理 恢复CPU环境。 缺页中断是一种特殊中断,与一般中断有明显区别 指令执行期间产生和处理中断信号。 一条指令执行期间,可能产生多次缺页中断。
地址变换机构
在分页系统地址变换机构的基础上,为实现虚拟存储器而增加某些功能而形成的,如产生和处理缺页中断,从内存中换出一页等。 变换流程 查找物理块号 检索快表,查找待访问的页 找到 直接从表项获取块号。 修改表项中的访问位。 找不到 到内存的页表查找待访问的页 找到:直接从表项获取块号,并将该页表项写入快表,若快表已满,需要按照某种策略调出已存在表项。 找不到:发出缺页中断,请求操作系统从外存调入该页。 物理块号和页内偏移地址拼接构成该逻辑地址所存放的内存物理地址。
缺页率
假设一个进程的逻辑空间有n页,系统为其分配的内存物理块数为m(m≤n)。如果在进程运行过程中,访问页面成功(即所访问页面在内存中)的次数为S,访问页面失败(即所访问页面不在内存中,需要从外存调入)的次数为F,则该进程总的页面访问次数为A=S+F,那么该进程在其运行过程中的缺页中断率f=F/A。 实际缺页中断处理过程中,当内存空间不足,需要置换部分页面到外存,选择被置换页面时还需要考虑置换的代价,如页面是否被修改过等。没有修改过的页面可以直接放弃,而修改过的页面则必须进行保存。处理这两种情况的时间是不同的。假设被置换的页面被修改的概率为β,对应缺页中断处理时间为ta,被置换页面没有被修改的缺页中断处理时间为tb,则缺页中断处理时间t=β×ta+(1-β)×tb
页面置换算法
最佳置换算法(OPT)
淘汰以后永不再用的页面,或是最长(未来)时间内不再被访问的页面。 基于“向后看”的观点,即根据以后各页的使用情况选择淘汰页。 缺页率最低,难于实现,可用来评价其它算法。
先进先出置换算法(FIFO)
淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。 最直观,但可能性能最差,应用极少。
最近最久未使用算法(LRU)
淘汰最近、最久未使用的页面。 需较多硬件支持,以了解进程在内存中各个页面的使用情况。 寄存器:每个页面配置一个移位寄存器,记录进程内存页面的使用情况;进程访问某物理块时,将相应寄存器的最高位置1,每隔一定时间右移一位,则最小值寄存器所对应的页面,为最近最久未使用的页面。 栈:保存当前使用的各个页面的页面号,进程最近访问的页面压入/调整至栈顶,则栈底为最近最久未使用的页面。 常用的置换方法:根据使用情况淘汰页面
Clock置换算法
最近未使用算法(NRU),LRU和FIFO的折衷。每页配有使用标志位,若该页被访问则使用标志位置1。 比LRU所需硬件支持少,实现简单。 算法思想 维护一个内存中所有页面的循环队列链表。 置换时,从当前指针位置开始按地址先后检查各页 如果指针所指的页面的使用标志为0,则淘汰该页面。 如果指针经过的页面的使用标志为1,则修改为0。 若遍历了一遍仍没有找到可以淘汰的页面则继续遍历。 最后指针停留在被置换页面的下一个页面位置。
改进Clock置换算法
算法描述:在将一个页面换出时,如果该页已被修改过,便需将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。在改进型Clock算法中,除需考虑页面的使用情况外,还需再增加一个因素,即置换代价,这样页面换出时,既要是未使用过的页面,又要是未被修改过的页面。把同时满足这两个条件的页面作为首选淘汰的页面。
最少使用置换算法(LFU)
选择截止当前时间为止被访问次数最少的页面淘汰。
页面缓冲算法(PBA)
示例 VAX/VMS操作系统。 采用可变分配和局部置换方式。 为每个进程分配一定数量的内存物理块。 设置两个链表。 空闲页面链表 √系统掌握的空闲物理块链表 √为频繁发生缺页中断的进程分配内存块 √进程读入页面时,系统将其装入空闲页面链表的第一个物理块 √未修改页面换出时,将其物理块挂入空闲页面链表尾部。以后进程再次需要该页面数据时,可直接从空闲页面链表读取,免去磁盘操作,降低页面换出开销。 修改页面链表 √换出已修改页面时,将其对应物理块挂入修改页面链表尾部。 √降低已修改页面写回磁盘的频率。 √降低磁盘内容读入内存的频率。
访问内存的有效时间
请求分页管理的内存有效访问时间由如下三部分构成: (1)访问页表时间 (2)访问物理单元的时间 (3)缺页中断处理时间 设内存访问有效时间记为EAT,查找快表时间为λ,访问物理单元时间为t,缺页中断处理时间为ε,缺页率为f,命中率为a,则 1)被访问页在内存,相应页表项在快表 (1)读快表查物理块号:花费时间λ (2)读内存访问存储单元:花费时间t EAT=λ+t 2)被访问页在内存,相应页表项不在快表 (1)读快表:失败,花费时间λ (2)读内存页表查物理块号:花费时间t (3)更新快表:花费时间λ (4)读内存访问存储单元:花费时间t EAT=λ+t+λ+t=2*(λ+t) 3)被访问页不在内存 (1)读快表:失败,花费时间λ (2)读内存页表:失败,花费时间t (3)缺页中断:花费时间ε (4)更新快表:花费时间λ (5)读内存访问存储单元:花费时间t EAT=λ+t+ε+λ+t=2*(λ+t)+ε 4)考虑命中率 EAT=λ+a*t+(1-a)*[t+f*(ε+λ+t)+(1-f)*(λ+t)]
工作集
1)某段时间间隔内,进程实际要访问的页面集合。 2)基于局部性原理,解决抖动现象。 3)进程发生缺页率的时间间隔与进程所获得的物理块数有关。 4)虽然程序只需少量的几页内存就可以运行,但为了使程序能有效地运行,必须使程序的工作集全部位于内存,否则会使进程在运行过程中频繁出现缺页中断,导致频繁的页面调入调出现象。 5)难以事先预知程序在不同时刻将访问的页面,可参考置换算法,通过程序过去某段时间内的行为作为程序在将来某段时间内行为的近似。 6)窗口尺寸:即窗口大小,时刻t工作集所含页面个数。
抖动
1)虚存管理下,用于页面在内、外存之间的对换的时间比程序有效运行时间还长的现象 2)分类 (1)局部抖动:进程内部页面频繁换入换出。 (2)全局抖动:整个系统页面频繁换入换出。 3)产生原因 (1)根本原因是多道系统内的进程数太多,从而分给每个进程的页面数太少。 (2)置换算法和页面走向不合适。 4)预防办法 (1)采用局部置换策略 进程发生缺页时,只能在分配给它的内存空间进行置换。 限制抖动的范围在进程你不,不影响其它进程。 特点 简单易行。 效果较差:抖动进程长期位于磁盘I/O等待队列,增加队列长度,延长它进程缺页中断处理时间,即延长了其它进程对磁盘的访问时间。 (2)把工作集算法融入到处理机调度 调度程序发现处理机利用率低下,则尝试从外出后备队列调入新作业。 调入新作业前,检查每个进程在内存的驻留页面是否足够多 足够多:调入新作业。 存在页面不足进程:为缺页率较高进程增加物理块。 (3)利用“L=S”准则调节缺页率 通过调节多道程序度降低缺页率。 L为缺页之间的平均时间,S为平均缺页服务时间,即用于置换一个页面需要的时间。 L<S:缺页频繁,缺页速度超过磁盘处理能力。 L>>S:很少发生缺页中断。 L~S:磁盘和处理机均达到最大利用率。 (4)暂停进程:多道程度偏高,且已影响到处理机的利用率,为了止发生抖动,必须减少多道程序的数量。
请求段式存储管理
特点
在分段系统的基础上,增加了请求调段功能和分段置换功能所形成的段式虚拟存储系统。允许只装入若干段程序(及数据),不用装入全部程序和数据即可启动运行。 运行过程中根据需要通过调段功能及段置换功能,把暂不运行的段调出,同时调入即将要运行的段。 置换时以段为单位。
系统支持
软件支持
实现请求调段的软件、实现段置换的软件。
硬件支持
请求分段的段表机制、缺段中断机构、地址变换机构
段表机制
请求分段系统所需要的主要数据结构是段表,其基本作用是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。 请求分段系统的段表表项包括以下部分: 段名 段长 段的基址 存取方式:只读、只写,读写、执行等。 访问字段:记录本段在一段时间内被访问的次数,或记录本段最近已有多长时间未被访问 修改位:表示该段在调入内存后是否被修改过。 存在位:表示本段是否已调入内存。 增补位:表示本段在运行过程中是否做过动态增长。 外存始址:表示本段在外存的起始地址。
缺段中断机构
请求分段系统中,每当要访问的段不在内存时,便产生缺段中断,请求操作系统将所缺段调入内存。 缺段中断流程 保护CPU环境 分析中断原因 转入缺段中断处理程序进行处理 恢复CPU环境 缺段中断是一种特殊中断,与一般中断有明显区别 指令执行期间产生和处理中断信号 一条指令执行期间,可能产生多次缺段中断 不同段长未必相同,不同页大小相等。所以缺段中断处理比缺页中断处理复杂。
地址变换机构
s表示段号,w表示段内偏移地址 
段共享
通过共享段表(数据结构)管理,所有共享段在共享段表中占一表项,记录共享此段的每个进程的情况。 
共享段的分配
为第一个请求使用共享段的进程分配内存空间 所分配内存空间起始地址填入请求进程相应表项。 共享段表项中填入 √使用本共享段的进程名 √共享段在进程中的段号 √存取控制信息 √共享进程数置1 其他请求使用已进入内存的共享段 共享段在内存空间的起始地址填入请求进程相应表项。 共享段表项中填入 √使用本共享段的进程名 √共享段在进程中的段号 √存取控制信息 √共享进程数加1
段保护
越界检查:段表寄存器存放了段表长度,段表中存放了每个段的段长。在进行存储访问时,将段号与段表长度比较,段内地址与段长比较。 存取控制检查:段表中的每个表项都设置了“存取控制”字段,用于规定该段的访问方式:只读、只执行、读/写。 环保护机构。
共享段回收
进程不需要共享段时应予以释放。 进程段表中撤销共享段对应表项。 共享段表项中 撤销进程相关表项信息 共享进程数减1 共享段的表项共享进程数为0时 回收共享段所占内存空间 取消共享段表中该共享段的相关
请求段页式存储管理
刷题笔记
页式存储管理与静态重定位
静态重定位是在程序运行之前由装配程序完成的,页式存储不是连续的,而且页式存储管理方案在运行过程中可能改变程序位置,分配的时候会把相邻逻辑地址映射到不同的物理地址,这需要动态重定位的支持
位示图
位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已经分配。有的系统把"0"作为盘块已分配的标记,把“1”作为空闲标志。(它们的本质上是相同的,都是用一位的两种状态标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。根据磁盘总块数决定位示图由多少字组成,位示图中的每一位与一个磁盘块对应,某位为“1”状态表示相应块已被占用,为“0”状态的位所对应的块是空闲块。
页面大小的选择
页表大,容易因为文件大小未能是页的大小,产生过多的内部碎片,内存利用率低。页表小,容易导致页表项多,页表占用大片存储资源。因此页表大小要适中。在确定地址结构时,若选择的页面较小,一方面可使内碎片减小,从而减少了内碎片的总空间、有利于提高内存利用。但另一方面,也会使每个进程要求较多的页面,从而导致页表过长,占用大量内存。此外,还会降低页面换进换出的效率。若选择的页面较大,虽然可减少页表长度,提高换进换出效率,但却又会使内碎片增大。因此。页面的大小应选得适中,通常页面的大小是2的幂,即在512B~4096B之间。页面大小与磁盘调度的关系不大,磁盘调度与扇区有关。
分页存储的内存保护
在地址变换过程中,可能会因为缺页、操作保护和越界保护而产生中断。首先,当你访问的页号超过页表长度时就发生了地址越界;而当你访问的页面不在内存当中,就会产生缺页中断;而访问权限错误是当你执行的操作与页表中保护位(比如读写位、用户/系统属性位等)不一致时就会发生,比如你对—些代码页执行了写操作,而这些代码页是不允许写操作的,但肯定不会发生内存溢出(内容容量不足)的现象。
缺页处理部分操作
缺页中断调入新页面,肯定要修改页表项和分配页框,同时内存没有页面,需要从外存读入,会发生磁盘I/O。当给进程分配的内存块还存在空闲块时,不会发生页面置换算法;当不存在空闲块时,发生页面置换算法。缺页不是访问越界引起的,不会进行越界出错处理。
Belady现象
所谓Belady现象是指:在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
虚实地址转换及其加快方法
虚实地址转换是指逻辑地址和物理地址的转换。增大快表容量能把更多的表项装入快表中,会加快虚实地址转换的平均速率。让页表常驻内存可以省去一些不在内存中的页表从磁盘上调入的过程,也能加快虚实地址转换。增大交换区对虚实地址转换速度无影响。
工作集窗口大小
工作集窗口大小是一个时间概念,不是说动态集合分配的页框数。而是过去k次(不含当前)访问的页面记号。
进程不能交换出主存的情形
进程正在进行I/O操作时不能换出主存,否则它的I/O数据区将被新换入的进程占用,导致错误。不过可以在操作系统中开辟I/O缓冲区,将数据从外设输入或将数据输出到外设的IO活动在系统缓冲区中进行,这时在系统缓冲区与外设IO时,进程交换不受限制。当系统进程过多、内存不够,可以挂起某些进程,并把进程的数据换出内存。所以处于创建状态、死锁、正在访问临界资源的进程都可以交换出内存。
分页存储方案解决的问题
分页存储管理方案解决了一个作业在主存可以不连续存放的问题,注意请求分页存储管理和分页存储管理的区别。
决定页面大小的因素
使用时优先考虑什么页面取决于采用什么算法。如果采用最坏适应算法,则优先考虑较大的页面,若采用最佳适应算法,则优先考虑能装下的最小的页面。跟磁盘无关。
哪些存储分配方式存在内部碎片
固定分区存在内部碎片,当程序小于固定分区大小时,也占用了一个完整的内存分区空间,导致分区内部有空间浪费,这种现象称内部碎片。凡涉及到页的存储分配管理,每个页的长度都一样(对应固定),所以会产生内部碎片,虽然页的碎片比较小,每个进程平均产生半个块大小的内部碎片。段式管理中每个段的长度都不一样(对应不固定),所以只会产生外部碎片。段页式管理先被分为若干个逻辑段,然后再将每个段分为若干个固定的页,所以其仍然是固定分配,会产生内部碎片。
不适合按需调页的程序设计
空间局部性跟时间局部性好的程序能够提高TLB命中率,能够减少调页占比。线性搜索、矢量运算都是一个空间局部性好的算法,线性搜索每次访问的都是下个邻接节点,矢量运算访问的是邻近矢量,在存储上是邻接位置。堆栈数据结构都可以线性表示,在实际算法中空间局部性好。二分搜索跳跃性强,发生缺页的概率大。
请求分页存储管理的主要特点
“内碎片”是指由于内存分配给进程的单位是页面是整数块,而一个进程的地址空间不一定是页的整数倍,因而在最后一页往往是不满的。在这种情况下,最后一页中空闲的空间不能分配给别的进程,因而造成了浪费。这种浪费称之为"内碎片”。请求分页存储管理不能消除内碎片。所有页式存储分配的内碎片均不能消除。 便于动态链接是分段管理的主要特点。由于分段地址空间是二维的,且每一分段是一组有意义的信息或具有独立功能的程序段,因此可以在进程运行过程中需要调用时动态链接。 便于信息共享也是分段管理的主要特点。由于分段和分页不同,分段便于对具有完整逻辑功能的信息段进行共享。 请求分页存储管理是在简单分页存储管理的基础上发展起来的。对于简单页式管理,仍要求一个作业全部装入主存后才能开始运行。而对于请求分页存储管理,在作业运行之前,不一定把作业的全部内容装入主存,而只要求把当前需要的一部分装入主存。因此,请求页式存储管理可以实现“扩充”主存的功能。
段式存储管理处理外碎片的方法
所谓外碎片是指内存中出现的一些零散的小空闲区域。一般情况下外碎片都很小,无法再利用。如果内存中外碎片很多,将会造成严重的存储资源浪费。解决外碎片的方法是移动所有的占用区域,使所有的空闲区合并成一片连续区域,这一技术称为内存紧缩,也称为移动技术(紧凑技术),内存紧缩除了可解决外碎片问题还使内存中的作业进行扩充。显然,内存紧缩带来系统开销加大,并且当一个进程如果正在进行IO操作时,该进程是无法移动的。
多道程序的存储保护
内存保护是为了防止多道程序在执行中互相干扰,并保护各自区域内的信息不被破坏,或共享代码不被非法修改。
段式存储管理满足的用户要求
段式存储管理方式的引入,主要是为了更好地满足用户在编程和使用上多方面的要求,其中有些要求是其他几种存储管理方式所难满足的,正因为如此,这种存储管理方式已成为当今所有存储管理方式的基础,许多高级语言的程序,也都支持段式存储管理方式。引入段式存储管理方式,主要是为了满足用户的下述要求: (1)方便编程:通常一个作业是由若千个自然段组成,因而要把自己的作业按照逻辑关系划分成若干个段,每个段都有自己的名字和长度,要访问的逻辑地址是由段名(段号)和段内偏移量(段内地址)决定,每个段从0开始编址。这样用户程序在执行中可用段名和段内地址进行访问。 (2)分段共享:通常在实现程序和数据的共享时,以信息的逻辑单位为基础,例如共享某个例程和函数。而在分页系统中每一页都只是存放信息的物理单位,其本身并无完整的意义,不便于实现信息共享。而段是信息的逻辑单位。因此,为了实现段的共享,也要使存储管理能与用户程序分段的组织方式相适应。 (3)分段保护:在多道程序环境下,为了防止其他程序对某程序在内存中的数据被破坏,必须采取保护措施。对内存中信息的保护,同样是对信息的逻辑单位进行保护。因此采用分段的组织和管理方式,对于实现保护功能,更方便。 (4)动态链接:通常,用户源程序经过编译后所形成的若千个目标程序,还须经过链接形成可执行程序,方能执行。这种在装入时运行的链接称为静态连接。动态链接是指在作业运行前不链接目标程序段。作业要运行之前先将主程序所对应的目标程序装入内存并启动运行,当运行过程中又需要调用某段时,才将该段调入内存并进行链接。可见,动态链接也要求以段作为管理的逻辑单位。 (5)动态增长:在实际使用中,有些段特别是数据段,会不断地增长,而事先又无法确切地知道数据段会增长到多大,这种动态增长的情况是其他几种存储管理方式都难于应付的,而段式存储管理方式能较好地解决这一问题。
重定位(地址映射)定义
由程序中逻辑地址组成的地址范围叫做逻辑地址空间,或简称为地址空间。而由内存中的一系列物理存储单元所限定的地址范围称作内存地址空间,也称为物理空间或者绝对空间。 程序必须装到内存才能被CPU访向并运行。这就需要根据内存的使用情况和分配策略,将上述程序模块分到的物理内存区中。这是可能需要进行计算逻辑地址在物理地址单元的位置,称为重定位。用户程序经编译之后的每个目标模块都以0为基地址顺序编址,这种地址称为相对地址或逻辑地址。内存中各物理存储单元的地址是统一从0的基地址顺序编址,这种地址称为绝对地址或物理地址。所以逻辑地址与物理地址是不同的概念。仅在分配到内存之后,才根据实际分到的内存情况修改各个模块的相对地址。所以这些模块并不是固定在内存的某个部分,而是可以上下浮动的。程序和数据装入内存时需对目标程序中的地址进行修改。这种把逻辑地址计算成为内存物理地址的过程叫重定位(地址映射)。
使用引用位和修改位的置换算法
NRU最近没有使用页面置换算法,该算法只要求对应于每个存储块(页面)设置一个页面“引用位”。当该页面被访问时,其对应的页面“引用位”自动设置为“1”,而由页面管理软件以t为周期把所有的页面“引用位”设置“0”。因此,可以根据“引用位”的状态来判断各页面最近的使用情况,当需要置换一页时,选择其“引用位”为“0”的页面淘汰。若“引用位”均为“0”,那么,还需要查看“修改位”。尽量将不需要回写的即没有被修改的页面先置换出去。
多道批处理系统作业要求
多道批处理系统中系统资源为多个作业所共享,这些作业应尽量协调利用各种资源。
用户程序在日志下使用特权指令所属中断
程序中断是指计算机执行现行程序的过程中,出现某些急需处理的异常情况和特殊请求,CPU暂时终止现行程序,而转去对随机发生的更紧迫的事件进行处理,在处理完毕后,CPU将自动返回原来的程序继续执行。用户程序在日志下使用特权指令将引起的中断属于程序中断的一种。
提高系统吞吐率的方法
在计算机或数据通信系统,吞吐率指的是单位时间内通过某通信信道(acommunication channel)或某个节点成功交付数据的平均速率,通常以每秒比特数(bps,bits per second)为单位。所以为了提高吞吐率应处理尽可能多的作业。
可重入代码
可重入代码(Reentry code)也叫纯代码(Pure code)是一种允许多个进程同时访问的代码。为了使各进程所执行的代码完全相同,故不允许任何进程对其进行修改。程序在运行过程中可以被打断,并由开始处再次执行,并且在合理的范围内(多次重入,而不造成堆栈溢出等其他问题),程序可以在被打断处继续执行,且执行结果不受影响。
固定分区各分区大小
固定分区分配方式按分区大小是否固定分为:分区大小相同和分区大小不同两种,无论哪种方式分区的大小是由系统预先划分好,不能改变。
解决“零头”问题的存储管理方法
页式存储管理将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立——对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题,有效的解决来内存“零头”的问题。
使用覆盖技术的存储管理方案
覆盖技术是早期在单—连续存储管理中使用的扩大存储容量的一种技术。
最容易产生内存碎片的动态分区分配算法
最佳适应算法总是匹配与当前大小要求最接近的空闲分区,但是大多数情况下空闲分区的大小不可能完全和当前要求的大小相等,几乎每次分配内存都会产生很小的难以利用的内存块,所以最佳适应算法最容易产生最多的内存碎片。
请求分页系统页面分配与置换策略的组合使用
对各进程进行固定分配时页面数不变,不可能出现全局置换。而可变分配,全局置换、可变分配,局部置换、固定分配,局部置换是现代操作系统中常见的3种策略。
多级页表的优点
多级页表不仅不会加快地址的变换速度,还因为增加更多的查表过程,会使地址变换速度减慢;也不会减少缺页中断的次数,反而如果访问过程中多级的页表都不在内存中,会大大增加缺页的次数,也并不会减少页表项所占的字节数(详细解析参考下段),而多级页表能够减少页表所占的连续内存空间,即当页表太大时,将页表再分级,可以把每张页表控制在一页之内,减少页表所占的连续内存空间。
分区分配存储管理的保护措施
分区分配存储管理方式的保护措施是设置界地址寄存器。每个进程都有自己独立的进程空间,如果一个进程在运行时所产生的地址在其地址空间之外,则发生地址越界,即当程序要访问某个内存单元时,由硬件检查是否允许,如果允许则执行,否则产生地址越界中断,由操作系统进行相应处理。 界限寄存器(硬件寄存器)和存储保护键(保护键法)是分区分配中的存储保护通常采用的两种方法。
绝对装入技术地址重定位的时机
绝对装入方式指在编译时,如果知道程序将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。
虚拟内存管理形成逻辑地址的阶段
两种说法: ①逻辑地址指的是段内的偏移量而不是链接后生成的整个程序全局的逻辑地址空间,所以逻辑地址是编译时产生的。 ②编译后形成的目标文件可以理解为一个小块一个小块的程序碎片,这样的小块一般都是具有从0开始的逻辑地址。在和相应的库函数链接以后形成一个可执行的文件,需要修改这些小块的逻辑地址,使之统—有序。所以在链接的过程中又把每个小段的逻辑地址按照一定的顺序组装成一个统一的逻辑地址范围,用来标识出此程序。虽然编译后的目标文件形成的小块内的也叫逻辑地址,但是和链接后形成的逻辑地址是截然不同的。
段式存储管理的逻辑地址空间维度
分段式内存分配将内存分为不同的段,每个段段长不固定且内部还可以进行分配。地址空间因此为二维。分页式是一维的。目前尚无三维的内存分配方式。
磁盘输入输出的时间组成
执行一次磁盘输入操作所花费的时间包括寻找时间,延迟时间和传送时间
内存保护方式
内存保护两种方式:1、设置上下限寄存器。2、采用重定位寄存器和界址寄存器。均需要采用硬件的支持。
页表项的作用
页式存储管理的基本点是解决程序在内存中离散存放的问题,其寻址方式是借鉴于动态重定位的技术,在动态重定位技术中,通过设置基址寄存器,将程序的逻辑地址通过基址寄存器和地址加法器,动态地实现了地址转换(即每一条都是自动转换的),操作系统在装载程序时可以不用像静态重定位那样计算程序代码的地址定位,使得地址转换快捷又简单。页式存储管理将动态重定位中的基址寄存器用一组页表来替代,当访问不同的页面时,在基址寄存器中只要存放该页面的页框号便可以快速地实现地址转换。所以说,页表项实际上是实现了动态重定位。
未开启分页的CPU访存所用地址
基地址是未开启分页机制的CPU访问存储器内信息时所用的地址。
分段存储管理的零头处理
分段式存储管理系统中,零头处理问题可采用拼接技术。
内存利用率高且易保护和共享的内存管理
分页式管理的优点是存储管理方式高效率的利用存储空间; 段式存储管理方式是从程序的角度来管理内存,便于程序的共享和保护; 段页式的存储管理方式结合这两部分的优点,利用率高且保护、共享容易。
计算机系统的二级存储构成
由于主存储器能被处理器直接访问,而辅助存储器则不能,因此,在进程运行时,必须把它的程序和数据放到主存储器中,考虑到主存储器的空间不足,一般计算机系统都采用二级存储的方法,利用辅助存储器存放准备运行的程序和数据,当需要时或主存空间允许时,随时将它们读入主存储器。
虚拟设备定义
虚拟设备是指采用虚拟技术将一台独享设备转换为若干台逻辑设备的情况。这种设备并不是物理地变成共享设备,而是用户在使用它们时“感觉”是共享设备,是逻辑的概念。引入虚拟设备的目的是为了克服独占设备速度慢,利用率低的缺点。
段地址与物理地址转换
逻辑地址其表达形式为“段地址:段内偏移地址”。物理地址是CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址。物理地址算法公式为段地址*10H+偏移地址。
交换技术
对象是进程,等待状态的进程不需要或暂时不需要,驻留内存会造成存储空间的浪费。因此,有必要把处于等待状态的进程换出内存。
TLB、页表、Cache的可能命中组合
TLB本质就是Cache 中的Page table。为了加快存取速度,在Cache 中,会创建一个最近常使用的Page构成的table,相当于把Page table的一部分内容放入Cache中,减少到内存中读取Page table 的效能损耗。TLB相当于Page table 的子集,如果Virtual address在TLB中hit,在Page table 中也一定hit。
段页式存储访存次数
在段页式存储管理中,首先要访问段表,最后访问相关段的页表,最后才能访问实际数据,因此一共需访问内存3次。
伙伴系统
在多处理机系统中伙伴关系是—种有效的内存分配和释放的方法,得到了大量的应用。
分页存储管理虚实地址转换的媒介
页式存储管理系统中,逻辑地址到物理地址的转换是在进程执行过程中,由硬件地址变换机构借助于页表自动进行的。具体完成页表的地址映射的是CPU中的MMU单元。
占用存储空间最大的照片格式
BMP比TIF、JPG和GIF占的内存都大。
快表在系统中的作用
分页系统中,CPU每次要存取一个数据,都要两次访问内存(访问页表、访问实际物理地址)。为提高地址变换速度,增设一个具有并行查询能力的特殊高速缓冲存储器,称为“联想存储器”或“快表”,存放当前访问的页表项。
磁盘高速缓存设置位置
硬盘和内存之间的Cache就叫做磁盘高速缓存。它是在内存中开辟一块位置,来临时存取硬盘中的数据。这项技术可使计算机读写时的存储系统平均数据传输率提高5–10倍,适应了当前激增的海量数据存储需求。
静态、动态重定位的进行时机
静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。 动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。 动态重定位是在作业运行时执行到一条访存指令时再把逻辑地址转换为主存中的物理地址,实际中是通过硬件地址转换机制实现的。
簇、块、页的关系
—簇可以由若干块组成,页面大小写和存储块大小相等。
作业调度工作列表
1.按照某种调度算法从后备作业队列中挑选作业。 2.为选中的作业分配主存和外设资源。 3.为选中的作业建立相应的进程。 4.构造和填写作业运行时所需的有关表格。(如作业表) 5.作业结束时完成该作业的善后处理工作,如回收资源、输出必要信息、撤销该作业的全部进程(PCB)和作业控制块JCB。
SPOOLing技术必需的硬件
磁盘和卫星机是实现SPOOLing技术必须要提供的硬件。
分页存储管理使用的表格
页表是用来建立逻辑地址到物理地址的映射;其次,需要对内存中的空闲块进行管理和分配,到底有没有物理块空闲以及空闲的数量,就需要用到存储分块表。
请求页式存储管理的重定位和内存分配方式
动态重定位是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化,现在一般计算机系统中都采用动态重定位方法。 请求页式管理是动态页式内存管理的一种,它在作业和进程开始执行之前,不把作业或进程的程序段和数据段一次性全部装入内存,而只装入被认为是经常反复执行和调用的工作区部分。其他部分则在执行过程中动态装入。
会发生抖动的存储分配方法
在虚存中,页面在内存与外存之间频繁地调度,以至于系统用于调度页面所需要的时间比进程实际运行所占用的时间还多。此时,系统效率急剧下降,发生了颠簸,又称抖动。可见抖动与页式虚存管理方式是联系在一起的。其他的存储管理方式都不会引发抖动。
段式和页式存储管理的本质不同
页式的逻辑地址是连续的,段式的逻辑地址可以不连续
外层页表概念
外层页表不是反应磁盘上页面存放的位置,而是在页表较大时将页表进行分页之后,建立的页表的页表。有了外层页表则仅需要一个外层页表寄存器就能实现地址变换。进程运行时,该进程的外层页表放在内存。
操作系统提供给用户的两个接口
操作系统为用户提供两个接口。一个是系统为用户提供的各种命令接口,用户利用这些操作命令来组织和控制作业的执行或管理计算机系统。另外一个接口是系统调用,编程人员使用系统调用请求操作系统提供服务,例如申请和释放外设等类资源、控制程序的执行速度等。
终端作业和批处理作业的优先级
当终端作业和批处理作业混合同时执行使,终端作业应该优先占用cpu。
前台(终端型)作业和后台(批量型)作业
在支持批处理和分时的系统中,往往由分时系统控制的作业称为前台(终端型)作业,而由批处理系统控制的作业称为后台(批量型)作业。 在多道程序系统中,一个作业被提交后,必须经过处理机调度后方能获得处理机。对于批量型作业而言,通常需要经历作业调度(又称高级调度)和进程调度(又称低级调度)两个过程后方能获得处理机;对于终端型作业,通常只需经过进程调度即可获得处理机,因此终端作业一般运行在分时操作系统环境。
作业从磁盘存取信息的部位
作业执法时,从磁盘上的输入井中读取信息,并把作业的执行结果暂时存放在磁盘上的输出井中。
常用内存信息保护法
内存信息保护方法通常会通过软件或者硬件的方式来实现,以及两者的结合来实现。
存储管理应实现的功能
主存空间的分配与保护,主存空间的重定位,主存空间的共享和主存的扩充。
存储管理采用覆盖与交换技术的目的
采用覆盖与交换技术是为了节省内存。 覆盖就是指一个作业(或进程)或多个作业(或进程)的若干程序段或数据段共享主存的某个区域。实现方法是将一个作业(或进程)划分成若干个相互独立的段,将不同时运行的程序段或数据段组成覆盖。 交换就是系统根据需要把主存中暂时不运行的某个(或某些)进程的部分或全部信息移到外存,而把外存中的某个(或某些)进程移到相应的主存区,并使其投入运行。
请求分页存储系统的中断原因
在地址变化的时候缺页,越界保护,操作保护等都有可能会引起中断。
可变分区保护方式
地址越界:就是在采取地址访问时,由于不注意,你访问的地址超过了你所申请的地址空间,因此可以采用地址越界的方式来保护分区。 非法操作:不允许不被许可的操作,例如权限不够,对分区起到很好的保护作用。
计算机控制各程序执行的装置
利用硬件的中断装置使得操作系统可以控制各个程序的执行,为用户提供各种服务。
限定程序访存范围的寄存器
在连续分配的存储系统中,硬件设置两个寄存器:基址寄存器、限长寄存器,用来限定用户程序执行时可以访问的主存空间范围。
保留高地址大空闲区的适应算法
首次适应算法优先利用低址部分空闲区,在低地址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
虚拟的定义
操作系统中,虚拟是指把一个物理实体,变为若干逻辑上的对应物。
实模式
在实模式下逻辑地址等于物理地址,因此在实模式下不需要地址转换。
UNIX系统存储扩充方法
UNIX操作系统没有提供虚拟存储器,为了使容量有限的内存能支持较大规模的程序,系统除采用正文段共享和自我覆盖技术外,主要采用了程序对换技术来扩充存储容量,使其具有类似于虚拟存储器的作用。 对换技术是为了提高系统的性能和多道度而采取的进程在内存和外存之间的换入和换出。
连续分配分类
连续分配是指为一个用户进程分配一个连续的内存空间。可进一步分为:单一连续分配,固定分区分配(等分和不等分),动态分区分配,动态重定位分区分配(应用紧凑技术)。
覆盖和对换的区别
覆盖和对换(交换)是两个不同的概念 覆盖技术主要在同一个作业或进程中进行。对换主要在作业或进程之间进行覆盖是早期OS采用的策略,现在已经淘汰
静态页式管理能否实现虚存
静态页式管理不能实现虚存,这是因为静态页式管理要求进程或作业在执行前全部被装入内存,作业或进程的大小仍然受内存可用页面数的限制。
交换技术与虚拟存储的关系
交换技术与非连续存放技术相结合,才构成虚拟存储器。
多道操作系统相同作业运行时间是否相同
因为作业的运行时间都是固定值,不管当前使用的是何种调度方式,它的运行时间都应相同;所不同的是它的周转时间,因为不同的调度方法会产生不同的等待时间。
批处理方式与交互方式是否需要注册
批处理方式是用户使用作业控制语言书写的,作业说明书控制作业运行,不需注册,而交互方式控制作业运行需要注册。
程序浮动
在多道程序设计系统的主存储器中,程序可以随机地从主存的一个区域移动到另一个区域,程序被移动后仍丝毫不影响它的执行,这种技术称为程序浮动。
UNIX系统空闲盘块分组的优点
在UNIX系统中将空闲盘块分成组,每组用一块来记录本组的空闲盘块号,这样克服表太长的缺点,而且并不付出额外的开销。
提高内存利用率的功能
提高内存利用率主要是通过内存分配功能实现的,内存分配的基本任务是为每道程序分配内存,使每道程序能在不受干扰的环境下运行,主要是通过内存保护功能实现的。
页式存储是否用户可见及其重定位方式
页式存储管理不仅对于用户是透明的,对于程序员都是透明的;页式存储不是连续的,而且页式存储管理方案在运行过程中可能改变程序位置,分配的时候会发相邻逻辑地址映射到不同的物理地址,这需要动态重定位的支持。
请求分页存储管理系统发生中断的情形
在地址变换过程中,可能会因为缺页、操作保护和越界保护而产生中断。首先,当访问的页号超过页表长度时就发生了地址越界;当访问的页面不在内存当中,就会产生缺页中断;而访问权限错误是当执行的操作与页表中保护位(比如读写位、用户/系统属性位等)不一致时就会发生,比如对一些代码页执行了写操作,而这些代码页是不允许写操作的。请求段页式存储管理系统一定不会发生内存溢出。
第4章 文件管理
初识文件管理
文件——就是一组有意义的信息/数据集合 计算机中存放了各种各样的文件,一个文件有哪些属性? 文件内部的数据应该怎样组织起来? 文件之间又应该怎么组织起来? 从下往上看,OS应提供哪些功能,才能方便用户、应用程序使用文件?
从最熟悉的Windows操作系统出发

文件的属性

文件名
由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
标识符
一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
类型
指明文件的类型
位置
文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
大小
指明文件大小
创建时间
上次修改时间
文件所有者信息
保护信息
对文件进行保护的访问控制信息
文件内部的数据应该怎样组织起来?
 有结构文件中,各个记录间应该如何组织的问题——应该顺序存放?还是用索引表来表示记录间的顺序?——这是“文件的逻辑结构”重点要探讨的问题
无结构文件
 无结构文件(如文本文件)——由一些二进制或字符流组成,又称“流式文件”
有结构文件
 有结构文件(如数据库表)——由一组相似的记录组成,又称“记录式文件” 记录是一组相关数据项的集合 数据项是文件系统中最基本的数据单位
文件之间应该怎样组织起来?
  所谓的“目录”其实就是我们熟悉的“文件夹” 用户可以自己创建一层一层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来了 目录其实也是一种特殊的有结构文件(由记录组成),如何实现文件目录是之后会重点探讨的问题
操作系统应该向上提供哪些功能?
 可以“创建文件”(点击新建后,图形化交互进程在背后调用了“create 系统调用”)  可以“读文件”,将文件数据读入内存,才能让CPU处理(双击后,“记事本”应用程序通过操作系统提供的“读文件”功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上) 可以“写文件”,将更改过的文件数据写回外存(我们在“记事本”应用程序中编辑文件内容,点击“保存”后,“记事本”应用程序通过操作系统提供的“写文件”功能,即 write 系统调用,将文件数据从内存写回外存) 可以“删除文件”(点了“删除”之后,图形化交互进程通过操作系统提供的“删除文件”功能,即delete 系统调用,将文件数据从外存中删除)
向上提供的最基本的功能
读/写文件之前,需要“打开文件” 读/写文件结束之后,需要“关闭文件” 可用几个基本操作完成更复杂的操作,比如:“复制文件”:先创建一个新的空文件,再把源文件读入内存,再将内存中的数据写到新文件中
创建文件(create系统调用)
删除文件(delete系统调用)
读文件(read系统调用)
写文件(write系统调用)
打开文件(open系统调用)
关闭文件(close系统调用)
从上往下看,文件应如何存放在外存?
 与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址 类似于内存分为一个个“内存块”,外存会分为一个个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含2的整数幂个地址(如本例中,一块包含个地址,即1KB)。同样类似的是,文件的逻辑地址也可以分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转换为外存的物理地址(物理块号,块内地址)的形式。块内地址的位数取决于磁盘块的大小 操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读入内存时同样以块为单位  文件数据放在连续的几个磁盘块中  文件数据放在离散的几个磁盘块中。此时,应该如何记录各个磁盘块之间的先后顺序呢? 操作系统又应该怎么管理空闲磁盘块?
其他需要由操作系统实现的文件管理功能
文件共享
使多个用户可以共享使用一个文件
文件保护
如何保证不同的用户对文件有不同的操作权限
文件的逻辑结构
所谓的“逻辑结构”,就是指在用户看来,文件内部的数据应该是如何组织起来的。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。 类似于数据结构的“逻辑结构”和“物理结构”。 如“线性表”就是一种逻辑结构,在用户角度看来,线性表就是一组有先后关系的元素序列,如:a, b, c, d, e, ...... “线性表”这种逻辑结构可以用不同的物理结构实现,如:顺序表/链表。顺序表的各个元素在逻辑上相邻,在物理上也相邻;而链表的各个元素在物理上可以是不相邻的。因此,顺序表可以实现“随机访问”,而“链表”无法实现随机访问。 可见,算法的具体实现与逻辑结构、物理结构都有关(文件也一样,文件操作的具体实现与文件的逻辑结构、物理结构都有关) 按文件是否有结构分类,可以分为无结构文件、有结构文件两种。
无结构文件
无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows操作系统中的.txt文件。  文件内部的数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。
有结构文件
由一组相似的记录组成,又称“记录式文件”。每条记录又由若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)  这是一张数据库表,记录了各个学生的信息 每个学生对应一条记录,每条记录由若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。  这个有结构文件由定长记录组成,每条记录的长度都相同(共128B)。各数据项都处在记录中相同的位置,“具有相同的顺序和长度(前32B一定是学号,之后32B一定是姓名....….)   这个有结构文件由可变长记录组成,由于各个学生的特长存在很大区别,因此“特长”这个数据项的长度不确定,这就导致了各条记录的长度也不确定。当然,没有特长的学生甚至可以去掉“特长”数据项。 根据有结构文件中的各条记录在逻辑上如何组织,可以分为三类
顺序文件
顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。  顺序存储――逻辑上相邻的记录物理上也相邻(类似于顺序表)  链式存储――逻辑上相邻的记录物理上不一定相邻(类似于链表) 假设:已经知道了文件的起始地址(也就是第一个记录存放的位置) 思考1:能否快速找到第i个记录对应的地址?(即能否实现随机存取) 思考2:能否快速找到某个关键字对应的记录存放的位置?
串结构
记录之间的顺序与关键字无关 通常按照记录存入的时间决定记录的顺序
顺序结构
记录之间的顺序按关键字顺序排列
链式存储
无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找
顺序存储
 需要显式地给出记录长度,假设用1字节表示记录长度  结论:定长记录的顺序文件,若物理上采用顺序存储,则可实现随机存取;若能再保证记录的顺序结构,则可实现快速检索(即根据关键字快速找到对应记录) 注:一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。之后的讲解中提到的顺序文件也默认如此。可见,顺序文件的缺点是增加/删除一个记录比较困难(如果是串结构则相对简单)
可变长记录
无法实现随机存取。每次只能从第一个记录开始依次往后查找
定长记录
可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i*L 若采用串结构,无法快速找到某关键字对应的记录 若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)
索引文件
对于可变长记录文件,要找到第i个记录,必须先顺序第查找前i-1个记录,但是很多应用场景中又必须使用可变长记录。如何解决这个问题?  建立一张索引表以加快文件检索速度。每条记录对应一个索引项。 文件中的这些记录在物理上可以离散地存放。 索引表本身是定长记录的顺序文件。因此可以快速找到第i个记录对应的索引项。可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。 另外,可以用不同的数据项建立多个索引表。如:学生信息表中,可用关键字“学号”建立一张索引表。也可用“姓名”建立一张索引表。这样就可以根据“姓名”快速地检索文件了。 (Eg:SQL就支持根据某个数据项建立索引的功能)
索引顺序文件
思考索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大。比如:文件的每个记录平均只占8B,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。 索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。  在本例中,学生记录按照学生姓名的开头字母进行分组。每个分组就是一个顺序文件,分组内的记录不需要按关键字排序 索引顺序文件的索引项也不需要按关键字顺序排列,这样可以极大地方便新表项的插入 用这种策略确实可以让索引表“瘦身”,但是是否会出现不定长记录的顺序文件检索速度慢的问题呢? 若一个顺序文件有10000个记录,则根据关键字检索文件,只能从头开始顺序查找(这里指的并不是定长记录、顺序结构的顺序文件),平均须查找5000个记录。 若采用索引顺序文件结构,可把10000个记录分为√10000=100组,每组100个记录。则需要先顺序查找索引表找到分组(共100个分组,因此索引表长度为100,平均需要查50次),找到分组后,再在分组中顺序查找记录(每个分组100个记录,因此平均需要查50次)。可见,采用索引顺序文件结构后,平均查找次数减少为50+50= 100次。 同理,若文件共有个记录,则可分为1000个分组,每个分组1000个记录。根据关键字检索一个记录平均需要查找500+500 = 1000次。这个查找次数依然很多,如何解决呢? 为了进一步提高检索效率,可以为顺序文件建立多级索引表。例如,对于一个含个记录的文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表中共有10000个表项(即10000个定长记录),再把这10000个定长记录分组,每组100个,为其建立顶级索引表,故顶级索引表中共有100个表项。  此时,检索一个记录平均需要查找50+50+50=150次
文件目录
 文件之间的组织结构清晰,易于查找 编程时也可以很方便的用文件路径找到一个文件。如: FILE *fp; fp=fopen("F:\data\myfile.dat"); 用户可以轻松实现“按名存取” 文件目录就是就是我们很熟悉的Windows操作系统的“文件夹”
文件控制块
实现文件目录的关键数据结构  根目录(D:盘)的目录文件  目录本身就是一种有结构文件,由一条条记录组成。每条记录对应一个放在该目录下的文件 当我们双击“照片”后,操作系统会在这个目录表中找到关键字“照片”对应的目录项(也就是记录),然后从外存中将“照片”目录的信息读入内存,于是,“照片”目录中的内容就可以显示出来了。  目录文件中的一条记录就是一个“文件控制块(FCB)” FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。 FCB实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”
需要对目录进行哪些操作?

搜索
搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
创建文件
创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
删除文件
删除文件:当删除一个文件时,需要在目录中删除相应的目录项
显示目录
用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
修改目录
修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)
目录结构
单级目录结构
早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。  单级目录实现了“按名存取”,但是不允许文件重名。 在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。 显然,单级目录结构不适用于多用户操作系统。
两级目录结构
 主文件目录记录用户名及相应用户文件目录的存放位置 用户文件目录由该用户的文件FCB组成 允许不同用户的文件重名。文件名虽然相同,但是对应的其实是不同的文件 两级目录结构允许不同用户的文件重名,也可以在目录上实现访问限制(检查此时登录的用户名是否匹配)。但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类
多级目录结构(树形目录结构)
又称树形目录结构  不同目录下的文件可以重名 用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。 例如:自拍.jpg 的绝对路径是“/照片/2015-08/自拍.jpg” 系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的存放位置后,从外存读入对应的目录表;再找到“2015-08”目录的存放位置,再从外存读入对应目录表;最后才找到文件“自拍.jpg”的存放位置。整个过程需要3次读磁盘I/O操作。 很多时候,用户会连续访问同一目录内的多个文件(比如:接连查看“2015-08”目录内的多个照片文件),显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。 树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。
无环图目录结构
 在树形目录结构的基础上,增加一些指向同一节点的有向边,使整个目录成为一个有向无环图。可以更方便地实现多个用户间的文件共享。 可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。 需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。 只有共享计数器减为0时,才删除结点。 注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。
索引结点(对文件控制块的优化)
 其实在查找各级目录的过程中只需要用到“文件名”这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以考虑让目录表“瘦身”来提升效率。  思考有何好处? 假设一个FCB是64B,磁盘块的大小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有640个目录项,则共需要占用640/16=40个盘块。因此按照某文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)。 若使用索引结点机制,文件名占14B,索引结点指针占2B,则每个盘块可存放64个目录项,那么按文件名检索目录平均只需要读入320/64 =5个磁盘块。显然,这将大大提升文件检索速度。 当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。 存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。
文件的物理结构(文件分配方式)
即:文件数据应该怎样存放在外存中?
操作系统需要对磁盘块进行哪些管理
对非空闲磁盘块的管理(存放了文件数据的磁盘块)
“文件的物理结构/文件分配方式”要探讨的问题
对空闲磁盘块的管理
“文件存储空间管理”要探讨的问题
文件块、磁盘块
 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同 内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以“块”为单位进行的。即每次读入一块,或每次写出一块  在内存管理中,进程的逻辑地址空间被分为一个一个页面 同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”。 于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。 若块的大小是1KB,则1MB大小的文件可以被分为1K个块  操作系统为文件分配存储空间都是以块为单位的 用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射
连续分配
连续分配方式要求每个文件在磁盘上占有一组连续的块。  用户通过逻辑地址来操作自己的文件,操作系统如何实现从逻辑地址到物理地址的映射? (逻辑块号,块内地址)→(物理块号,块内地址)。只需转换块号就行,块内地址保持不变  文件目录中记录存放的起始块号和长度(总共占用几个块) 用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB) 物理块号=起始块号+逻辑块号 当然,还需要检查用户提供的逻辑块号是否合法(逻辑块号≥长度就不合法)  若此时文件A要拓展,需要再增加一个磁盘块(总共需要连续的4个磁盘块)。由于采用连续结构,因此文件A占用的磁盘块必须是连续的。  结论:物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片 可以用紧凑来处理碎片,但是需要耗费很大的时间代价 优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快 缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片
链接分配
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。
隐式链接
 如何实现文件的逻辑块号到物理块号的转变? 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)... 从目录项中找到起始块号(即0号块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置......以此类推。 因此,读入i号逻辑块,总共需要i+1次磁盘I/O。 结论:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。 若此时要拓展文件,则可以随便找一个空闲磁盘块,挂到文件的磁盘块链尾,并修改文件的FCB 结论:采用隐式链接的链接分配方式,很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。 隐式链接——除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。 优点:很方便文件拓展,不会有碎片问题,外存利用率高。 缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。
显式链接
把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)  目录中只需记录文件的起始块号  假设某个新创建的文件“aaa”依次存放在磁盘块2→5→0→1 假设某个新创建的文件“bbb”依次存放在磁盘块4→23→3 注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。  如何实现文件的逻辑块号到物理块号的转变? 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)... 从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。 结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问i号逻辑块时,并不需要依次访问之前的0~i-1号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。 显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。 显式链接——把用于链接文件各物理块的指针显式地存放在一张表中,即文件分配表(FAT,FileAllocation Table)。一个磁盘只会建立一张文件分配表。开机时文件分配表放入内存,并常驻内存。 优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。 缺点:文件分配表的需要占用一定的存储空间。
考试
考试题目中遇到未指明隐式/显式的“链接分配”,默认指的是隐式链接的链接分配
索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。 假设某个新创建的文件“aaa”的数据依次存放在磁盘块2→5→13 →9。7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容。   目录中需要记录文件的索引块是几号磁盘块  类似的,文件“bbb”的索引块是23号磁盘块,其中存放了文件“bbb”的索引表 注:在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。 可以用固定的长度表示物理块号(如:假设磁盘总容量为1TB=2^40B,磁盘块大小为1KB,则共有2^30个磁盘块,则可用4B表示磁盘块号),因此,索引表中的“逻辑块号”可以是隐含的。 如何实现文件的逻辑块号到物理块号的转换? 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)... 从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可知i号逻辑块在外存中的存放位置。 可见,索引分配方式可以支持随机访问。文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可) 若每个磁盘块1KB,一个索引表项4B,则一个磁盘块只能存放256个索引项。 如果一个文件的大小超过了256块,那么一个磁盘块是装不下文件的整张索引表的,如何解决这个问题? ①链接方案 ②多层索引 ③混合索引
①链接方案
如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。 假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。  若一个文件大小为256*256KB=65,536KB =64MB 该文件共有256*256个块,也就对应256*256个索引项,也就需要256个索引块来存储,这些索引块用链接方案连起来。 若想要访问文件的最后一个逻辑块,就必须找到最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前255个索引块。 这显然是很低效的。如何解决呢?
②多层索引
建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。 假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。  若某文件采用两层索引,则该文件的最大长度可以到256*256*1KB=65,536 KB=64MB 若采用多层索引,则各层索引表大小不能超过一个磁盘块 可根据逻辑块号算出应该查找索引表中的哪个表项。如:要访问1026号逻辑块,则 1026/256=4,1026%256= 2 因此可以先将一级索引表调入内存,查询4号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可知道1026号逻辑块存放的磁盘块号了。访问目标数据块,需要3次磁盘I/O。 若采用三层索引,则文件的最大长度为256*256*256*1KB =16GB 类似的,访问目标数据块,需要4次磁盘I/O 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作
③混合索引
多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。  这种结构的索引支持的最大文件长度为65800KB 若顶级索引表还没读入内存 访问0~7号逻辑块:两次读磁盘 访问8~263:三次读磁盘 访问264~65799:四次读磁盘 对于小文件,只需较少的读磁盘次数就可以访问目标数据块。(一般计算机中小文件更多)
逻辑结构VS物理结构
C语言创建无结构文件
FILE *fp = fopen("test.txt","w"); //打开文件 if( fp == NULL ){ printf("打开文件失败!"); exit(0); } //写入1w个Hello world for (int i=0; i<10000; i++) fputs ("Hello world!", fp); fclose(fp); //关闭文件  
逻辑结构(从用户视角看)
每个字符1B。在用户看来,将整个文件占用一片连续的这辑地址空间  Eg:你要找到第16个字符(编号从0开始) FILE *fp = fopen("test.txt", "r"); //以"读"方式打开文件 if( fp == NULL ){ puts ( "Fail to open file!"); exit(0); } fseek(fp, 16, SEEK_SET); //读写指针指向16 char c = fgetc(fp); //从读写指针所指位置读出1个字符 printf("字符:%c", c); //打印从文件读出的字符 fclose(fp); //关闭文件 
物理结构(从操作系统视角看)
 操作系统现角:反正就是一堆二进制数据,每个磁盘块可存储1KB,拆就完了!  被操作系统拆分为若干个块,逻辑块号相邻  连续分配:逻辑上相邻的块物理上也相邻 用户: 使用C语言库函数fseek,将文件读写指针指向位置n 使用C语言库函数fgetc,从读写指针所指位置读出1B内容 fgetc底层使用了 Read系统调用,操作系统将(逻辑块号,块内偏移量)转换为(物理块号,块内偏移量)  链接分配:逻辑上相邻的块在物理上用链接指针表示先后关系  索引分配:操作系统为每个文件维护一张索引表,其中记录了逻辑块号→物理块号的映射关系
C语言创建顺序文件
typedef struct { int number; //学号 char name[30]; //姓名 char major[30]; //专业 } Student_info; //以"写"方式打开文件 FILE *fp = fopen("students.info", "w"); if(fp == NULL) { printf("打开文件失败!"); exit(0); } Student_info student[N]; //用数组保存N个学生信息 for(int i = 0; i<N; i++) { //生成N个学生信息 student[i].number=i; student[i].name[0]='?'; student[i].major[0]='?'; } //将N个学生的信息写入文件 fwrite(student, sizeof(Student_info), N, fp); fclose(fp); 用户视角:每个学生记录占64Bsizeof(Student_info)  //以"读"方式打开文件 FILE *fp = fopen("students.info", "r"); if(fp == NULL) { printf("打开文件失败!"); exit(0); } //文件读写指针指向编号为5的学生记录 fseek(fp, 5*sizeof(Student_info), SEEK_SET); Student_info stu; //从文件读出1条记录,记录大小为sizeof(Student_info) fread(&stu, sizeof(Student_info),1, fp); printf("学生编号:%d\n", stu. number); fclose(fp);
物理结构(从操作系统视角看)
操作系统现角:反正就是一堆二进制数据,每个磁盘块可存储1KB,拆就完了!   连续分配:逻辑上相邻的块物理上也相邻  链接分配:逻辑上相邻的块在物理上用链接指针表示先后关系  索引分配:操作系统为每个文件维护一张索引表,其中记录了逻辑块号→物理块号的映射关系
顺序文件采用顺序存储/链式存储
顺序文件:各个记录可以顺序存储或链式存储。 顺序存储,各条记录相邻着存放  typedef struct { int number; //学号 char name [30]; //姓名 char major [30]; //专业 } Student_info; 支持随机访问:指可以直接确定第i条记录的逻辑地址  链式存储,各条记录离散着存放,用指针表示先后关系 typedef struct { int number; //学号 char name[30]; //姓名 char major[30]; //专业 int next; //下一个学生记录的存放位置 } Student_info;
链式存储顺序文件采用连续分配...
 操作系统视角:反正就是一堆二进制数据,每个磁盘块可存储1KB,拆就完了!   连续分配:逻辑上相邻的块物理上也相邻  文件内部各条记录链式存储:由创建文件的用户自己设计的 文件整体用链接分配:由操作系统决定
逻辑结构:索引文件
typedef struct { int number; //学号 int addr; //学生记录的逻辑地址 } IndexTable; typedef struct { char name[30]; //姓名 char major[30]; //专业 //还可添加其他各种各样的学生信息 } Student_info;  索引文件:从用户视角来看,整个文件依然是连续存放的。如:前1MB存放索引项,后续部分存放记录。
索引文件采用索引分配
操作系统视角:反正就是一堆二进制数据,每个磁盘块可存储1KB,拆就完了!   索引文件的索引表:用户自己建立的,映射:关键字→记录存放的逻辑地址 索引分配的索引表:操作系统建立的,映射:逻辑块号→物理块号
文件存储空间管理
存储空间的划分与初始化
安装Windows操作系统的时候,一个必经步骤是――为磁盘分区(C: 盘、D: 盘、E: 盘等)
文件卷(逻辑卷)的概念
存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)  有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷
目录区与文件区
 存储空间的初始化:将各个文件卷划分为目录区、文件区 目录区主要存放文件目录信息(FCB)、用于磁盘存储空间管理的信息 文件区用于存放文件数据
几种管理方法
学习时注意从三个方面进行理解: 1.用什么方式记录、组织空闲块? 2.如何分配磁盘块 3.如何回收磁盘块
空闲表法
 适用于“连续分配方式” 如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。 Eg:新创建的文件请求3个块,采用首次适应算法 如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况——①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。
空闲链表法
空闲盘块链
以盘块为单位组成一条空闲链  操作系统保存着链头、链尾指针。 如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。 如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。 适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作
空闲盘区链
以盘区为单位组成一条空闲链  操作系统保存着链头、链尾指针。 如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。 离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高
位示图法
 位示图:每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号) 重要重要重要:要能自己推出盘块号与(字号,位号)相互转换的公式。注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始 如本例中盘块号、字号、位号从0开始,若n表示字长,则... (字号,位号)=(i, j)的二进制位对应的盘块号b= ni+j b号盘块对应的字号i= b/n,位号j= b%n (0,1)→b=16*0+1=1 (1,10)→b=16*1+10=26 b=13→i=13/16=0, j=13%16=13 b=31→i=31/16=1, j=31%16=15 如何分配:若文件需要k个块,①顺序扫描位示图,找到k个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;③将相应位设置为“1”。 如何回收:①根据回收的盘块号计算出对应的字号、位号;②将相应二进制位设为“0” 连续分配、离散分配都适用
成组链接法
空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。 文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。   如何分配? Eg:需要1个空闲块 ①检查第一个分组的块数是否足够。1<100,因此是足够的。 ②分配第一个分组中的1个空闲块,并修改相应数据  Eg:需要100个空闲块 ①检查第一个分组的块数是否足够。100=100,是足够的。 ②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。  如何回收? Eg:假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块  Eg:假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
文件的基本操作
创建文件(create系统调用)
 可以“创建文件”(点击新建后,图形化交互进程在背后调用了“create系统调用”) 进行Create系统调用时,需要提供的几个主要参数: 1.所需的外存空间大小(如:一个盘块,即1KB) 2.文件存放路径(“D:/Demo”) 3.文件名(这个地方默认为“新建文本文档.txt”)操作系统在处理Create系统调用时,主要做了两件事: 1.在外存中找到文件所需的空间(结合上小节学习的空闲链表法、位示图、成组链接法等管理策略,找到空闲空间) 2.根据文件存放路径的信息找到该目录对应的目录文件(此处就是D:/Demo目录),在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。
删除文件(delete系统调用)
 可以“删除文件”(点了“删除”之后,图形化交互进程通过操作系统提供的“删除文件”功能,即delete系统调用,将文件数据从外存中删除) 进行Delete系统调用时,需要提供的几个主要参数: 1.文件存放路径(“D:/Demo”) 2.文件名(“test.txt”) 操作系统在处理Delete系统调用时,主要做了几件事: 1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。 2.根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(回收磁盘块时,根据空闲表法、空闲链表法、位图法等管理策略的不同,需要做不同的处理) 3.从目录表中删除文件对应的目录项。
打开文件(open系统调用)
在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供的几个主要参数: 1.文件存放路径(“D:/Demo”) 2.文件名(“test.txt”) 3.要对文件的操作类型(如: r只读;rw读写等) 操作系统在处理open系统调用时,主要做了几件事: 1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。  2.将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。  之后用户进程A再操作文件就不需要每次都重新查目录了,这样可以加快文件的访问速度  可以方便实现某些文件管理的功能。例如:在Windows系统中,我们尝试删除某个txt文件,如果此时该文件已被某个“记事本”进程打开,则系统会提示我们“暂时无法删除该文件”。其实系统在背后做的事就是先检查了系统打开文件表,确认此时是否有进程正在使用该文件。 读写指针:记录了该进程对文件的读写操作进行到的位置 访问权限:如果打开文件时声明的是‘只读”,则该进程不能对文件进行写操作
关闭文件(close系统调用)
 进程使用完文件后,要“关闭文件” 操作系统在处理Close系统调用时,主要做了几件事: 1.将进程的打开文件表相应表项删除 2.回收分配给该文件的内存空间等资源 3.系统打开文件表的打开计数器count减1,若count=0,则删除对应表项。 
读文件(read系统调用)
 可以“读文件”,将文件数据读入内存,才能让CPU处理(双击后,“记事本”应用程序通过操作系统提供的“读文件”功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)  进程使用read系统调用完成写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据(如:读入1KB)、指明读入的数据要放在内存中的什么位置。 操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。
写文件(write系统调用)
 可以“写文件”,将更改过的文件数据写回外存(我们在“记事本”应用程序中编辑文件内容,点击“保存”后,“记事本”应用程序通过操作系统提供的“写文件”功能,即 write系统调用,将文件数据从内存写回外存)  进程使用write系统调用完成写操作,需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写出多少数据(如:写出1KB)、写回外存的数据放在内存中的什么位置 操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。
文件共享
操作系统为用户提供文件共享功能,可以让多个用户共享地使用同个文件 注意:多个用户共享同一个文件,意味着系统中只有“一份”文件数据。并且只要某个用户修改了该文件的数据,其他用户也可以看到文件数据的变化。 如果是多个用户都“复制”了同一个文件,那么系统中会有“好几份”文件数据。其中一个用户修改了自己的那份文件数据,对其他用户的文件数据并没有影响。
基于索引结点的共享方式(硬链接)
知识回顾:索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。  索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。 若count=2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。 若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
基于符号链的共享方式(软链接)
 当User3访问“ccc”时,操作系统判断文件“ccc”属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的“aaa”表项,于是就找到了文件1的索引结点。   Link类型的文件名可以不同  双击打开时,操作系统判断这个文件是Link类型的“快捷方式”文件,于是会根据其中记录的“路径信息”检索目录,最终找到“QQScLauncher.exe” 
文件保护
保护文件数据的安全
口令保护
为文件设置一个“口令”(如:abc112233),用户请求访问该文件时必须提供“口令”。 口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件 优点:保存口令的空间开销不多,验证口令的时间开销也很小。 缺点:正确的“口令”存放在系统内部,不够安全。
加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。 Eg:一个最简单的加密算法——异或加密 假设用于加密/解密的“密码”为“01001”    优点:保密性强,不需要在系统中存储“密码” 缺点:编码/译码,或者说加密/解密要花费一定时间。
访问控制
在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。  有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题 精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。如:分为系统管理员、文件主、文件主的伙伴、其他用户几个分组。 当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限(系统需要管理分组的信息)。  若想要让某个用户能够读取文件,只需要把该用户放入“文件主的伙伴”这个分组即可
访问类型
读
从文件中读数据
写
向文件中写数据
执行
将文件装入内存并执行
添加
将新信息添加到文件结尾部分
删除
删除文件,释放空间
列表清单
列出文件名和文件属性
Windows的访问控制
    
文件系统的层次结构
 用一个例子来辅助记忆文件系统的层次结构: 假设某用户请求删除文件“D:/工作目录/学生信息.xlsx”的最后100条记录。 1.用户需要通过操作系统提供的接口发出上述请求——用户接口 2.由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项——文件目录系统 3.不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限——存取控制模块(存取控制验证层) 4.验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址——逻辑文件系统与文件信息缓冲区 5.知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址――物理文件系统 6.要删除这条记录,必定要对磁盘设备发出请求——设备管理程序模块 7.删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收——辅助分配模块
用户接口
文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)
文件目录系统
用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的FCB或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如:管理活跃的文件目录表、管理打开文件表等。
存取控制模块
为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。
逻辑文件系统与文件信息缓冲区
用户指明想要访问文件记录号,这一层需要将记录号转换为对应的逻辑地址
物理文件系统
这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址
辅助分配模块
负责文件存储空间的管理,即负责分配和回收存储空间
设备管理模块
直接与硬件交互,负责和硬件直接相关的一些管理工作。如:分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等
文件系统的全局结构
原始磁盘

物理格式化后
 物理格式化,即低级格式化——划分扇区,检测坏扇区,并用备用扇区替换坏扇区
逻辑格式化后(文件系统在外存中的结构)
 逻辑格式化后,磁盘分区(分卷Volume),完成各分区的文件系统初始化 注:逻辑格式化后,灰色部分就有实际数据了,白色部分还没有数据
文件系统在内存中的结构
 注:近期访问过的目录文件会缓存在内存中,不用每次都从磁盘读入,这样可以加快目录检索速度 
open系统调用打开文件的背后过程

虚拟文件系统
普通的文件系统

虚拟文件系统
 虚拟文件系统的特点: ①向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异 ②VFS要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。 一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求   存在的问题:不同的文件系统,表示文件数据结构各不相同。打开文件后,其在内存中的表示就不同 解决方法:  ③每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。 注意:vnode只存在于主存中,而node既会被调入主存,也会在外存中存储  打开文件后,创建vnode,并将文件信息复制到vnode中,vnode的功能指针指向具体文件系统的函数功能。
文件系统的挂载
文件系统挂载(mounting),即文件系统安装/装载——如何将一个文件系统挂载到操作系统中? 文件系统挂载要做的事: ①在VFS中注册新挂载的文件系统。内存中的挂载表(mount table)包含每个文件系统的相关信息,包括文件系统类型、容量大小等。 ②新挂载的文件系统,要向VFS提供一个函数地址列表 ③将新文件系统加到挂载点(mountpoint),也就是将新文件系统挂载在某个父目录下 
挂载点
Windows系统  Mac系统 
刷题笔记
适合随机访问且易于扩展的文件物理结构
文件的物理结构包括连续、链式、索引三种,其中链式结构不能实现随机访问,连续结构的文件不易于扩展。因此随机访问且易于扩展是索引结构的特性。
修改逻辑记录的注意事项
修改需要写回操作,需多访问1次磁盘。
会产生饥饿现象的磁盘访问算法
在最短寻找时间有限算法中,如果不断有距离磁头比较近的磁盘访问请求时,这些请求被优先满足,导致比较远的磁盘访问请求被无限延迟,从而导致饥饿现象。
会随时改变磁头运动方向的磁盘访问算法
先来先服务算法根据磁盘请求的时间先后进行调度,因而可能随时改变磁头方向。而电梯调度、循环扫描算法均限制磁头的移动方向,不能随时改变移动方向。
磁盘结构
磁盘是旋转盘式存储设备,每个盘面划分有若干存储信息的同心圆称为磁道,每个磁道又划分成多个扇区。
硬盘传送速率中的K
硬盘传送速率中的K是按1000来计算的,并不是1024。
建立文件系统的主要目的
文件系统是指操作系统中与文件管理有关的程序和数据的集合,其主要任务就是建立,打开、关闭、撤销以及对文件实现按名存取和进行存取控制。
UNIX的文件空间分配方式
UNIX采用的是混合(索引)分配方式。
文件安全管理的主要方法
文件级安全管理,是通过系统管理员或文件主对文件属性的设置,来控制用户对文件的访问。
文件系统防止意外破坏文件的方法
文件的保护是防止文件被破坏,造成文件可能被破坏的原因有时是硬件故障、软件失误引起的,有时是由于共享文件时引起的错误,应根据不同的情况,采用不用的保护措施。 为了防止各种意外可能破坏文件,文件系统可以采用建立副本和定时转储的方法,来保护文件。建立副本是指把同一个文件存放到多个存储介质上,当某个存储介质上的文件被破坏时,可用其他存储介质上的备用副本来替换。这种方法简单,但系统开销增大,且当文件更新时必须改动所有的副本,也增加了系统的负担。因此,这种方法适用于容量较小且极为重要的文件。 另一种保护方法是定时转储,即定时地把文件转储到其他的存储介质上。当文件发生故障时,就用转储的文件来复原,把有故障的文件恢复到某一时刻的状态,仅丢失了自上次转储以来新修改或增加的信息。UNIX系统就采用定时转储来保护文件,提高文件的可靠性。
MS-DOS的文件物理结构
MS-DOS中的文件物理结构采用显示链接分配方式。在MS-DOS中,一个文件使用的磁盘空间以簇为单位进行分配,簇是—组扇区的组合,MS-DOS将一个文件使用的全部簇组成一个链表放在FAT表(文件分配表)中。
SCAN(扫描)算法/电梯算法内容
SCAN(扫描)算法,也称为电梯算法。磁头固定地从内向外运动,到外边缘后返回,继续往内移,直到最内道,再返回,如此往复,当遇到提出请求的柱面时,即为其服务。磁头固定在水平的两个端点来回扫描。
feof函数
feof 函数可判断文件指针是否处于文件结束位置,如是,则返回值为1,否则为0
文件系统最基本的功能
按名存取是文件的基本功能,做不到就没有文件的效用了。
文件分配表所支持的文件存储结构的本质
文件分配表是基于链接结构实现的。
RAID磁盘阵列的优缺点
RAID的原理就是让各类磁盘并行; RAIDO有提高数据存取速度的功能; RAID1-5提高了磁盘的容错性。 RAID不能扩充磁盘容量。
文件系统管理空闲磁盘块的数据结构
传统的文件系统管理空间磁盘的方法包括空闲表法、空闲链表法、位示图和成组链接法。文件分配表(FAT)的表项与物理磁盘块一一对应,并且可以用一个特殊的数字-1表示文件的最后一块,用-2表示这个磁盘块是空闲的(当然,规定用-3、-4来表示也是可行的)。因此文件分配表(FAT)不仅记录了文件中各个块的先后链接关系,同时还标记了空闲的磁盘块,操作系统可以通过FAT对文件存储空间进行管理。索引结点是操作系统为了实现文件名与文件信息分开而设计的数据结构,存储了文件描述信息,索引结点属于文件目录管理部分的内容。
不会导致磁臂黏着的磁盘调度算法
当系统总是持续出现某个磁道的访问请求时,均持续满足最短寻道时间优先、扫描算法和循环扫描算法的访问条件,会一直服务该访问请求。因此,先来先服务按照请求次序进行调度比较公平。
可提高文件访问速度的磁盘优化方法
为文件分配连续的簇和采用磁盘高速缓存显然均能提高文件访问速度。对于提前读,是指在读当前盘块时,将下一个可能要访问的盘块数据读入缓冲区,以便需要时直接从缓冲区中读取,提高了文件的访问速度。对于延迟写,是先将写数据写入缓冲区,并置上“延迟写”标志,以备不久之后访问,当缓冲区需要再次被分配出去时才将缓冲区数据写入磁盘,减少了访问磁盘的次数,提高了文件的访问速度。
描述文件权限的位数
为表示不同类别用户对一个文件的访问权限,可以把用户访问权限抽象为—个矩阵,行代表用户,列代表访问权限。这个矩阵有4行5列,1代表true,0代表false。
硬链接的相互关系
在Linux系统中,多个文件名指向同一个索引节点(Inode号相同)(Inode)是正常且被允许的。这种情况下的两个文件就称作互为硬链接文件,本质上就是相同文件的两个名字(类似一个人的全名和小名一样)。
磁盘物理格式化和逻辑格式化的工作
一个新的磁盘是一个空白版,必须分成扇区以便磁盘控制器能读和写,这个过程称为低级格式化(或物理格式化)。低级格式化为磁盘的每个扇区采用特别的数据结构,包括校验码。为了使用磁盘存储文件,操作系统还需要将其数据结构记录在磁盘上。这分为两步,第一步是将磁盘分为由一个或多个柱面组成的分区,每个分区可以作为一个独立的磁盘。在分区之后,第二步是逻辑格式化(创建文件系统)。在这一步,操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空内和已分配的空间及一个初始为空的目录。
提高RAID可靠性的措施
RAID0方案是无冗余和无校验的磁盘阵列,而RAID1~5方案均是加入了冗余(镜像)或校验的磁盘阵列。故能够提高RAID可靠性的措施主要是对磁盘进行镜像处理和进行奇偶校验。
磁盘条带化技术
条带化技术就是—种自动地将I/O的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把它们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分但不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的I/O并行能力,从而获得非常好的性能。
光盘文件播放性能最好的文件组织方式
为了实现快速随机播放,要保证最短的查询时间,即不能选取链表和索引结构,因此连续结构最优。
文件系统管理的空间对象
文件系统管理的是逻辑地址空间,可以包括虚拟空间,辅存空间和物理空间对应的逻辑地址空间。
大小不固定的直接存取文件采用的文件结构
文件采用直接存储,可以采用顺序式,但是由于文件大小不固定,采用索引式更好。
UNIX文件管理系统索引结点的本质
UNIX文件系统中,采用的是层次结构的目录和文件,文件的控制块被分为两部分,一部分包括文件的结构信息、物理块号、存取控制和管理信息等文件说明,并用文件系统赋予的唯一的内部标识符来标识;另一部分包括符号文件名和系统赋予的该文件的内部标识符组成。前一部分存放在64字节的索引节点中,后一部分存放在目录中,因此索引节点是一种文件的物理结构。
最简单的文件访问方法
直接访问只需要一步,就能访问文件。而顺序访问需要不断遍历。相对访问还需要计算出绝对位置。逻辑访问需要转换成物理访问。
给定硬盘系统提高读写效率的方法
给定的硬盘系统,存取时间,传输时间是固定值。旋转时间对读写效率的影响十分微小,而不同的磁盘调度算法对读写效率的影响却是非常大的。
操作系统以空间换时间的技术
操作系统为了实现以空间换取时间,可以采用的技术是Spooling技术。
文件控制块的内容
文件控制块是用于管理文件的一组数据,每个文件均有一个文件控制块,其中包括文件名、文件拥有者、文件创建日期时间等。文件控制块一般在创建该文件时建立的,打开文件只是将文件控制块的内容读入内存,读和写文件是对文件内容操作,它们必须依靠文件控制块的指示,例如外存地址,读写权限等。关闭文件只是将文件控制块回写到磁盘,删除文件时将文件控制块清除。
文件系统各级存取控制措施
为了防止系统中的文件被非法窃取和破坏,在文件系统中必须提供有效的存取控制功能,完善的文件系统中应包含系统级、文件级、用户级等存取控制措施。
树形目录结构文件打开后的访问文件方式
在树型目录结构中,用户对某文件的首次访问通常都采用文件路径名;文件被打开后,对文件的访问通常采用文件描述符。
多级文件结构的文件访问方式
当一个文件系统含有多级目录时,每访问一个文件,都要使用从树根开始到树叶为止、包括各中间结点名的全路径名。
磁盘所属的存储设备类型
磁盘存储器属于直接存取设备。
快速确定文件块位置的记录方式
多重索引结构:文件在磁盘中的块不是顺序存储,为了加速对文件目录的寻找,在unix系统中,将文件名和其他文件说明信息分开,由文件说明信息形成一个称为索引节点的数据结构,而相应的文件目录项只由文件名和对应的索引节点号组成。
文件逻辑结构、物理存储和文件目录结构的区别
文件的逻辑结构主要有: (1)连续结构(2)多重结构(3)转置结构(4)顺序结构 文件的物理存储主要有: (1)顺序结构(2)链接结构(3)索引结构 文件的目录结构主要有: (1)一级目录结构(2)二级目录结构(3)树形结构(4)无环图
内存分区管理的分区保护措施
内存保护是操作系统中的一个机制,对内存的存取权限进行管理。内存保护的主要目的是防止某个行程去存取不是操作系统配置给它的寻址空间。这个机制可以防止某个进程因为某些错误而影响到其他行程或是操作系统本身的运行。分区分配内存管理方式,通过界限寄存器向进程划分专属的存储空间,实现边界保护。
文件主删除共享文件后留下悬空指针的共享方式
基于索引结点的共享方式,即硬链接。如当用户A创建一个新文件时,它便是该文件的所有者,此时将count置为1。当有用户B要共享此文件时,在用户B的目录中增加一个目录项,并设置一指针指向该文件的索引结点。此时,文件主仍然是用户A,count=2。如果用户A不再需要此文件,不能将文件直接删除。若直接删除了该文件,也必然删除了该文件的索引结点,这样便会使用户B的指针悬空。
UNIX系统存储文件控制信息的数据结构
索引节点是指在许多类Unix文件系统中的一种数据结构,是有文件说明形式的数据结构。每个索引节点保存了文件系统中的一个文件系统对象的元信息数据,但不包括数据内容或者文件名。
各种可变分区分配算法的优缺点
首次适应算法:该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。 最佳适应算法:该算法总是把既能满足要求,又是最小的空闲分区分配给作业。缺点是内存中会留下许多难以利用的小的空闲区。 最坏适应算法:最坏适应算法是将输入的作业放置到主存中与它所需大小差距最大的空闲区中。空闲区大小由大到小排序。 循环首次适应算法:该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的空闲区为止,并从中划出—块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
UNIX系统的文件分类
UNIX中文件分为三类:普通文件,目录文件,特殊文件。
磁盘请求所需的信息
盘地址,内存地址,调度算法是磁盘请求所需要的。
文件系统的主要特点
文件系统的主要特点有:友好的用户接口,对文件进行存取时对用户是透明的,多个用户可以共享某个文件,可以存储大容量的信息。
UNIX系统磁盘节点分配与释放的系统调用
在UNIX系统中,磁盘节点的分配与释放用过程ialloc、ifree来完成。 内存i节点的申请用iget过程,而释放用iput过程。fopen用来打开文件。 namei:列出一个路径中所有的成分,包含符号连接。 close:关闭一个已打开的文件。
UNIX系统构造目录的过程名称
在UNIX系统中,构造目录的任务由makenode过程来完成。 create函数打开一个文件,如果文件不存在,则创建它。 free命令显示系统内存的使用情况。 read命令用于从标准输入读取数值。
磁盘调度算法的种类
先来先服务算法(FCFS), 最短寻道时间优先算法(SSTF), 扫描算法(SCAN)
UNIX操作系统的文件系统结构式
UNIX文件系统是采用分级树型结构。
UNIX系统的目录项组成
UNIX系统中的每个目录项由文件名索引和其相对应的节点号组成。
索引文件的空间分区
索引文件大体上由索引区和数据区构成。其中索引区一般按关键字的顺序存放。
文件广义指令的作用
文件广义指令,主要作用是装入文件目录表。
物理块必须连续的物理文件
顺序文件是把逻辑上连续的文件信息依次存放在顺序存储介质中。链接文件将逻辑文件中的各个逻辑记录任意存放到一些物理块中,再用指针把各个块按逻辑记录的顺序链接起来;索引文件是按索引方式组织的文件结构,文件的逻辑记录任意存放在磁盘中,通过索引表指明每个逻辑记录的存放位置。所以要求物理块必须连续的物理文件是顺序文件。
操作系统实现按名存取和检索的关键
操作系统实现按名存取,进行检索等关键在于解决文件与文件存储地址的转换。
磁盘上的文件至少应包含什么
磁盘上的文件至少应包含文件名和文件地址,文件名用来标示各个文件,文件地址是指文件在磁盘上的物理地址,有了文件名以及文件地址才能访问文件。
文件系统提供统一的用户接口的含义
不同设备提供同样的接口,方便用户操作和编程。 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。系统职责是负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。以方便用户使用。
Windows系统文件名最长字符数
Windows的文件名最长可达到256个,但用户最多可以用255个文件名来取名。因为,不管你在哪个根目录下,先就有磁盘分区符占一位,所以Windows文件名最多可包含255个字符。
计算机系统提供文件共享的另一个注重点
计算机系统既为用户提供了文件共享的便利,又充分注意到系统中文件的安全性和保密性。 文件的共享与安全时一个问题的两个方面,既要保证文件可以共享,又要注意文件的安全与保密。
对文件进行存取操作的基本单位
逻辑记录是对文件进行存取操作的基本单位。
DOS的文件目录结构
DOS和Unix的文件目录结构都是树形的。
磁盘先来先服务调度算法是否合理
虽然先来先服务公平也简单,且每个作业都能得到运行,但是是不合理的,这种方式会导致平均寻道时间较长,产生比较大的系统开销,可以采用其他方法优化
多级文件目录结构访问文件的名称
多级文件目录结构中,对文件的访问是通过目录名和用户名来进行的。
索引顺序文件的存放设备
索引顺序文件应放在顺序存取设备上。
UNIX操作系统的0#块和1#块
在系统中,0#块一般用于系统的引导或空闲,而1#块用于存放文件系统的资源管理信息。
特殊文件的定义
特殊文件是指与硬件设备有关的文件。
典型的块设备与字符设备
典型的块设备是磁盘。 典型的字符设备如交互式终端、打印机等。设备的基本特征是其传输速率比较低,通常为每秒几个字节至数千个字节。字符设备,用于数据的输入和输出。
Linux系统文件挂载相关常识
挂载点必须是一个目录,不能是一个文件。一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。对于其他操作系统建立的文件系统的挂载也是这样。
不同用户文件使用相同文件名如何保证按名存取安全
采用多级目录结构
第5章 I/O设备管理
I/O设备的分类
I/O设备的概念
“I/O”就是“输入/输出”(Input/Output) I/O设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。 它是人机交互的主要的界面和部件 
I/O设备的分类
按传输速率分类
低速设备
第一类是低速设备,这是指其传输速率仅为每秒钟几个字节至数百个字节的一类设备。属于低速设备的典型设备有键盘、鼠标器、语音的输入和输出等设备。
中速设备
第二类是中速设备,这是指其传输速率在每秒钟数千个字节至数万个字节的一类设备。典型的中速设备有行式打印机、激光打印机等。
高速设备
第三类是高速设备,这是指其传输速率在数百千个字节至数十兆字节的一类设备。典型的高速设备有磁带机、磁盘机、光盘机等。
按信息交换的单位分类
UNIX系统的设备分类
块设备
第一类是块设备(Block Device),这类设备用于存储信息。由于信息的存取总是以数据块为单位,故而得名。它属于有结构设备。典型的块设备是磁盘,每个盘块的大小为512B~4KB,特征是可寻址。
字符设备
第二类是字符设备(Character Device),用于数据的输入和输出。其基本单位是字符,故称为字符设备。
按照使用方式
独占设备
一段时间内只允许一个用户/进程访问的设备,例如:临界资源必须互斥访问,且有可能引起进程死锁
共享设备
一段时间内允许多个进程同时访问的设备,每一时刻仅允许一个进程访问,如磁盘为可寻址、可随机访问的设备
虚拟设备
通过虚拟技术将一台独占设备变换为若干台逻辑设备;供若干个用户/进程同时使用
I/O控制器
I/O控制器的定义
I/O设备可以分为机械部件和电子部件,其中,电子部件就是常说的I/O控制器(也叫I/O接口),也称为设备控制器。 之所以称谓不同,是因为在计算机体系结构中,操作系统是最接近硬件的软件部分,其更侧重从软件和功能的角度出发去描述部件,所以称之为设备控制器;  在计算机组成原理中,研究的重点在于硬件组成部分,其更青睐于从硬件的角度出发去描述部件,所以称之为I/O接口。 电子部件称为设备控制器,又称为设备适配器、I/O控制器、I/O控制接口,简称I/O模块或l/O接口,是CPU与设备之间的接口。  对上连接CPU,对下管理I/O设备。
I/O控制器的功能
数据缓冲
主存和CPU寄存器的存取速度都非常快,而外设的速度则较低,在设备控制器中引入数据缓冲寄存器后,输出数据时,CPU只要把数据送到数据缓冲寄存器即可;在输入数据时,CPU只要从数据缓冲寄存器取数即可。在设备控制器控制将数据缓冲寄存器的数据输出到外设或从外设读入数据时,CPU可以做其他事情。 
错误和就绪检测
提供了错误和就绪检测逻辑,并将结果保存在状态寄存器,以供CPU查用。状态信息包括各类就绪和错误信息,如:外设是否完成打印或显示、是否准备好输入数据以供CPU读取、打印机是否发生缺纸、磁盘数据是否发生检验错等。 
控制和定时
接收和识别CPU或通道发来的控制信息和定时信号,根据相应的定时和控制逻辑,向外设发送控制信号,以控制外设进行相应的处理。主机送来的控制信息存放在控制寄存器中。 
数据格式的转换
提供数据格式转换部件(如进行串-并转换的移位寄存器),使通过外部接口得到的数据转换为内部接口需要的格式,或在相反的方向进行数据格式转换。例如,从磁盘驱动器以二进制位的形式读出或写入后,在磁盘控制器中,应对读出的数据进行串-并转换,或对写入的数据进行并串转换。 
当连接多台设备时,设备地址识别

I/O端口
将I/O控制器中CPU能够访问的各类寄存器称为I/O端口,驱动程序(控制外设进行输入/输出的底层I/O软件)通过访问I/O端口控制外设进行I/O对I/O端口读写就是向I/O设备送出命令或从设备读状态或读/写数据。 
控制端口(命令端口)
控制端口(命令端口):CPU通过out指令将控制命令(命令字或者控制字)送到控制寄存器来启动外设工作;控制器对命令字进行解释形成相应控制信息,控制外设进行工作
状态端口
CPU通过in指令读取状态寄存器了解外设和设备控制器的状态;
数据端口
访问数据缓冲寄存器进行数据的输入和输出。
I/O端口编址方式
一个I/O控制器会占有多个端口地址,I/O端口必须编号后,CPU才能访问它,I/O设备的寻址方式就是I/O端口的编号方式: I/O端口编址方式有两种:独立编址方式和统编址方式。
独立编址方式
又称为I/O映射方式,在这种编址方式中,外设端口与主存单元的地址分别单独编址,外设端口不占用主存空间 当访问主存时,由主存读/写控制线控制。 当访问外设时,由I/O读/写控制线控制。外设端口由单独的输入/输出(I/O)指令来访问。
统一编址方式
外设端口和主存单元的地址是统一编址的,即外设接口的寄存器就相当于主存单元。统一编址方式又称为存储器映射,在这种编址方式中,I/O端口地址和主存单元地址是统一编址的,CPU可以用访问主存单元同样的方法访问外设,不需专门的I/O指令。 当CPU访问外设时,把分配给该外设的地址码(具体到该外设接口中的某一寄存器号)送到地址总线上,然后各外设接口中的地址译码器对地址码进行译码,如果符合即是CPU指定的外设寄存器。
概要

I/O控制方式

I/O控制方式
I/O控制方式指的是CPU实现与I/O设备进行数据交换的方式。 CPU和外设之间交换数据,实质上是通过I/O端口进行的。 CPU↔I/O接口/端口↔I/O设备  
程序查询方式
程序查询方式完全通过CPU执行I/O程序来控制主机和外围设备之间的信息传送。 通常的办法是在用户的程序中安排一段由输入输出指令和其他指令所组成的程序段直接控制外围设备的工作。 传送时,首先启动设备,发出启动命令,接着CPU不断地用一条测试指令检测外围设备工作状态标志触发器。—旦测试到标志触发器已置成“完成”状态,即可进行数据传送。  为了正确完成这种传送,通常要使用3条指令: 查询指令,用来查询设备的状态; 传送指令,当设备就绪时,执行数据交换; 转移指令,当设备未就绪时,执行转移指令转向查询指令继续查询。 
特点
在程序直接控制方式中,一旦CPU启动I/O设备,便不断查询I/O设备的准备情况,终止原程序的执行; CPU和I/O设备完全处在串行工作状态; 主机不能充分发挥效率,整个系统的效率很低。
程序中断方式
如果在程序的执行过程中允许I/O设备主动报告自己的状态,那么就不需要CPU不断的查询I/O设备的状态。 中断就是一种允许上报特殊情况的机制。 在程序中断传送方式中,通常在程序中安排一条指令,发出START信号启动外围设备,然后机器继续执行程序。 当外围设备完成数据传送的准备后,便向CPU发“中断请求”(INT)信号。 CPU接到请求后若可以停止正在运行的程序,则在一条指令执行完后(非流水线计算机),转去执行“中断服务程序”,完成传送数据工作,通常传送一个字或一个字节。 传送完毕仍返回原来的程序。 
特点
1)数据传输的基本单位是字节或者字; 2)每次传输一个字或者字节都需要一次中断; 3)I/O设备的启动需要CPU参与,但是CPU处理其他事情和I/O设备准备数据可以同时并行,提高CPU利用率和系统效率; 4)整体而言,CPU是通过相应中断,执行中断处理程序完成I/O过程; 5)由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。
DMA方式
直接存储器存取(direct memory access,简称DMA)方式的基本思想是在外围设备和主存之间开辟直接的数据传送通路。  为了实现在主机与控制器之间成块数据的直接交换,必须在DMA控制器中设置如下四类寄存器: (1)命令/状态寄存器CR。用于接收从CPU发来的I/O命令或有关控制信息,或设备的状态。 (2)内存地址寄存器MAR。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。 (3)数据寄存器DR。用于暂存从设备到内存,或从内存到设备的数据。 (4)数据计数器DC。存放本次CPU要读或写的字(节)数。 DMA中断机构:当一个数据块传送完毕后触发中断机构,向CPU提出中断请求。 DMA方式也是异步方式进行工作,数据块什么时候传输结束,CPU并不能主动感知,必须由DMA中断机构以中断的方式向CPU告知。  (1)当I/O设备要传输数据时,I/O设备向DMA控制器发送DMA请求; (2)DMA控制器接受外设发出的DMA请求,并向CPU发出总线请求; (3)当CPU响应此总线请求,发出总线响应信号后,接管对总线的控制,进入DMA操作周期;  (4)确定传送数据的主存单元地址及传送长度,并能自动修改主存地址计数值和传送长度计数值; (5)规定数据在主存与外设之间的传送方向,发出读/写或其他控制信号,并执行数据传送的操作; (6)DMA中断机构向CPU报告DMA操作的结束; (7)CPU决定是否继续使用DMA。
特点
①数据传输的基本单位是数据块,即在CPU与I/O设备之间,每次传送至少一个数据块; ②所传送的数据是从设备直接送入内存的,或者相反; ③仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在控制器的控制下完成的。 DMA方式较之中断驱动方式,又是成百倍地减少了CPU对I/O的干预,进一步提高了CPU与I/O设备的并行操作程度。
通道方式
I/O通道是一种特殊的处理机。它具有执行I/O指令的能力,并通过执行通道(I/O)程序来控制I/O操作。  其指令类型单一,这是由于通道硬件比较简单,其所能执行的命令主要局限于与I/O操作有关的指令; 通道没有自己的内存,通道所执行的通道程序是放在主机的内存中的,换言之,是通道与CPU共享内存。
工作过程
通道完成一次数据传输的主要过程分为如下3步: ①在用户程序中使用访管指令进入管理程序,由CPU通过管理程序组织一个通道程序,并启动通道。 ②通道执行CPU为它组织的通道程序,完成指定的数据输入输出工作。 ③通道程序结束后向CPU发中断请求。CPU响应这个中断请求后,第二次调用管理程序对中断请求进行处理。 
通道和DMA的主要区别
①DMA控制器是通过专门设计的硬件控制逻辑来实现对数据传送的控制;而通道则是一个具有特殊功能的处理器,它具有自己的指令和程序通过执行一个通道程序实现对数据传送的控制,故通道具有更强的独立处理数据输入/输出的功能。 ②DMA控制器通常只能控制一台或少数几台同类设备;而一个通道则可以同时控制许多台同类或不同类的设备。
“瓶颈”问题
 
I/O软件
I/O软件的设计目标和原则
与具体的设备无关 统一命名 对错误的处理 缓冲技术等 I/O软件: 打印机  显示器 鼠标
I/O软件层次结构

用户层软件
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。用户层软件必须通过各系统调用一一对应的库函数。 一般而言,大部分的I/O软件都在操作系统内部,但是仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行在内核之外的一些程序。用户层软件必须通过一组系统调用来获取操作系统服务。
设备独立性软件
负责实现和设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放,同时为设备管理和数据传送提供必要的存储空间。 系统须具有将逻辑设备名称转换为某物理设备名称的功能。在实现了设备独立性的功能后,可带来以下两方面的好处: 1)设备分配时的灵活性 2)易于实现I/O重定向 为了实现设备独立性,必须再在驱动程序至上设置一层软件,称为设备独立性软件。
主要功能
设备独立性软件主要功能: (1)执行公共设备的共有操作: 1)对独立设备的分配与回收 2)将逻辑设备名映射为物理设备名,进一步可以找到对应的物理设备的驱动程序 3)对设备进行保护,禁止用户直接访问设备 4)缓冲管理 (2)向用户层软件提供统一接口。
设备驱动程序
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。 设备驱动程序通常又称为设备处理程序,它是I/O进程与设备控制器之间的通信程序,又由于常以进程的形式存在,故以后就称之为设备驱动程序。
功能
设备驱动程序的功能 (1)接收由设备独立性软件发来的命令和参数 (2)检查用户I/O请求的合法性 (3)发出I/O命令 (4)及时响应由控制器或者通道发来的中断请求,并根据其中的中断类型调用相应的中断处理程序 (5)对于设置有通道的计算机系统,驱动程序还应能根据用户的I/O的请求,自动构建通道程序
特点
设备驱动程序的特点 (1)驱动程序主要是指在请求I/O的进程与设备控制器之间的一个通信和转换程序。 (2)驱动程序与设备控制器和I/O设备的硬件特性紧密相关,因而对不同类型的设备应配置不同的驱动程序。 (3)驱动程序与I/O设备所采用的I/O控制方式紧密相关。 (4)由于驱动程序与硬件紧密相关,因而其中的一部分必须用汇编语言书写。 (5)驱动程序应允许可重入 (6)驱动程序不允许系统调用
设备处理方式
设备处理方式 (1)为每一类设备设置一个进程,专门用于执行这类设备的I/O操作  (2)在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作 (3)不设置专门的处理程序,而只为各类设备设置相应的设备处理程序(模块),供用户进程或系统进程调用。
中断处理程序
用户保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完后再恢复被中断进程的现场后返回到被中断进程。
主要工作
进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态。
处理过程
中断处理程序的处理过程: 1、唤醒被阻塞的驱动进程 2、保护被中断进程的CPU环境 3、载入相应的设备处理程序 4、中断处理 5、恢复被中断进程的现场
I/O缓冲管理
I/O控制方式
I/O控制方式指的是CPU实现与I/O设备进行数据交换的方式。 CPU和外设之间交换数据,实质上是通过I/O端口进行的。 CPU↔I/O接口/端口↔I/O设备 
缓冲的引入
减少CPU被中断的频率 放宽CPU的中断响应时间限制 提高CPU和I/O设备之间的并行性 缓解CPU与I/O设备之间的速度矛盾  如果是采用中断I/O方式,则每输出完一个字符就要向CPU发送一次中断信号。  缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。 一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区。
单缓冲区
  总处理时间:M+max(C,T) T:I/O设备将数据输入单缓冲的时间 M:操作系统将单缓冲的数据传送至内存用户区的时间 C:CPU对该数据的处理时间
双缓冲区
  总处理时间:max(C+M,T) T:I/O设备将数据输入单缓冲的时间 M:操作系统将单缓冲的数据传送至内存用户区的时间 C:CPU对该数据的处理时间
缓冲区和缓存的对比

设备的分配和回收
分配策略
静态分配
一次性分配进程所需全部设备
动态分配
在进程执行过程中,根据执行需要,按策略分配
设备分配中的数据结构
设备控制表DCT
系统为每个设备配一个DCT,记录其状态 
控制器控制表COCT
控制器控制表COCT:系统为每个控制器配一个COCT 
通道控制表CHCT
通道控制表CHCT:系统为每个通道配一个CHCT 
系统设备表SDT
系统设备表SDT:记录系统全部设备情况的一个表格,每个设备占一个表目 
逻辑设备表LUT
逻辑设备表LUT:存放逻辑设备名、物理设备名、设备驱动程序入口地址的表格,用于完成逻辑设备到物理设备的转换。 为了实现设备无关性,而引入了逻辑设备和物理设备两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备,而系统在实际执行时,还是必须使用物理设备。因此,系统中必须设置一张逻辑设备表LUT。
设备分配中的需要考虑的因素
设备固有属性
不同属性采取不同的分配策略
独占设备
得到设备的进程独占,直至完成或其他原因释放设备
共享设备
可分配给多个进程,并合理分配各进程的访问顺序
虚拟设备
共享设备,可将其同时分配给多个进程
设备分配算法
先来先服务
进程按照申请设备的先后顺序,插入设备请求队列
高优先级优先
进程按照优先级,插入设备请求队列
设备回收
释放设备、设备控制器、通道;修改相应数据结构
安全性
安全分配
进程发出I/О请求后进入阻塞状态,串行工作
不安全分配
进程发出I/O请求后仍可运行,并行工作
逻辑设备名到物理设备名的映射
逻辑设备表LUT
LUT个数
整个系统一个
不允许具有重名的逻辑设备 
每个用户一个
适合多用户系统,放入进程PCB 
设备分配中过程
分配的流程,从资源多的到资源紧张的:LUT->SDT->DCT->COCT->CHCT 在申请设备的过程中,根据用户请求的I/O设备的逻辑名,查找逻辑设备和物理设备的映射表;以物理设备为索引,查找SDT,找到该设备所连接的DCT;继续查找与该设备连接的COCT和CHCT,就找到了一条通路。 显然,在有通道的系统中,一个进程只有获得了通道,控制器和所需设备三者之后,才具备了进行I/O操作的物理条件。
假脱机(SPOOLing)技术
SPOOLing概念
为了缓和CPU的高速性与I/O设备低速性间的矛盾而引入了脱机输入、脱机输出技术。该技术是利用专门的外围控制机,将低速I/O设备上的数据传送到高速磁盘上;或者相反。  当系统中引入了多道程序技术后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机功能,把低速I/O设备上的数据传送到高速磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,便可在主机的直接控制下,实现脱机输入、输出功能。 此时的外围操作与CPU对数据的处理同时进行,我们把这种在联机情况下实现的同时外围操作称为SPOOLing(Simultaneaus Periphernal Operating On-Line),或称为假脱机操作。
SPOOLing实现和组成
 SPOOLing系统是由磁盘中的输入井和输出井,内存中的输入缓冲区和输出缓冲区,输入进程和输出进程以及井管理程序构成的。 在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中 在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上 注意,输入缓冲区和输出缓冲区是在内存中的缓冲区 “输入进程”模拟脱机输入时的外围控制机 “输出进程”模拟脱机输出时的外围控制机
SPOOLing实例
共享打印机技术已被广泛地用于多用户系统和局域网络中。  当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事: ①由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中; ②输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。
独占式设备
只允许各个进程串行使用的设备。一段时间内只能满足一个进程的请求。
共享设备
允许多个进程“同时”使用的设备(宏观上同时使用,微观上可能是交替使用)。可以同时满足多个进程的使用请求。
SPOOLing优点
SPOOLing技术可以把一台物理设备虚拟成逻辑上的多台设备,可将独占式设备改造成共享设备。 提高了I/O的速度。 将独占设备改造为共享设备。 实现了虚拟设备功能。
刷题笔记
通道管理涉及的数据结构
通道管理中,包含设备的分配、设备控制器分配、通道分配,因此会涉及到设备控制表、控制器控制表、通道控制表、系统设备表。
用户给出的设备编号的性质
用户使用逻辑设备号来编写程序,故给出的编号为逻辑编号。
设备管理软件的层次及其邻接关系
设备管理软件—般分为四个层次:用户层、与设备无关的系统调用处理层、设备驱动程序以及中断处理程序。
计算数据在磁盘中位置的程序
计算磁盘号、磁头号和扇区号的工作是由设备驱动程序完成的。
登录系统时首先获得键盘输入信息的程序
键盘是典型的通过中断I/O方式工作的外设,当用户输入信息时,计算机要将键盘输入信息传输到内存特定位置,然后才能进行执行相应的系统调用服务程序,运行用户登录程序,完成登录系统。因此,首先计算机响应中断并通过中断处理程序获得输入信息。
完成关中断的指令
中断周期中关中断是由隐指令完成。
中断服务程序最后一条指令
最后一条指令是中断返回指令。
CPU控制通道的方式
CPU通过I/O指令来控制通道。
Spooling系统中用户程序实际分配的是
通过Spooling技术便可将一台物理I/O设备虚拟成多个虚拟I/O设备,同样允许多个用户共享一台物理I/O设备。所以在Spooling并不是将物理设备真的分配给用户进程。
构成Spooling系统的基本条件
构成Spooling系统的基本条件是要有大容量、高速度的外存作为输入井和输出井。
Spooling系统用户进程是否需要等待I/O空闲
利用Spooling技术提高了系统和IO设备的利用率,进程不必等待I/O操作的完成。 Spooling系统中的用户程序可以随时将输出数据送到输出井中,待输出设备空闲时再由Spooling系统完成数据的输出操作。
Spooling系统是否需要独占设备
因为Spooling技术是一种典型的虚拟设备技术,它通过将独占设备虚拟成共享设备,使得多个进程共享一个独占设备,从而加快了作业的执行速度,也提高了独占设备的利用率。既然是将独占设备虚拟成共享设备,所以必须先有独占设备才行。
使用Spooling技术的主要目的
SPOOLing技术是为解决独占设备数量少、速度慢、不能满足众多进程的要求,而且在进程独占设备期间设备利用率又比较低的情况而提出的一种设备管理技术。
虚拟存储技术的体现
虚拟存诸器是内存的内容。
设备与输入/输出井之间的数据传送的控制者
由系统控制设备与输入/输出井之间的数据传送。
在内存中设置磁盘缓冲区的主要目的
磁盘和内存的速度差异决定了可以将内存经常访问的文件调入磁盘缓冲区,从高速缓存中复制的操作比磁盘I/O的机械操作要快很多很多,减少从磁盘复制数据到内存的次数。
缓冲区管理中着重要考虑的问题
实现进程访问缓冲区的同步。
设备分配时应考虑的因素
在进行设备分配时应考虑的因素有:设备的固有属性,设备的分配算法,设备无关性,安全性。 设备的固有属性:对于独占设备、共享设备、虚拟设备等具有不同属性的设备,通常采用不同的分配算法。 设备无关性:又称为设备独立性,是指应用程序使用的逻辑设备独立于系统实际配置的物理设备。 安全性:即避免死锁的产生。 及时性不是设备分配应考虑问题。
CPU与I/O设备之间的接口
设备控制器是CPU与I/O设备之间的接口,它接收CPU发来的命令,并去控制I/O设备工作,使处理机从繁杂的设备控制事务中解脱出来。设备控制器是一个可编址设备,当它控制一个设备时,它有一个唯一的设备地址,若控制器可连接多个设备时,应具有多个设备地址,使每一个地址对应一个设备。设备控制器的复杂性因设备而异。可把设备控制器分为两类:—类是用于控制低速的字符设备的控制器,另一类是用于控制高速的块设备控制器。
不属于设备与CPU之间数据传送和控制方式的是
设备控制方式
独占设备与共享设备的分配方式
从使用的角度来分析外围设备特性,分为两类,一是独占使用的设备,如扫描仪、打印机等。独占设备每次只允许一个作业独占使用。对独占设备采用静态分配方式,即在一个作业执行前,将作业要使用的这类设备分配给它。作业执行结束后,收回已分配的设备。另一类是共享设备,如磁盘。共享设备允许当一个作业尚未撤离,另一个作业即可使用,但每一时刻只有一个作业启动该设备,允许它们交替地启动。共享设备采用动态分配方法,在作业需要启用设备的时候,才分配设备给作业。
I/O重定向技术
I/O重定向是指可以更换I/O操作的设备而不必改变应用程序。输入/输出重定向允许完成特定功能的程序通过交换数据来进行相互协作。
设备独立性的基本含义
设备独立性也即设备无关性,是指应用程序独立于具体使用的物理设备。为了实现设备独立性,引入了逻辑设备和物理设备两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备,而系统在实际执行时,使用物理设备名称。
中断I/O方式控制输出时CPU和I/O端口之间交换的信息
在程序中断I/O方式中,CPU和打印机直接交换,打印字符直接传输到打印机的I/O端口,不会涉及到主存地址。而CPU和打印机通过I/O端口中状态口和控制口来实现交互。
DMA传输顺序
在开始DMA传输时,主机向内存写入DMA命令块,向DMA控制器写入该命令块的地址,启动I/O设备。然后,CPU继续其他工作,DMA控制器则继续下去直接操作内存总线,将地址放到总线上开始传输。当整个传输完成后,DMA控制器中断CPU。
I/O接口相关常识
状态端接口和控制端可以合用同一个寄存器; I/O接口中CPU可访问的寄存器称为I/O端口; 采用独立编址方式时,I/O端口地址和主存地址可能相同; 采用统一编址时,CPU访存和访问IO端口用的是一样的指令,所以访存指令可以访问I/O端口。
系统处理I/O请求的流程
输入/输出软件—般从上到下分为四个层次:用户层、与设备无关软件层、设备驱动程序以及中断处理程序。与设备无关软件层也就是系统调用的处理程序。所以正确处理流程为用户程序→系统调用处理程序→设备驱动程序→中断处理程序
提高磁盘I/O性能的方法
系统改善磁盘I/O性能的方法主要有预读和滞后写、重排I/O请求队列(虚拟内存),优化文件物理块分布。在一个硬盘上划分多个分区对提高I/O性能并没有帮助。
I/O接口包含的三类寄存器
一般I/O接口部件中都有三种寄存器。它们分别是用作数据缓冲的数据寄存器;用作保存设备和接口的状态信息供CPU对外设进行测试的状态寄存器;用作保存CPU发出的命令以控制接口和设备操作的命令寄存器。
指令编码中必不可少的部分
机器指令通常由操作码和操作数两部分组成。操作码指出该指令所要完成的操作,即指令的功能。操作数指出参与运算的对象,以及运算结果所存放的位置等。零地址指令格式只给出操作码字段OP,没有地址码字段。
分配共享设备和独占设备是否可能产生死锁
分配共享设备是不会引起进程死锁的,分配独占设备有可能。
UNIX的三种写方式
一般写方式 bwrite,这是真正把缓冲区中的数据写到磁盘上,且进程需等待写操作完成; 异步写方式barite,进程无需等待写操作完成便可返回; 延迟写方式bdwrite,该方式并不真正启动磁盘,而只是在缓冲区首部设置延迟写标志,然后便释放该缓冲区,并将之链入空闲链表的末尾。以后,当有进程申请到该缓冲区时,才将其内容写入磁盘。引入延i写的目的是为了减少不必要的磁盘/O,因为只要没有进程申请到此缓冲区,其中的数据便不会被写入磁盘,倘若再有进程需要访问其中的数据时,便可直接从空闲链表中摘下该缓冲区,而不必从磁盘读入。
磁盘的主要I/O控制方式
磁盘是高速外设,以块为单位传送数据,需要DMA控制传输。
系统总线和内部总线
PCI总线、ISA总线、VESA总线是系统总线,SCI是串行通信接口,是内部总线。
根据从属关系分类缓冲区
根据缓冲区设置个数的多少,可分为单缓冲、双缓冲和多缓冲。根据缓冲区的从属关系,可以分为专用缓冲区和缓冲池。
能实现紧凑技术的存储管理
动态重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,添加了紧凑功能。通常,在找不到足够大的空闲分区来满足用户需求时进行紧凑。
I/O设备与存储器不经过CPU的数据交换方式
整个I/O控制方式的发展就是将CPU从中解脱出来,DMA方式与通道方式中进行的数据交换都不经过CPU来完成。
交互式系统时间片设置
交互式系统中,时间片设置为小于等于最大响应时间/用户数比较合适。
命中率高且实现简单的Cache映射方式
影响Cache命中率的因素很多,如Cache的容量,块的大小,映射方式,替换策略以及程序执行中地址流的分布情况等等。 —般地说:Cache容量越大则命中率越高,当容量达到一定程度后,容量的增加命中率的改善并不大;Cache块容量加大,命中率也明显增加,但增加到一定值之后反而出现命中率下降的现象;直接映射方式命中率比较低,全相联方式命中率比较高,在组相联方式中,组数分得越多,则命中率下降。 根据查找算法里面的哈希表方法,电路与直接映射应该是比较相似的,然后哈希添加了解决冲突的方法,所以提高了命中率,且提升幅度不会很小。缺点应该是提升了查找Cache块的时间,降低了运行速度。 所以哈希应该是同时满足命中率高和电路实现简单的选项。
所有外围设备的启动是否均由系统执行
目前常见I/O系统其外部设备的驱动和输入输出都由系统统一管理。
与SPOOLing系统发生联系的操作系统组成部分
SPOOLing系统在工作过程中会和,内存管理,处理机管理,文件管理,设备管理等操作系统组成部分发生联系。
对打印机和磁盘的I/O控制方式
在DMA方式中,仅在传送一个数据块的开始和结束时,才需要CPU干预,整块数据的传送是在DMA控制器的控制下直接完成的。 中断驱动方式与以字(节)为单位。
缓冲池中缓冲体的两部分组成
缓冲池管理着多个缓冲区,每个缓冲区由用于标识和管理的缓冲首部以及用于存储数据的缓冲体部分组成。
与设备驱动程序紧密相关的性质
驱动程序与I/O的特性紧密相关,如果计算机中连有3个同种类型的彩色终端和2个同种类型的黑白终端,可以为它们配置2个设备驱动程序。
设备分配所需的数据结构
设备控制表DCT:系统为每个设备配置一张设备控制表,用于记录本设备的情况,如设备类型,设备标识号、设备状态等。 控制器控制表COCT:系统为每个控制器设备一张用于记录本控制器情况的控制器控制表。 系统设备表SDT:记录系统中全部设备的情况,每个设备占一个表目,包括设备类型、设备标识符、设备控制表,设备驱动程序入口等。 通道控制表:CHCT,用来记录通道的特性、状态及其他管理信息。 系统设备表中有对应的设备控制表的指针,设备控制表中有与该设备相连的控制器的控制表的指针,控制器控制表中有与该控制器相连的通道的通道控制表。也就是说,从系统设备表可以找到该设备的设备控制表,然后找到相连的控制器控制表,最后找到相连的通道的通道控制表。
主存与外设之间的信息传送操作名称
主存储器与外围设备之间的信息传送操作称为I/O操作。
CONFIG.SYS常用配置命令
CONFIG.SYS是DOS系统中的一个重要文件,它的配置直接影响到系统的使用及其效率。如果配置不当的话,可能很多程序都无法正常运行。在CONFIG.SYS文件中,DEVICE行的作用是将指定的设备驱动程序装入内存,BUFFERS行的作用是为指定数量的磁盘缓冲区分配内存。
发现并响应中断的硬件机构
中断的实现需要硬件和软件的合作,硬件部分称为中断装置,软件部分称为中断处理程序。中断装置和中断处理程序统称为中断系统。
设备驱动程序包含内容
设备驱动程序至少包括:初始化例程,启动I/O例程和设备中断处理例程。
通道的详细定义和作用
通道是一个独立于CPU的专管输入/输出的处理机,它控制外设或外存与内存之间的信息互换,例如DMA。
设备分配应保证的两个要求
设备分配应保证设备有高的利用率和避免死锁。
设备管理实现设备无关性在设备命名时的要求
在设备管理中,为实现设备无关性,必须在设备命名时引入逻辑名和物理名。
缓冲区的三种组织方式
缓冲区的组织方式分为单缓冲区,多缓冲区,缓冲池。
设备管理与分配的三种技术
设备分配技术主要有:独占分配、共享分配和虚拟分配。常用的设备分配算法是:先来先服务算法和优先级高的优先服务算法。
计算机按照工作特性分类
计算机设备按照工作特性可分为存储设备(面向块的设备)和I/O设备(面向字符的设备)
操作系统设备管理的对象
设备控制器是计算机中的一个实体,其主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。I/O通道是一种特殊的处理机,它具有执行I/O指令的能力,并通过执行通道(I/O)程序来控制I/O操作。设备管理是为了完成用户提出的I/O请求,提高I/O速率以及提高I/O设备的利用率。设备管理的主要功能有:缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等。I/O系统中包括有用于实现信息输入、输出和存储功能的设备和相应的设备控制器,在有的大、中型机中,还有I/O通道或I/O处理机。
操作系统为用户提供的两种接口类型
操作系统用户接口的两种类型是系统调用接口和命令接口。
UNIX系统对I/O设备的抽象表示
UNIX的设计者们遵循—条这样的规则:UNIX操作系统中可以使用的任何计算机资源都用一种统一的方法表示。他们选择用“文件”这个概念作为一切资源的抽象表示方法。
DMA方式I/O操作的CPU干预时机
在采用DMA方式进行I/O操作时,只在传送一个或多个数据块的开始和结束时,才需要CPU进行寻址。
将逻辑地址转换为物理地址的过程
重定位是指在程序运行时将逻辑地址转换为物理地址的过程。
字节多路通道的用途
主要用来连接低速或中速设备,如终端、打印机等。
I/O设备按所属关系和共享属性分类
按设备所属关系分为系统设备和用户设备两类。按共享属性分为独享设备、共享设备和虚拟设备三种。
UNIX的通信机制
UNIX的通信机制有多种,其中包括管道机制,但速度并不是最快的; UNIX系统是从MULTICS系统简化得到的,考虑了管道操作的同步机制,但应用较少; 目前最常用的是共享内存机制,该机制使多个进程共享内存中的某一个或几个区域,但并未专门提供互斥和同步机制。
磁盘的I/O控制方式
磁盘是高速外设,以块为单位传送数据,需要DMA控制传输。