此为本人在期中临近复习操作系统概念时将手写版笔记中的重点进行提炼后,加入个人的理解与思考所写出的总结性笔记,仅供参考。

基本假设:进程的代码与数据全部装入内存

一、背景

内存是现代计算机运行的中心,其由一组字或字节组成,类似于一个大的数组,CPU根据PC的值从内存中提取指令,并引起进一步对特定内存地址的读取与写入

(一)、基本硬件

1、CPU能够直接访问的存储器只有内存和处理器中的寄存器,机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数。因此,执行指令以及指令是用的数据必须在这些直接访问的存储设备上,如果数据不在内存中,那么CPU使用前必须把数据移动到内存中
2、CPU内置寄存器通常可以在一个cpu时钟周期内完成访问,对其中内容,大多数CPU可在一个时钟周期内解析并执行一个或多个指令,但完成内存访问可能需要多个CPU时钟周期,这使CPU不得不“暂停”。为了协调这种差异,才有了高速缓存
3、硬件地址保护:为了确保os不被用户进程所访问,以及用户进程不被其他进程访问,我们通过两个寄存器来确定进程可访问的合法地址的访问,基地址寄存器为最小的合法物理地址,界限地址寄存器为范围大小
4、用户模式下执行的程序试图让问os内存或其他用户内存均会陷入到os中
5、只有os可以通过特殊的特权指令来加在基地址寄存器和界限地址寄存器,只有在内核模式
6、os在内核模式下可以无限制地访问os与用户的内存,故os可以将用户程序装入用户内存,在出错时输出这些程序,访问并修改系统调用的参数

(二)、地址绑定

1、程序以二进制可执行文件存储在磁盘上,为了执行,程序应被调入内存并放在进程内。根据所使用的的内存管理方案,进程在执行时可以在磁盘和内存之间移动。在磁盘上等待调入内存以便执行的进程形成了输入队列
2、进程终止,其地址空间将被释放
3、用户程序在运行之前需要经历若干步骤,其中地址可能有不同的表示形式,如:
①符号(源程序中)
②可重定位的地址(目标模块中,编译器将符号地址绑定产生)
③绝对地址(内存映像中,链接程序或加载程序再将这些可重定位的地址绑定成绝对地址)
操作系统概念(八)——内存管理
4、每一次绑定都是从一个地址空间到另一个地址空间的映射
5、将指令与数据捆绑到内存地址可以在以下步骤的任何一步执行(一种或多种):
①编译时:在编译时就知道进程在内存中的主流地址,生成绝对代码
②加载时:编译时不知道主流地址,则编译器比生成可重定位代码,那么绑定就会延迟到加载时
③执行时:绝大多是os会在进程执行时从一个内存段移动到另一个内存段,则绑定需要延迟到执行时,需要采用特定的硬件

(三)、逻辑地址空间与物理地址空间

1、逻辑地址:由CPU生成;也称为虚拟地址,可有多个
2、物理地址:内存单元看到的,加载到内存地址寄存器的地址
3、在编译时和加载时的地址绑定方案中,逻辑地址与物理地址是相同的。但是,执行时的地址绑定方案导致不同的逻辑地址和物理地址。
4、内存管理单元MMU:运行时从虚拟地址映射到物理地址的硬件设备
5、重定位寄存器:即基地址寄存器,用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值。对重定位寄存器会有赋值(上下文切换时)与加法(每一次地址转换时)操作
操作系统概念(八)——内存管理
6、用户程序处理逻辑地址,不会看到真实的物理地址
7、物理地址空间必须大于逻辑地址空间

(四)、动态加载:为了更好地内存空间利用率

1、因基本假设,进程的大小受到物理内存大小的先知
2、动态加载:一个子程序只有在调用时才被加载,被装入内存,否则以可重定位的形式保存在磁盘上。当一个子程序调用另一个子程序需时,调用子程序先加载(检查)被调用子程序是否已经加载,如果没有,可重定位的链接程序将用来加载所需要的子程序,并更新程序的地址表,戒指控制传递给新加载的子程序。
3、优点是不用的子程序绝对不会加载,且不需要操作系统提供特别的支持。利用这种方法来设计程序主要是用户的责任。

(五)、动态链接与共享库

1、链接过程推迟到执行时来进行。
2、存根:二进制镜像中对每一个库程序的引用均有一个存根,为一小段代码,指出如何定位适当的内存驻留程序,或者程序不再内存时如何装入
3、存根会用子程序地址来替换自己,并开始执行子程序。
4、OS需要检查子程序是否在进程的内存地址空间内。
5、覆盖:为了能让进程比它所分配到的内存空间大,可以使用覆盖。在任何时候只在内存中保留所需的指令和数据。当需要其他指令时,它们会装入到刚刚不再需要的指令所占用的内存空间内。主要用户来实现。

二、交换

1、进程可以暂时从内存中交换出来到备份存储上,当需要再执行时再调回到内存中。备份存储通常是快速磁盘。这必须足够大,以便容纳所有用户的内存映象拷贝,它也必须提供对这些内存映象的直接访问。
2、滚进、滚出:是交换策略的一个变种,被用于基于优先权的调度算法中。如果一个更高优先级进程来了且需要服务,内存管理可以交换出低优先级的进程,以便可以装入和执行更高优先级的进程。当更高优先级进程执行完后,低优先级进程可以交换回内存以继续执行。
3、交换时间的主要部分是转移时间。总的转移时间与所交换的内存空间直接成正比。
4、就绪队列包括在备份存储或在内存中准备运行的所有进程,相当于在调度时增加了一次可能地从内存中移动到备份存储的过程
5、交换时不需要或者只需要少许移动磁头,因为交换空间大多为磁盘的一整块,且独立于文件系统,故很快

三、连续内存分配

内存通常分为两个区域:一个用于驻留操作系统,常与中断向量一起放在低内存;另一个用于用户进程,常放在高内存。

(一)、内存映射与保护:

1、实际上就是单分区分配方法
2、重定位寄存器方案用来保护用户进程之间,用户进程与操作系统之间不会相互修改代码与数据
3、重定位寄存器包含了最小的物理地址;界限寄存器包含了逻辑地址的范围,每个逻辑地址必须小于界限寄存器
4、当CPU调度器选择一个进程执行时,作为上下文切换的一部分,调度程序会用正确的值来初始化两个寄存器

(二)、内存分配

1、实际上就是多分区分配方法
2、将内存分为多个固定大小的分区,每个分区只容纳一个进程,多道程序设计的程度会受到分区数的限制
3、可变分区方案里,os有一个表,用于记录哪些内存可用。一块可用内存称为孔。不同大小的孔分布在内存的不同地方。当有新进程需要内存时,为该进程查找足够大的孔。
4、随着进程进入系统,将会被加入到输入队列,等待被分配到内存中进行执行,os根据所有进程的内存需要与当前可用来决定哪些进程可以进入内存(长期调度)。当进程分配到内存空间时,装入内存,并开始竞争CPU(短期调度),当进程终止时,内存释放
5、在任意时候,有一组可用孔大小列表(孔集合,可以对孔进行分配、分割、合并)和输入队列,os维护已经分配分区的信息与空闲分区的信息
6、动态存储分配问题的一种情况:根据一组空闲孔来分配大小为n的请求。解决方法有很多,从一组可用孔中找到一个空闲孔最常用:
①首次适应:分配第一个足够大的孔,找到即停
②最佳适应:分配最小的足够大的空,全部找完
③最差适应:分配最大的空,全部找完
7、首次与最佳在执行时间与空间利用率上均优于最差,首次与最佳在空间利用率上差不多,但速度上首次更快

(三)、碎片

1、首次与最佳均有外部碎片问题,这是由于进程的大小不一导致的,内存会被分成小片段,且不连续,造成浪费
2、内部碎片是指进程所分配的内存可能比进程所需要的大
3、紧缩(compaction):用来降低外部碎片。移动内存内容,以便所有空闲空间合并成一整块。如果重定位是动态的,是在运行时进行的,那么就能采用紧缩,需要改变基地址寄存器
4、另一种方法为允许物理地址空间为非连续,这样只要有物理内存就可为进程分配。如分页和分段

四、分页:内部碎片

一个进程的物理地址可以非连续,避免了不同大小内存块的麻烦传统上由硬件处理,但现在为硬件与os配合处理

(一)、基本方法

1、将物理内存分成固定大小的块,称为帧;将逻辑内存分为同样大小的块,称为页,跟踪所有的空闲帧。当需要执行进程时,其页从备份存储中调入到可用的内存帧中。
2、建立页表用来将逻辑地址转换为物理地址。
操作系统概念(八)——内存管理
3、CPU生成的地址分成以下两部分:页号§:页号作为页表中的索引。页表中包含每页所在物理内存的基地址。页偏移(d):与页的基地址组合就形成了物理地址,就可送交物理单元。
4、f=页号*页大小+基地址
5、每个进程有一个页表,页的大小与cache无关,有大页和小页之分(需要能够兼容),但页的大小不能随着进程随意改变。
6、页表属于os,pcb中有一个指针指向页表
7、进程分页在长期调度时进行,页偏移=log2页大小
8、有一个数据结构(位图)用来表示空的帧
9、分页也是一种动态重定位,每个逻辑地址由分页硬件绑定为一定的物理地址,类似于使用一组基地址寄存器,每个基地址对应着一个内存帧
10、分页技术不会产生外部碎片,但是会有内部碎片
11、如果进程需要n项,呢么内存中至少有n个帧
12、分页是用户视角的内存与物理内存分离,但实际上并没有

(二)、硬件支持

1、大多数os为每个进程分配一个页表,页表的指针存在页表基寄存器中,而页表保存在内存中,页表长度寄存器只是页表的大小。此时,每次数据/指令的访问需要访问两次内存。一次访问页表,另一次访问数据/指令
2、两次内存访问问题可以用特别的快速查找硬件缓冲,即转换表缓冲区TLB实现。是关联的快速内存,特点是并行搜索,他会同时记忆页号与帧号,可视为页表的cache,由于程序局部性,TLB可以覆盖进程
3、如果页号不在TLB中,则访问页表找到真好,同时对TLB进行更新,有的TLB在每个条目中还会保存地址空间标识符ASID,标志进程,并地址空间保护。
4、可以同时访问TLB与页表,或者先访问TLB
操作系统概念(八)——内存管理
5、设关联存储查找时间为ε个时间单位,设内存周期为1毫秒,命中率:特定页码在TLB中被查找到的百分比。用α表示,有效访问时间EAT = (1 + ε) α + (2 + ε) (1 - α) = 2 + ε - α

(三)、内存保护

1、内存保护通过与每个帧关联有保护位来实现。可读、可写、只可读
2、还有一位与页表中的每一条目相关联,称为有效-无效位,该位有效时表示相关的页在进程的逻辑地址空间内,因此是合法的页。该位无效时表示相关的页不在进程的逻辑地址空间内。

(四)、共享页

分页的优点之一在于可以共享公共代码,如果代码是可重入代码(纯代码)则可以共享。可重入代码是不能自我修改的代码,从不会在执行期间改变,一次,多个进程可以在相同时间内执行相同代码
1、共享代码:可以在进程之间共享共同代码(只读的,可重入的)(如文本编辑器、编译器、Windows系统)
2、共享代码必须出现在所有进程逻辑地址的同一位置
3、私有代码和数据:每个进程保留了代码与数据的独立的拷贝,私有代码和数据页可以出现在逻辑地址空间的任何地方。

五、页表结构

(一)、层次页表

1、os支持大逻辑地址空间,此时页表本身可以非常大,故需要将页表划分为更小部分,一种简单方法是两层分页法。
2、将页表再分页,如逻辑地址(32位机器,页大小为4K)分成以下两部分:页号(20位)与页偏移(12位),页表又分成页,所以页号又进一步分成:10位页号与10位页偏移,因此,逻辑地址表示如下
操作系统概念(八)——内存管理
3、p1为外页表的索引,p2为外页表的页偏移,此为向前映射页表
操作系统概念(八)——内存管理
操作系统概念(八)——内存管理

(二)、哈希页表

1、处理超过32位地址空间的常用方法,因为64位使用层次页表会有过多级。
2、虚拟地址中的虚拟页号被放入hash页表中。hash页表的每一条目都包括一个链接组的元素,这些元素hash成同一位置(碰撞)。每个元素有3个域,
①虚拟页码
②所映射的帧号
③指向下一个节点的指针
3、虚拟页号与链表中的每 一个元素的第一个域相比较。如果匹配,那么对应的帧码就用来形成位置地址。如果不匹配,那么就对链表中的下一个域进行页码比较。
操作系统概念(八)——内存管理

(三)、反向页表

1、对于每个真正的内存页或帧才有一个条目。
2、每个条目包含保存在真正内存位置的页的虚拟地址,以及拥有该页的进程的信息。
3、由于反向页表按照物理地址排序,而查找是根据虚拟地址,因此可能需要查找整个表。实现共享内存时很困难
操作系统概念(八)——内存管理

六、分段

(一)、基本方法

1、支持用户观点的内存管理方法。逻辑地址空间是由一组段组成的,每个段都有名称和长度,地址制定了段名称和段内偏移
2、程序是若干段的集合:主程序、子程序、函数、方法、对象、局部变量、全局变量、堆栈、符号表、数组
3、段表:将二维的用户定义地址映射为一维物理地址。段表的每个条目都有段基地址和段界限。
4、段表基地址寄存器(STBR)指向内存中的段表的位置
5、段表长度寄存器(STLR)指示程序所用的段的个数,段号S小于STLR的时候才是有效的
操作系统概念(八)——内存管理
操作系统概念(八)——内存管理

相关文章: