Linux内存管理方式,虚拟内存以及页面置换算法

Linux内存管理方式

非连续分配管理方式

内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理。

块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但是易于管理。

页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。

段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上。

段页式管理:结合了段式管理和页式管理的优点。将程序分成若干段,每个段分成若干页。段页式管理每取一数据,要访问3次内存。

虚拟内存的引入

引入的原因

进程在执行过程中,有些代码时较少用到的(比如错误处理部分),而且有的程序需要较长时间的I/O处理,导致很多内存空间的浪费。将所有正在执行的进程所需的内存都引入是低效率且不现实的。基于程序的局部性原理,在程序装入时可以将程序的一部分放入内存,而将其余部分放在外存,然后启动程序。在程序执行过程中,当所访问的信息不在内存中时,再由操作系统所需的部分调入内存。另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。从效果上看,计算机系统好像为用户提供了一个存储容量比实际内存大得多的存储器,这个存储器称为虚拟存储器(简称虚存)
虚拟内存的意义是让程序存在的地址空间与运行时的存储空间分开,程序员可以完全不考虑实际内存的大小,而在地址空间内编写程序虚拟存储器的容量由计算机的地址结构决定,并不是无限大。

实现的原理

为了实现虚拟内存,我们需要什么呢?首先是足以存的下所有程序的内存资源的外存,以及存的下一定量程序执行所必需的数据的内存。这是物理基础。
同时,我们要有一个数据结构,来将我们实际程序运行中中的虚拟地址转换为实际逻辑存储中的物理地址,即段表或页表。
最后,我们需要一种中断机制,当内存中缺少我们需要的数据时,会触发缺页中断,将需要的数据载入内存。

页面置换算法

那么我们如何判断哪些数据是接下来不常被使用,来置换出去以为新载入的数据留出空间呢?
最佳置换算法(OPT)
在预知一个进程的页面号引用串的情况下,每次都淘汰以后不再使用的或以后最迟再被使用的页面,这种算法就是最佳置换算法
这种算法是理想化的算法,具有最低的缺页率。但由于实际操作中往往无法事先知道以后会引用到所有页面的信息,所以最佳置换算法无法实现,只能作为一个标准来衡量其他置换算法的优劣
先进先出算法(FIFO)
FIFO算法是最简单的页面置换算法,每次总是淘汰最先进入内存的页面,也就是将在内存存驻留时间最长的页面淘汰掉。优点是实现简单,一个队列即可实现,缺点是产生Belady异常,可能会选择淘汰程序经常使用的界面,实际效果不好
最近最少使用算法(LRU)
该算法可以用寄存器组和栈来实现,性能较好
时钟置换算法(CLOCK)
时钟置换(CLOCK)算法也称为最近未使用算法(NRU),是LRU和FIFO的折中。作为LRU的近似算法,CLOCK算法给每个页面设置一个访问位,标识该页最近有没有被访问过。CLOCK维护一个内存中所有页面的循环链表,当程序需要访问链表中存在的页面时,该访问的访问位就被置为1:否则,若程序要访问的页面没有在链表中,那就需要淘汰一个内存中的页面,于是一个指针就从上次被淘汰页面的下一个位置开始顺序的去遍历这个循环链表,当这个指针指向的页面访问位为1时,就把该访问位置0,指针再向下移动,当指针所指的页面的访问位为0时,就选择这一页面淘汰掉,若遍历了一遍链表仍没找到可以淘汰的页,那么久继续遍历下去
CLOCK算法比LRU算法少了很多硬件的支持,实现比较简单,但比FIFO算法所需的硬件要求更多

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值