文章目录
内存的基础知识
内存用来存放要执行的程序,因为从硬盘存取太慢了,为了提高CPU利用率整了内存这个东西,解决CPU和硬盘之间的速度矛盾。

如果按字编址的话,计算机是32位的,每个存储单元为32个二进制位(4B)

2^10=1024
操作系统里的进制都是2^10
1G=2^10 M
逻辑地址(相对地址):相对于起始地址而言的地址
物理地址(绝对地址):真正存放的位置



可以移动,只需要改一下重定位寄存器就行了。
可以把程序分配到不连续的内存空间里




内存管理的概念
1.内存空间的分配和回收

2.内存空间的扩充

3.地址转换

4.内存保护


小结

覆盖与交换
1.覆盖技术


A调用B、C,一次只能调用其中一个,所有覆盖区选两者之间更大的,下面同理,选最大的就行。(BC存在才能调用下面的所以新开一个覆盖区)
2.交换技术

换到外存等待的进程就是挂起状态
中级调度(内存调度)就是决定把哪个挂起的进程调回内存
小结

连续分配管理方式
为进程分配的必须是一个连续的内存空间
1.单一连续分配

2.固定分区分配


3.动态分区分配
不会预先划分分区,而是在进程进入时建立一个刚好满足需要的分区


内部碎片:分配给进程的区域没用上的部分
外部碎片:由于分配给进程导致有些地方太小,不能利用

分配和回收之后要对空闲分区表进行修改,记得分区大小和起始地址都要改(有可能还要进行合并删除这些,具体分析)
小结

动态分区分配算法

首次适应算法:从低地址开始,找到第一个能满足要求的空闲分区
最佳适应算法:从小的开始找,很多时候还要对空间分区重新排列(维持从小到大的顺序)
最坏适应算法:从大的开始找
邻近适应算法:从上一次结束的地方开始查找(雨露均沾),可以用循环链表实现

小结

分页存储管理的概念
1.页面页框

把进程分为一个个页面(页),内存空间分为页框(页帧、内存块、物理块)。
这两个是对应的,也就是说页面大小和页框大小肯定是一样的,因为要把一个页面刚好放到一个页框中去,页框不能太大否则会造成很大的内部碎片(最后一个页面没有那么大)。
页面随便往各个页框放就行了,这就是非连续分配
2.页表


220 个内存块用20个二进制位表示,也就是至少用3B表示块号(1B=8bit,2个明显是不够的)

页号是隐含的:知道页表的起始地址X,用刚刚的计算过程可以得到页表项的大小是3B,i号页表的存放地址=X+3*i。所以可以不用存储页号,通过计算获得就行了。
页表只是记录内存块号,不是记录内存块的地址,J号内存块的地址还是得用 J * 内存块大小来得到
3.地址转换



页面大小通过换算就可以确定页面偏移量占多少位(页面大小就决定了页面偏移量最多是多少),剩余的位数就表示页号
物理块号拼接上页内偏移量就是物理地址(表示物理块号的位数相当于乘了后面的页面大小,再加上页内偏移量就得出)

手算的方法还是要掌握,有些怪的就只能用手算
小结

基本地址变换机构
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。(每个进程都有自己的页表)
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。


页式管理中地址是一维的,因为只需要给出逻辑地址,其他都可以自动算出来。
页表项的大小为3B的话,如果页框大小为4KB放在内存中会使页框剩下1B(因为不能整除),这样会使计算内存地址的时候不能简单的用乘法来计算了(毕竟每个页框里都有1B空的,所以要在每次跳到下一个页框的时候都加上1B)。所以可以把页表项弄成4B,这样就可以正好装满,也是连续的,就可以直接使用乘法计算物理地址了。


具有快表的地址变换机构
1.局部性原理

时间局部性:被访问过的不久后可能再次被访问
空间局部性:被访问过的附近的存储单元可能被访问
2.快表
快表,又称联想寄存器(TLB,translation lookaside buffer ),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。

快表命中,仅需一次访存
快表未命中,两次访存(去页表查找内存号,再访问目标页面),找到页表项还要添加到快表里去
小结

两级页表

给页表分配这么多连续的空间,丢掉了本来非连续存储的优点
根据局部性原理,很多时候只需要一些页面在内存里就行了,没必要让整个页表都常驻内存
把页表再分页并离散存储,然后再建立一张页表记录页表各个部分的存放位置,称为页目录表(外层页表、顶层页表)



前面曾说过,缺页中断率高代表内存紧张(很多页面都被调到外存去了)

两级页表要进行三次访存(n级 n+1次),有快表的话还是只需要一次(命中就直接访问目标)

分段存储
1.基本概念

按照功能划分为各个段,每个段占据连续空间,段与段之间可以分散的随便放。


段表项大小的计算:段表项由段长、基址组成,段长看段内地址(决定最大段长),基址由内存大小决定,最后让这两个加起来就可以得出段表项大小。
2.地址变换

要根据段表中记录的段长检查段内地址有没有越界
3.分段vs分页


不能被修改的代码称为纯代码或可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)

小结

段页式管理方式

分段之后再分页

段页式的地址结构是二维的

每个段的页表长度是不同的(因为段长就是不同的,页表长度就代表分成了几个页)

需要三次访存

虚拟内存的基本概念

虚拟内存有一下三个主要特征:
①多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
②对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
③虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。

请求分页管理方式




若未调入内存,调入后修改页表和快表。调出去的时候要记得把快表里的内容也删了。(免得命中了去访问)

一般修改的时候改快表就行了(反正查的时候会查快表),要删除快表的时候(调出内存)才把它里面的值好好的改回慢表里,然后写到外存去
换入换出都需要用到I/O,这是比较慢的过程

页表置换算法
用页面置换算法决定应该换出哪个页面
页面的换入、换出需要磁盘I/O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率
1.最佳置换算法(OPT)

无法实现的一种算法,作为一种评判标准(因为怎么可能知道后面要用到的页面顺序)
2.先进先出置换算法(FIFO)

每次就把最先进来的页面置换出去
性能差,只有它会产生Belady现象
3.最近最久未使用置换算法(LRU)

最接近最佳置换算法,但是想做到计时的话要借助硬件,所以虽然性能好,但是开销大
4.时钟置换算法(CLOCK,NRU)

是1就置为0,然后继续下一个直到找到0(所以最多两轮就可以找到)
如果是0的,被访问了又把它改成1
5.改进时钟置换算法

多考虑了一个修改位,如果同样没访问过优先置换出去没修改过的(这样不用执行I/O把这个修改写回外存)
第一轮找(0,0)
第二轮找(0,1),同时把访问位是1的都改成0
第三轮找(0,0)【之前的(1,0)】
第四轮找(0,1)【之前的(1,1)】
最多找四轮
小结

页面分配策略


可变分配全局置换:只要缺页就从别的地方拿个物理块
可变分配局部置换:缺页的时候从自己的物理块置换,如果缺页率过高就拿物理块,缺页率较低就分出去物理块(适当的时候就靠自己)




工作集:某时刻,实际访问页面的集合(看看究竟在用几个进程,就可以用来调整驻留集了)

本文深入探讨了内存管理的各种策略和技术,包括内存基础知识、内存分配与回收、地址转换、内存保护、覆盖与交换。详细阐述了连续分配、动态分区、分页和分段存储管理方式,以及虚拟内存的概念和请求分页系统。讨论了各种页面置换算法如最佳置换、FIFO、LRU等,并介绍了页面分配策略和工作集理论。此外,还涵盖了快表在地址变换中的作用和两级页表的应用。
817

被折叠的 条评论
为什么被折叠?



