
这么做的原因是,程序本来是放在外存中的,放在磁盘中的,但是磁盘的读写速度很慢,而cpu的处理速度又很快
存储单元就是存放数据的最小单元,每一个地址对应一个存储单元,而一个存储单元中能存储多少数据,要看计算机是按字节编址还是按字编址的,如果是按字节编址,一个存储单元

这里的“4GB”中的“4G“其实是数量,而“B”是一个数据的单位,B指的是“字节”Byte,b指的是“一个比特位”bit



假设程序的装入模块装入内存时并不是从地址为0的地方开始的,而是从地址为100的地方开始,这就意味着操作系统给这个程序分配的地址空间其实是100~279。所以如果是这种情况的话,程序的逻辑地址和它最终存放的物理地址就会出现对应不上的情况
所以在这个小节中我们将介绍三种策略来解决地址转换的问题




在之后学习了“虚拟存储管理”之后,就可以对这个特性有更深入的理解了

刚才介绍的三种装入策略可以实现 逻辑地址 到 物理地址 的转换
接下来介绍的是三种链接的方式







为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而逻辑地址到物理地址的转换(这个过程称为地址重定位(三种装入方式))应该由操作系统负责,这样就保证了程序员写程序时不需要关注物理内存的实际情况。
方法一:

方法二:
重定位寄存器(就是上小节中的)即 在动态运行时装入这种方式中,设置一个重定位寄存器来记录每一个进程的起始物理地址





如果程序有一个明显的调用结构
注意这里B和C不可能同时被调用,也就是说在同一个时间段内,内存中要么有B有么有C即可,不需要同时存在B和C,所以B和C共享一个覆盖区



对换区的速度,或者说输入输出的速度,是要比文件区更快的。所以我们的进程数据被换出时,一般是放在对换区,换入的时候也是从对换区换到内存
PCB会常驻内存,不会被换出外存:所以其实所谓的换出进程,并不是把进程相关的所有的数据一个不漏的全部调到外存里,操作系统为了保持对这些换出进程的管理,那PCB这个信息还是需要放在内存中)


而非连续分配管理方式:不必须是连续的,可以是离散的

并不支持多道用户程序并发运行,不管这个内存空间有多大
由于整个系统中同一时刻只有一个用户程序运行,所以不一定需要采用内存保护(有的系统中可能也会设置越界检查的机制)





接下来看第三个问题,有若干种情况:
首先是看分配:


然后看回收:





当进程要上cpu运行之前,会把进程的起始地址信息放到重定位寄存器中,或者叫基址寄存器中

动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?





这里的算法开销指的是为了保证我们的空闲分区是按照我们规定的这种次序排列的,在最佳适应和最坏适应这两种算法中我们可能需要经常对空闲分区列进行重新排序,这就导致了算法开销更大的问题,而首次适应和邻近适应我们并不需要对整个空闲分区列进行顺序的检查和排序,所以这两种算法开销是要更小的

概念回顾:
逻辑地址(相对地址)
物理地址(绝对地址)

页框和页帧指的是内存在物理上被划分为这样一个一个的部分
而页和页面指的是进程在逻辑上被划分为了一个一个部分
除了页框、页帧之外,有的教材也会它们称为物理块或者物理页面
那么操作系统是怎么记录进程的页面与内存的页框的一一对应的关系的呢?

内存块 其实就是 页框,答题时更推荐使用页框这个术语

那页号又要占多少字节呢??

一个页表项在逻辑上包含了页号和块号这两个信息,但是在物理上它其实只需要存放块号这个信息,只有块号需要占存储空间

通过页表可以知道各个页面存放在哪个内存块中,但是需要注意页表记录的只是内存块号,而不是内存块的起始地址!
也就是说逻辑地址转换到物理地址



显然这个进程会被分为四个页面

黑色的部分应该有12位,从全0到全1;则末尾的这12位其实就是页内偏移量,而红色的部分就是页号




这个小节的内容也属于基本分页存储管理
所谓的基本地址变换机构就是在基本分页存储管理中用于实现逻辑地址到物理地址转换的一组硬件机构
结合上一小节理解基本地址变换机构(用于实现逻辑地址到物理地址转换的一组硬件机构)的原理和流程


一个进程的页表长度M 指的是 这个进程的页表中有M个页表项,也就意味着这个进程的页面总共有M页。所以如果此时想要访问的页号超出了这个进程的页面数量,就会认为此时想要访问的这个逻辑地址是非法的,这样就需要抛出一个越界中断。如果这个页号是合法的,接下来就会用这个页号和页表始址来进行计算,找到这个页号对应的页表项是多少,页表中的每个页表项的长度其实是相同的,所以其实只要我们知道了页号,还有页表始址,再知道我们每个页表项的长度,我们就可以算出我们想要访问的页号对应的页表项所存放的位置。既然知道了内存块号,我们就可以结合偏移量,得到最终的物理地址,然后就可以顺利访问逻辑地址A所对应的内存单元了

注意:页面大小是2的整数幂
设页面大小为L,逻辑地址A到物理地址E的变换过程如下:
①计算页号P和页内偏移量W(如果用十进制数手算,则P=A/L,W=A%L;但是在计算机实际
运行时,逻辑地址结构是固定不变的,因此计算机硬件可以更快地得到二进制表示的页号、页
内偏移量)
②比较页号P和页表长度M,若P≥M,则产生越界中断,否则继续执行。(注意:页号是从0开始的,而页表长度至少是1,因此P=M时也会越界)
③页表中页号P对应的页表项地址=页表起始地址F +页号P * 页表项长度,取出该页表项内容b,
即为内存块号。(注意区分页表项长度、页表长度、页面大小的区别。页表长度指的是这个页表中总共有几个页表项,即总共有几个页;页表项长度指的是每个页表项占多大的存储空间;页面大小指的是一个页面占多大的存储空间)
④计算E = b * L + W,用得到的物理地址E去访存。(如果内存块号、页面偏移量是用二进制表
示的,那么把二者拼接起来就是最终的物理地址了)

按字节寻址 就意味着 这个系统中每个地址对应的是一个字节
页内偏移量占的位数其实就直接决定了一个页面的大小是多少
由于题目中给的是十进制的形式,所以我们用除法还有取余操作来计算页号和页内偏移量更方便



具有快表的地址变换机构:是基本地址变换机构的改进版本

页表是存在内存中的,在引入了快表之后,我们可以把存在内存中的页表称为慢表
快表的查询速度要比慢表快很多
缓存并不是内存,cpu访问告诉缓存的速度要比访问内存快很多
TLB和我们狭义上的高速缓存Cache是有区别的

快表是一个专门的硬件,当进程上处理机运行时,系统会清空快表的内容;当进程切换的时候,快表的内容也需要被清除

这里用甘特图来说明这两种方式的区别:



这就是为什么快表能大幅提升效能的原因

基本地址变换机构:两次访存:1、查询内存中的页表;2、访问想要访问的内存单元
具有快表的地址变换机构:


第二个问题:



虽然页表项和页面表示的好像是同一个东西,但是“页表项大小”指的是长度方面,“页面大小”指的就是内容方面
现在已经拆分成了若干个小的页表(二级页表),然后还要建立一个上一级的页表,也就是 页目录表:



第二个问题的解决需要用到虚拟存储技术

页面大小与页内偏移量的位数直接关联



按字节寻址:一个地址对应的是一个字节的大小。




分页和分段最大的区别是在分页中每个页面的长度是相同的,而在分段中每个段的长度是不同的,所以在分页管理中并不需要对页内偏移量进行一个越界检查,而在分段管理中需要对分段管理进行越界检查










一个进程会对应一个段表,一个段表项对应一个页表,因此一个进程可能会对应多个页表


需要注意的是段页式管理中的段表和分段管理中的段表结构是不一样的















注意红框中的内容就是请求分页管理与基本分页管理相比增加的内容

