存储管理
早期的计算机由于结构较为简单,存储容量小,并不需要过多的的存储管理。
随着计算机和程序越来越复杂,使得存储管理成为必要。
存储管理主要是为了解决以下三个问题
确保计算机有足够的内存处理数据
确保程序可以从可用内存中获取一部分内存使用
确保程序可以归还使用后的内存以供其他程序使用
内存分配的过程
单一连续分配
单一连续分配是最简单的内存分配方式
只能在单用户、单进程的操作系统中使用
固定分区分配
固定分区分配是支持多道程序的最简单存储分配方式
内存空间被划分为若干固定大小的区域
每个分区只提供给一个程序使用,互不干扰
动态分区分配
根据进程实际需要,动态分配内存空间
相关数据结构
动态分区空闲表
动态分区空闲链,每个链记录可存储的容量
分配算法
首次适应算法
分配内存时从开始顺序查找适合内存区
若没有合适的空闲区,则该次分配失败
每次从头部开始,使得头部地址空间不断被划分
最佳适应算法
最佳适应算法要求空闲区链表按照容量大小排序
遍历空闲区链表找到最佳合适空闲区
快速适应算法
快速适应算法要求有多个空闲区链表
每个空闲区链表存储一种容量的空闲区
内存回收的过程
回收区于空闲区相连并在后方
不需要新建空闲链表节点
只需要把空闲区的容量增大为包括回收区的容量即可
回收区与空闲区相连并在前方
将回收区和空闲区合并
新的空闲区使用原来回收区的地址
回收区在两块空闲区之间
将两个空闲区和中间的回收区合并
新的空闲区使用空闲区1的地址
单一回收区,没有连接任何空闲区
为回收区创建新的空闲节点
将该节点插入到相应的空闲区链表中
段页式存储管理
上面的部分主要是从物理的角度讲解内存管理,这部分主要是讲解操作系统是怎么管理进程的内存空间。
页式存储管理
字块
是相对于物理设备的定义,页面
是相对逻辑空间的定义。
页式存储管理主要是将进程逻辑空间等分成若干大小的页面,相应的把物理内存空间分成与页面大小的物理块,以页面为单位把进程空间装进物理内存中分散的物理块。
页面大小应该适中,过大难以分配,过小内存碎片过多,通常是512B~8K。
页表
记录进程逻辑空间于物理空间的映射
在页式存储管理,页地址 = 页号 + 页内偏移
多级页表
现代计算机系统中,可以支持非常大的逻辑 地址空间(232~264),这样,页表就 变得非常大,要占用非常大的内存空间,如, 具有32位逻辑地址空间的分页系统,规定页 面大小为4KB,则在每个进程页表中的页表 项可达1M(2^20)个,如果每个页表项占用 1Byte,故每个进程仅仅页表就要占用1MB 的内存空间。
为了解决这个问题,引入了多级页表。
多级页表有一个根页表,每一个字块指向了内存中的一片空间,这块空间存储的是二级页表。以此类推,最后一级页表指向的字块才是进程实际使用的内存。通过这种分级机制,大大减少了进程中页表数占用的空间。
段式存储管理
段式存储管理将进程逻辑空间划分成若干段(非等分),段的长度由连续逻辑的长度决定。
例如一个程序有主函数MAIN、子程序段X、子函数Y等,这个时候会根据每一个函数的逻辑长度来分配逻辑空间。
页表由页号
和基址
组成,但在段式存储管理中由于每一段的长度是不固定的,段表由段号
、基址
以及段长
组成。
在段式存储管理,段地址 = 段号 + 段内偏移
段式存储和页式存储都离散地管理了进程的逻辑空间
页是物理单位,段是逻辑单位
分页是为了合理利用空间,分段是满足用户要求
页大小由硬件固定,段长度可动态变化
页表信息是一维的,段表信息是二维的
段页式存储管理
分页可以有效提高内存利用率(虽然说存在页内碎片)
分段可以更好满足用户需求
两者结合,形成段页式存储管理
先将逻辑空间按段式管理分成若干段,再把段内空间按页式管理等分成若干页。
在段页式存储管理中,段页地址 = 段号 + 段内页号 + 页内地址
虚拟内存
有些进程实际需要的内存很大,超过物理内存的容量。
由于操作系统的多道程序设计,使得每个进程可用物理内存更加稀缺。
不可能无限增加物理内存,物理内存总有不够的时候,于是便有了虚拟内存的概念。
虚拟内存是操作系统内存管理的关键技术,使得多道程序运行和大程序运行成为现实,她通过将进程所使用的内存进行划分,将部分暂时不使用的内存放置在辅存。
程序的局部性原理
局部性原理是指CPU访问存储器时,无论是存取指令 还是存取数据,所访问的存储单元都趋于聚集在一个 较小的连续区域中。
根据局部性原理,程序运行时,无需全部装入内存,装载部分即可。如果访问页不在内存,则发出缺页中断,发起页面置换。
从用户层面看,程序拥有很大的空间,即是虚拟内存。
虚拟内存实际是对物理内存的补充,速度接近于内存,成本接近于辅存。
虚拟内存的置换算法
置换算法一般有先进先出算法(FIFO)、最不经常使用算法(LFU)、最近最少使用算法(LRU)。
从计算机组成原理篇章中,我们可以知道,CPU的高速缓存没有数据时,需要从主存中加载数据。此时若主存中也没有数据,则需要从辅存中载入页面数据。
内存替换策略发生在Cache-主存层次、主存-辅存层次。Cache-主存层次的替换策略主要是为了解决速度问题
,
主存-辅存层次则。主要是为了解决容量问题
。
操作系统的文件管理
文件的逻辑结构
逻辑结构的文件类型
有结构文件
文件内容由定长记录和可变长记录组成
定长记录存储文件格式、文件描述等结构化数据项
可变长记录存储文件具体内容
无结构文件
也称为流式文件,文件内容长度以字节为单位
一般的文件格式如 exe、dll、so等
顺序文件
顺序文件是指按顺序存放在存储介质中的文件,例如磁带的存储特性使得磁带文件只能存储顺序文件。
顺序文件是所有逻辑文件当中存储效率最高的。
索引文件
可变长文件不适合使用顺序文件格式存储,索引文件是为了解决可变长文件存储而发明的一种文件格式,索引文件需要配合索引表完成存储的操作。
辅存的空间分配
辅存的分配方式
连续分配
顺序读取文件内容非常容易,速度很快
对存储要求高,要求满足容量的连续存储空间
链接分配
链接分配可以将文件存储在离散的盘块中,需要额外的存储空间存储文件的盘块链接顺序。
隐式链接
隐式分配的下一个链接指向存储在当前盘块内,隐式分配适合顺序访问,随机访问效率很低
可靠性差,任何一个链接出问题都影响整个文件
显式链接
显式链接不会讲下一个链接指向存储在当前盘块内,而是会维护一张表,用于记录物理盘块以及下一个盘块的链接
这个表叫FAT File Allocation Table
不支持高效的直接存储(FAT记录项多)
检索时FAT表占用较大的存储空间(需要将整个FAT加载到内存)
索引分配
把文件的所有盘块集中存储(索引),读取某个文件时,将文件索引读取进内存即可
每个文件拥有一个索引块,记录所有盘块信息,索引分配方式支持直接访问盘块
文件较大时,索引分配方式具有明显优势
辅存的存储空间分配方式
空闲表
空闲盘区的分配与内存分配类似,首次适应算法、循环适应算法等。
回收过程也与内存回收类似。
空闲链表
空闲链表法把所有空闲盘区组成一个空闲链表,每个链表节点存储空闲盘块和空闲的数目。
位示图
位示图维护成本很低,使用0/1比特位,占用空间很小,可以非常容易找到空闲盘块。
目录管理
目录的层级结构是树状的,成为目录树。
目录树中任何文件或目录都只有唯一路径。
文件描述信息
文件标识符、文件类型、文件权限、文件物理地址
文件长度、文件连接计数、 文件存取时间
索引节点编号、文件状态、访问计数、链接指针
操作系统的设备管理
广义的IO设备
对CPU而言,凡是对CPU进行数据输入的都是输入设备,凡是CPU进行数据输出的都是输出设备。
IO设备的缓冲区
缓冲区主要是解决CPU与IO设备的速率不匹配的问题,减少CPU处理IO请求的频率,提高CPU与IO设备之间的并行性。
专用缓冲区只适用于特定的IO进程,当这样的IO进程比较多时,对内存的消耗也很大,所以操作系统划出可供多个进程使用的公共缓冲区,称之为缓冲池。
SPOOLing技术
SPOOLing技术是关于慢速字符设备如何与计算机主机交换信息的一种技术,利用高速共享设备将低速的独享设备模拟为高速的共享设备,逻辑上,系统为每一个用户都分配了一台独立的高速独享设备,是一种虚拟设备技术。
SPOOLing技术把同步调用低速设备改为异步调用。在输入、输出之间增加了排队转储环节(输入井、输出井),SPOOLing负责输入(出)井与低速设备之间的调度,逻辑上,进程直接与高速设备交互,减少了进程的等待时间。