内存管理

操作系统为每一个进程分配一套虚拟地址。进程与进程之间隔离开来,互不干涉。
操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。

操作系统是如何管理虚拟地址和物理地址之间的关系?

  • 内存分段
  • 内存分页

内存分段

程序是由若干逻辑分段组成的,如可由代码分段,数据分段,栈段,堆段组成,不同的段是具有不同的属性,所以就用分段的形式把这些段分离出来。

虚拟地址是通过段表与物理内存进行映射,分段机制会把程序的虚拟地址分为4个段,每个段在段表中有意向,再这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址。
内存管理

分段的不足之处

内存碎片

外部内存碎片,也就是产生了多个不连续的小物理内存,导致新的程序无法被装载。

  • 解决外部内存碎片的问题就是内存交换
    例如,可以把音乐程序占用的256MB内存写到硬盘上,然后再从硬盘读回到内存里。不过再读回的时候,我们不能装载到原来的位置,而是仅仅跟着那已经占用的512MB内存后面,这样就能空缺出连续的256MB空间,于是新的200MB 程序就可以装载进来
    这个内存交换空间在linux 系统中,也就是我们常看到的Swap 空间,这块空间是从硬盘划分出来的,用于内存和硬盘的空间交换。
    内部内存碎片,程序所有的内存都被装在到物理内存中,但是这个程序有部分的内存可能不是经常使用,这也会导致内存的浪费

内存交换效率低下

因为硬盘的访问速度比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。

为了解决内存碎片和内存交换效率低的问题就出现了内存分页

内存分页

分段的好处是能产生连续的内存空间,但是会出现内存碎片和内存交换的空间太多的问题。

要解决这个问题就要想出能少出现一些内存碎片的办法,另外当需要进行内存交换的时候,让需要交换写入或者从磁盘装载的数据更少一些,这样就可以解决问题,这个办法就是内存分页。

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小,这样一个连续且尺寸固定的内存空间,称为“页”, 在LINUX 下每一个页的大小为4KB
内存管理
页表是存储在内存里面,内存管理单元(MMU)就做将虚拟内存地址转换为物理地址的工作
当进程访问的虚拟地址在页表中查找不到时候,系统就会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表、最后再返回用户空间,恢复进程的运行。

分页是如何解决分段的内存碎片和内存交换效率低的问题?

由于内存空间是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因,而采用了分页,那么释放内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。

由于内存空间的不足,操作系统会把其他正在运行的进程中的“最近没被使用”的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(swap out)。 一旦需要的时候,再加载进来,称为换入。所以,一次性写入磁盘的页只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

内存管理

更进一步地,分页的方式使得我们在加载程序的时候,不在需要一次性的都把程序加载到物理内存中,我们完全可以再进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存去,而是只有在程序运行中,需要用到对应虚拟内存里面的指令和数据时,再加载到物理内存里面去。

内存管理

上一篇:多媒体编程——ios视频图像绘制工具类。


下一篇:FPGA图像处理技巧 搬运自fpga开源工作室 也就那样