哈工大李治军操作系统--内存管理

分段

程序分段–找空闲区域–加载并设置好对应的LDT。每个进程有自己的LDT,各个段信息都登记在LDT中,而LDT登记在GDT以及进程的PCB中。
在这里插入图片描述

分页

内存怎么割?固定分区、可变分区、分页。

固定分区和可变分区都会导致内存碎片,浪费内存,即使可以移动、合并内存碎片,这会造成较大的时间开销,得不偿失。而从程序员逻辑角度,更喜欢分段,根据不同数据特点分为数据段、代码段、栈段等,物理内存为了避免浪费可以分页,从而逻辑分段和物理分页相结合就是实际的内存管理方式——段页式。

为了避免内存浪费,分页时每页不能太大(因为不足一页的要分配一页,考虑极端例子,只有一个字节也得分配一页)。如果每页4K,32位CPU访存4G,既然每页不大,页数必然很大,4G/4K=1M,有1M(略等于1000000)个页,每个页地址占据4个字节,把逻辑页和物理页映射表放在内存里,那就要消耗4M内存(逻辑页号从0连续到1M,不需要占内存)。如果100个进程并发,每个进程都需要一个这样的映射表,那就消耗400M内存!太耗费内存了!!!

第一次尝试:只存放用到的页(此种方法不行,速度太慢,如下图)。
在这里插入图片描述
第二次尝试:多级页表(对比书的目录)。
在这里插入图片描述

快表

对于64位机,多级页表分级比较多,导致访存次数增加,速度变慢!引入快表TLB(寄存器),把经常使用的页加入快表(空间局部性),硬件直接做到。需要把命中率达到一定值,才能有效加速,快表越大当然越好些,但耗材贵,需要搞合适的值。
在这里插入图片描述

段页式内存管理

在这里插入图片描述
下面就是虚拟地址,由于虚拟地址采用这种组织方式,页目录号可以找到对应的页表,页号可以找到对应的实际物理页,offset可以找到对应物理页中的具体偏移。
在这里插入图片描述

内存换入换出

在这里插入图片描述
用户感觉到的是4G大小的虚拟内存,而物理内存可能比4G小。当进程执行到某地址的时候发现没有内存映射(每执行一个指令之后就会检查是否有中断,MMU发现缺页中断),就缺页中断,从硬盘找到对应的程序载入物理内存空闲页。而物理内存毕竟小,如果物理内存没空闲页了呢?这就要研究好的算法,载入新的物理内存页的时候,同时要淘汰一些物理内存页,换到硬盘里面去。算法模拟实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
页框大小多少合适?页框太大消耗内存大,页框太小就导致“颠簸”(内存换入换出比较频繁,CPU利用率低)。算法也要比较好,减少缺页中断率,减少“颠簸”。

参考资料

[1] 中国大学MOOC《操作系统》李治军 哈尔滨工业大学
[2] 《Linux内核完全注释》赵炯
[3] BIOS中断大全
[4] 汇编语言最全指令表
[5] 《x86汇编语言:从实模式到保护模式》李忠 著
[6] https://blog.csdn.net/ccnuacmhdu/article/details/104946213

发布了329 篇原创文章 · 获赞 195 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/105551055
今日推荐