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

分段

程序分段–找空闲区域–加载并设置好对应的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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值