全部目录
-----------上篇------------------
-----------下篇------------------
储存器引言
存储器的主要管理对象是内存。
储存器的多层次结构
程序链接、装入时的地址变换
装入:逻辑地址→物理地址
链接:多个逻辑地址→一个逻辑地址
内存回收的四种情况
回收区上下无空闲区:直接回收该回收区,数量加一
回收区上有空闲区:合并两个区域,数量不变
回收区下有空闲区:合并两个区域,数量不变
回收区上下均有空闲区:合并三个区域,数量减一
基于顺序搜索的动态分区分配算法FF NF BF WF
首次适应算法FF:每次从低地址开始查找,找到第一个能满足大小的空闲分区。
优点为分配大的内存空间创造了条件;不需要重新排序,算法开销小。
缺点:不断被划分,会留下许多难以利用的小分区,产生碎片。
循环首次适应算法NF:空闲分区以地址递增的顺序排列,每次分配内存师从上次查找结束的位置开始查找空闲分区链,找到大小能满足要求的第一个空闲分区链。
优点:算法开销小;使空闲分区分布得更均匀。
缺点:会缺乏大的空闲分区
最佳适应算法BF:空闲分区按容量递增次序链接,每次分配内存时顺序查找空闲分区链,找到大小能满足的第一个空闲分区。
优点:避免大材小用,更能满足大进程需求。
缺点:产生难以利用的小分区,产生碎片;算法开销大,每次需要重新排序
最坏适应算法WF:空闲分区按容量递减次序链接,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区。
优点:可减少难以利用的碎片。
缺点:大分区被用完,不利于大进程,算法开销大
分页系统地址结构计算
内存分配的最小单位:
程序→页
内存→块/物理页面
逻辑地址:A 页面大小:L
页数:P=A/L
页内地址:d=A-P*L
分页系统地址变换计算
逻辑地址=页号+页内地址
物理地址=块号+块内地址
页内地址和块内地址相同,页号和块号通过页表进行转换
快表、内存有效访问时间计算
内存有效访问时间(访问内存一次的时间为t)=t+t=2t
引入快表(快表命中率为a,查询快表时间为b)后的内存有效访问时间=a*b+(1-a)*(b+t)+t=2t+b-t*a
段表、分段系统的地址变换
若段号>段表长度,越界;若没有越界,则根据段表的首址和该段的段号,计算出对应段表项的位置,从中读出该段在内存的起始地址,再检查段内地址d是否超过段长SL,若超过,则越界,否则将该段的基址d与段内地址相加,就得到物理地址
分页与分段的主要区别
分页的目的是提高内存利用率,仅仅是系统管理上的需要,对用户不可见,分段的目的则是为了更好的满足用户需要。
页的大小固定且由系统决定,而段长不固定,取决于用户所编写的程序。
分页的用户程序地址空间是一维的,分段的用户程序地址空间是二维的,程序员在标识一个地址时,必须给出段名和段内地址。
段页式系统地址变换
为实现地址转换,系统设置了一个段表寄存器,用于存放当前执行进程的段表始址和段表长度。进行地址转换时,首先检查段号是否超出段表长度,如果是,产生越界中断;否则,使用段号检索段表,找到对应的段表项后,从中得到该段的页表始址和页表长度,再检查页号是否超出页表长度,如果是,产生越界中断;否则,使用页号检索页表,找到对应的页表项后,从中得到该页对应的物理块号,再与页地址一起组成物理地址。
分页、分段、段页的访问内存次数
分页:2次
分段:2次
段页:3次
虚拟存储器概述
虚拟存储器是从逻辑上对内存容量的扩充,让用户感觉到的内存容量要大于实际内存容量,既满足了客户需要,又改善了系统性能
局部性原理
虚拟存储器的理论基石。
较短时间内,程序的执行仅局限于某个部分,相应的,它所访问的存储空间也局限在某个区域。具体表现在时间局部性和空间局部性。
虚拟存储器的定义
虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。 其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本又接近于外存。
请求分页中的地址变换过程
页面调入过程
当程序所要访问的页面未在内存时,便向 CPU 发出一缺页中断,中断处理程序首先保留 CPU 环境,分析中断原因后转入缺页中断处理程序。该程序通过查找页表,得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘 I/O 将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法从内存中选出一页准备换出;如果该页未被修改过,可不必将该页写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。在缺页调入内存后,利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。
页面置换算法OPT FIFO LRU CLOCK
FIFO(先进先出算法):优先淘汰最早进入内存的页面,即淘汰最先进入内存的页面,该算法与进程实际运行规律不相适应,因为有些页面经常被访问,但FIFO算法不能保证这些页面不被淘汰。
OPT(最佳置换算法):淘汰以后不会使用的页面,这种算法可以获得最低的缺页率,但这是一种理想情况,在实际系统中是无法实现的,因为操作系统无法知道每一个页面要等待多长时间以后才会再次被访问。
LRU(最近最少使用算法):淘汰最近没有使用的页面。实际应用中较好,但开销较大。
Clock(时钟置换算法):循环检查各页面的使用情况。又称为最近未用算法(NRU)。
改进型Clock算法:除考虑页面的使用情况外,还需要考虑置换代价,该算法必须同时检查访问位与修改位,若两者皆为0,表示该页为最佳淘汰页;若两者皆为1,表示该页不适合被淘汰。
访问内存的有效时间
产生抖动的原因
同时运行在系统中的进程太多,由此分配给每一个进程的物理块太少,不能满足进程正常运行的基本要求,致使每个进程在运行时,频繁出现缺页,必须请求系统将其所缺的页调入内存。从而每个进程的大部分时间都用于页面的换进换出,几乎不能再去做任何有效的工作,从而导致发生处理机的利用率急剧下降并趋于0的情况。
输入输出系统概述
I/O系统是操作系统中最繁杂且与硬件最紧密相关的部分。I/O管理系统的主要对象是I/O设备和相应的设备控制器。
I/O系统的层次结构
设备驱动程序的功能
(1)接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要求。
(2)检查用户I/O请求的合法性,了解I/O设备的状态,传递有关参数,设置设备的工作方式。
(3)发出I/O命令。如果设备空闲,便立即启动I/O设备去完成指定的I/O操作;如果设备处于忙碌状态,则将请求者的请求块挂在设备队列上等待。
(4)及时响应由控制器或通道发来的中断请求,并根据其中断类型调用相应的中断处理程序进行处理。
对I/O设备的四种控制方式
(1)使用轮询的可编程I/O方式:CPU全称参与I/O,效率低,以字节为单位。CPU的绝大部分时间处于等待I/O设备完成数据VDE循环测试中,造成对CPU的极大浪费;
(2)使用中断的可编程I/O方式:由设备控制器执行I/O,效率高,以字节为单位。由CPU向相应的设备控制器发出一条I/O命令,然后立即返回执行原来的任务。CPU与I/O设备并行工作,仅当输出完一个数据时,才需要CPU花费极短时间做些中断处理;
(3)直接存储器访问方式:由DMA控制器完成I/O,以块为单位,可并行;
(4)I/O通道控制方式:由I/O通道完成I/O,以多个块为单位,可实现CPU、通道和I/O设备三者的并行,提高资源利用率。
系统调用
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。会使处理器从用户态进入核心态。
应用程序通过系统调用请求操作系统的服务。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。
由OS向用户提供的所有功能,用户进程都要通过系统调用来获取,系统调用是应用程序取得OS所有服务的唯一途径。
假脱机技术
假脱机技术”,又称“SPOOLing 技术”是用软件的方式模拟脱机输入/输出系统。通过假脱机技术,可将一台物理I/O设备虚拟为多台逻辑I/O设备,也就可以使多个用户共享一台物理I/O设备。
磁盘访问时间的组成
磁盘调度算法 FCFS SSTF SCAN CSCAN
先来先服务算法(FCFS):根据进程请求访问磁盘的先后顺序进行调度。简单,公平,每一进程的请求都能得到处理,不会出现某一进程的请求长期得不到满足的情况。但效率不高,未对寻道进行优化,平均寻道时间较长。
最短寻道时间优先算法(SSTF):其要求访问的磁道与当前磁头所在的磁道距离最近,每次寻道时间最短,但未必平均寻道时间最短,可能产生饥饿现象。
扫描算法(SCAN): 在磁头移动方向上选择与当前磁头所在的磁道距离最近的请求作为下一次服务的对象。像电梯一样在向上移动的时候一直移动到要访问的最高层,然后反过来移动到要访问最低层。具有较好的寻道性能,避免了饥饿现象。但服务质量不均,不利于远离磁头一端的访问请求。
循环扫描算法(CSCAN): 磁头按照规定的移动方向一直移动到另一端,然后迅速回到原始位置,以此循环。消除了对两端磁道请求的不公平。
文件管理综述
文件管理在外存上的文件,并把对文件的存取、共享、保护等手段提供给用户。文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的。
数据的三级组成
数据项、记录、文件
文件类型(系统、库、用户)
系统文件:由系统软件构成的文件,大多数系统文件只允许用户调用,不允许读,更不允许修改,有的系统文件不直接对用户开放。
库文件:由标准子例程及常用的例程所构成的文件,允许用户调用,但不允许修改。
用户文件:指由用户的源代码、目标文件、可执行文件或数据等构成的文件,用户将这些文件委托给系统保管。
文件逻辑结构与物理结构
逻辑结构:从用户观点出发所观察到的文件组织形式,即文件是由一系列的逻辑记录组成的,用户可以直接处理的数据及其结构,它独立于文件的物理特性,又称为文件组织。
物理结构:又称为存储结构,指系统将文件存储在外存上所形成的一种存储形式,是用户不能看见的。与存储介质的存储性能和采用的外存分配方式有关。
FCB的作用
文件控制块(file control block):为了能对一个文件进行正确的存取,操作系统必须为文件设置用于描述和控制文件的数据结构。文件与文件控制块一一对应,人们把文件控制块的有序集合称为文件目录,即一个文件控制块就是一个文件目录项。文件控制块中通常含有基本信息(文件名、文件物理位置、文件逻辑结构、文件的物理结构)、存储控制信息及使用信息三类信息。
文件路径与工作目录
路径名:从根目录到数据文件名依次用 “/”连接起来,是唯一路径,称为“绝对路径”。
当前目录(工作目录):路径名从当前目录开始逐级到达数据文件,用“/”连接形成路径,称为“相对路径名”。
磁盘存储器管理综述
磁盘存储器不仅容量大,存取速度快,而且可以实现随机存取,故它是当前实现虚拟存储器和存放文件最理想的外存。其主要任务是:有效利用储存空间、提高磁盘的I/O速度、提高磁盘系统的可靠性。
外存的三种组织方式
(1) 连续组织方式:为每个文件分配一片连续的磁盘空间,由此所形成的文件物理结构将是顺序式的文件结构。
(2) 链接组织方式:在对文件采取链接组织方式时,可以为每个文件分配不连续的磁盘空间,通过链接指针将一个文件的所有盘块链接在一起,由此所形成的将是链接式文件结构。
(3)索引组织方式:在对文件采取索引组织方式时,所形成的将是索引式文件结构。
显式链接、FAT、NTFC p271
显示链接:这是指把用于链接文件各物理块的指针显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张。表的序号是物理盘块号,从0开始,直至N-1。N为盘块总数。在每个表项中存放链接指针,即下一个盘块号。在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填 入相应文件的 FCB 的“物理地址”字段中。由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。由于分配给文件的所有盘块号都放在该表中,故把该表称为文件分配表 FAT(File Allocation Table)。
FAT:在 FAT 中引入了“卷”的概念,支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘就是一个卷(也称为分区),也就是说每个卷都是一个能够被单独格式化和使用的逻辑单元,供文件系统分配空间时使用。一个卷中包含了文件系统信息、一组文件以及空闲空间。每个卷都专门划出一个单独区域来存放自己的目录和FAT 表,以及自己的逻辑驱动器字母。通常对仅有一个硬盘的计算机,最多可将其硬盘分为“C:”、“D:”和“E:”“F:”四个卷。需要指出的是,在现代OS 中,一个物理磁盘可以划分为多个卷,一个卷也可以由多个物理磁盘组成。
NTFS: NTFS是以簇作为磁盘空间分配和回收的基本单位的。一个文件占用若干个簇,一个簇只属于一个文件。这样,在为文件分配磁盘空间时,就无须知道盘块的大小,只要根据不同的磁盘容量,选择相应大小的簇,即使 NTFS 具有了与磁盘物理块大小无关的独立性
混合索引方式
单级索引组织方式
多级索引组织方式
增量式索引组织方式
空闲表、空闲链表、位示图(Windows系统)
空闲表:空闲表法属于连续分配方式,它与内存的动态分配方式雷同,它为每个文件分配一块连续的存储空间。即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列,形成空闲盘块表
空闲链表:空闲链表法是将所有空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,可把链表分成两种形式:空闲盘块链和空闲盘区链。
1) 空闲盘块链
这是将磁盘上的所有空闲空间以盘块为单位拉成一条链,其中的每一个盘块都有指向后继盘块的指针。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次挂在空闲盘块链的末尾。这种方法的优点是用于分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复操作多次,分配和回收效率较低,相应的空闲盘块链会很长。
2)空闲盘区链
这是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区相合并。在采用首次适应算法时,为了提高对空闲盘区的检索速度,可以采用显式链接方法,亦即,在内存中为空闲盘区建立一张链表。这种方法的优点和缺点刚好与前一种方法的优缺点相反,即分配与回收的过程比较复杂,但分配和回收的效率可能较高,每次为文件分配多个连续的块,且空闲盘区链较短。
位示图:位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。有的系统把“0”作为盘块已分配的标志,把“1”作为空闲标志。(它们在本质上是相同的,都是用一位的两种状态来标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用m*n个位数来构成位示图,并使 m*n等于磁盘的总块数。位示图也可描述为一个二维数组 map[m,n]。
成组链接法(Linux系统)
(1) 空闲盘块号栈,用来存放当前可用的一组空闲盘块的盘块号(最多含100个号),以及栈中尚有的空闲盘块(号)数N。顺便指出,N还兼作栈顶指针用。例如,当N=100时,它指向 S.free(99)。由于栈是临界资源,每次只允许一个进程去访问,故系统为栈设置了一把锁。
(2)文件区中的所有空闲盘块被分成若干个组,比如,将每100个盘块作为一组。假定盘上共有 10000个盘块,每块大小为1KB,其中第 201~7999号盘块用于存放文件,即作为文件区,这样,该区的最末一组盘块号应为 7901~7999;次末组为 7801~7900,…,倒数第二组的盘块号为 301~400;第一组为 201~300。
(3)将每一组含有的盘块总数N和该组所有的盘块号记入其前一组的第一个盘块的S.free(0)~S.free(99)中。这样,由各组的第一个盘块可链成一条链。
(4)将第一组的盘块总数和所有的盘块号记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
(5)最末一组只有99 个可用盘块,其盘块号分别记入其前一组的S.free(1)~S.free(99)中,而在S.free(0)中则存放“0”,作为空闲盘块链的结束标志。(注:最后一组的盘块数仍为100,但实际可供使用的空闲盘块数却是99,对应的编号应为(1~99),0号中放空闲盘块链的结尾标志,而不再是空闲盘块号)
提高磁盘I/O速度的途径
磁盘高速缓存
提前读
延迟写
优化物理块的分布
虚拟盘
RAID的概念
独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。因为多个硬盘增加了平均故障间隔时间(MTBF),储存冗余数据也增加了容错。
(1) RAID 0级。本级仅提供了并行交叉存取。RAID 0级的主要优点是,它能够实现高效的传输,并能实现高速的I/O 请求。主要缺点是无冗余校验功能,致使磁盘系统的可靠性并不是很高。只要阵列中有一个磁盘损坏,便会造成不可弥补的数据丢失,故导致该级较少使用。
(2)RAID 1级。它具有磁盘镜像功能,例如,当磁盘阵列中具有8个盘时,可利用其中4个作为数据盘,另外4个作为镜像盘,在每次访问磁盘时,可利用并行读、 写特性,将数据分块同时写入主盘和镜像盘。RAID1级的主要优点是可靠性好,且从故障中恢复很简单。其缺点是磁盘容量的利用率只有 50%,它的优点是以牺牲磁盘容量为代价的。
(3)RAID 3级。这是具有并行传输功能的磁盘阵列。它只利用一台奇偶校验盘来完成数据的校验功能。例如,当阵列中只有7个盘时,可利用6个盘作数据盘,一个盘作校验盘。磁盘的利用率为 6/7。
(4)RAID 5级。这是一种具有独立传送功能的磁盘阵列。每个驱动器都各有自己独立的数据通路,独立地进行读/写,且无专门的校验盘。用来进行纠错的校验信息是以螺旋 (Spiral)方式散布在所有数据盘上。
(5)RAID 6级和RAID 7 级。这是强化了的RAID。在RAID6级的阵列中,设置了一个专用的、可快速访问的异步校验盘。该盘具有独立的数据访问通路,具有比RAID 3级及RAID 5级更好的性能,但其性能改进得很有限,且价格昂贵。RAID 7级是对RAID 6级的改进,在该阵列中的所有磁盘都具有较高的传输速率和优异的性能,是目前最高档次的磁盘阵列,但其价格也较高。