Linux存储管理

Posted chenying66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux存储管理相关的知识,希望对你有一定的参考价值。

本章节为《Linux操作系统基本原理与应用》的笔记。

  1. 内存管理模块负责内存的全部管理工作,需要完成:存储空间的分配、存储地址的变换、存储空间的保护以及存储空间的扩充。
  2. 存储分配方案主要包括以下要素:
    a. 描述存储分配的数据结构。系统需采用某种数据结构来登记当前内存使用情况以及空闲区的分布情况,供存储分配程序使用。在每次分配或回收操作后,系统都要相应的修改这些数据结构以反映这次分配或回收的结果。
    b. 实施分配的策略。确定内存分配和回收的算法。好的算法应既能满足进程的运行要求,又能充分利用内存空间。
  3. 由于用户在编写程序时无法预先确定程序在内存中的具体位置,所以只能采用逻辑地址进行编程。而当程序进入内存后,必须把程序中的逻辑地址转换为程序所在的实际内存地址。地址变换是由内存管理模块和硬件的地址变换机构共同完成的。
  4. 高级语言程序使用的地址空间是符号名空间,编程者不需考虑程序代码和数据的具体存放地址。
  5. 编译程序将源代码中的语句逐条翻译为机器指令,为每个变量分配存储单元,并用存储单元的地址替换变量名。这些指令和数据顺序存放在一起,从0开始编排地址,形成目标代码。目标代码所占有的地址范围成为逻辑地址空间。此时成为逻辑地址,或称为相对地址。在访问内存的指令中用逻辑地址来指定一个操作数的地址,在跳转指令中用逻辑地址来表示要跳转到的那条指令的地址。
  6. 每次程序加载时所获得的实际地址空间取决于系统当时的运行状态,因而是不确定的。由于编译程序无法预知程序执行时的实际内存地址,所以目标程序中的地址都是从0开始的逻辑地址,而实际地址只有在程序加载时才能得知。当目标程序加载到内存中时,它所占据的实际内存空间就是它的物理存储空间,物理空间中的地址成为物理地址,或称为绝对地址。
  7. 内存保护的含义是要确保每个进程都在自己的地址空间中运行,互不干扰。许多程序错误都会导致地址越界,比如使用了未赋值的野指针或空指针等。系统设置内存保护机制,对每条指令所访问的地址进行检查。一旦发现非法的内存访问就会中断程序的运行,由操作系统进行干预。常用的存储保护措施:
    a. 界限保护:在CPU中设置界限寄存器,限制进程的活动空间。
    b. 保护键:为共享内存区设置一个读/写保护键,在CPU中设置保护键开关,它表示进程的读/写权限。只有进程的开关代码和内存区的保护键匹配时方可进行访问。
    c. 保护模式:将CPU的工作模式分为用户态与核心态。核心态下的进程可以访问整个内存地址空间,而用户态下的进程只能访问在界限寄存器所规定范围内的空间。
  8. 固定分区:系统把内存静态的划分为若干个固定大小的分区,当一个进程被建立时,系统按其程序的大小为其分配一个足够大的分区。由于分区大小是预先划分好的,通常会大于程序的实际尺寸,因此分区内余下的空闲空间就被浪费了。
  9. 可变分区分配:在程序调入内存时,按其实际大小动态的划分分区。
  10. 分区分配的主要问题是存储“碎片”,碎片是无法被利用的空闲存储空间。固定分区存在“内部碎片”问题,即遍布在各个分区内的零碎剩余空间。可变分区存在“外部碎片”问题,即随着进程不断地进入和退出系统,一段时间后,内存中的空闲分区会变得支离破碎,这些碎片空间的总和可能足够大,但因为不连续,所以不能被利用。
  11. 解决外部碎片的一种有效方法:存储紧缩技术,此时采用动态地址变换,使程序在内存中可以移动。当内存出现碎片现象时,系统将暂停所有进行的运行,将各个进程的分区向内存一端移动,从而将碎片合并成一个连续的存储空间。紧缩完成后,程序继续运行。但是,存储紧缩比较耗时,在进行存储紧缩时,所有用户进程都要停止运行,系统为此付出的代价过大
  12. 分区的保护与扩充:进程只能在自己的分区内活动。存储保护的方式是上下界地址保护,即进程运行时,它的空间上下界地址被加载到CPU的界限寄存器中。如果进程试图访问超越分区上下界的地址,则会引起地址越界中断,使进程结束。
  13. 页式存储分配的基本思想:分散存储使得内存中每一个空闲的区域都可以被程序利用。此时,以页为单位为程序分配内存,每个内存块装一页。一个进程的映像的各个页面可分散存放在不相邻的内存块中,用页表记录页号和内存块号之间的映射关系。
  14. 在段式存储管理系统中,程序的地址空间由若干个大小不等的段组成。段是逻辑上完整的信息单元,划分段的依据是信息的逻辑完整性以及共享和保护等需要
  15. 段与页的差别:段是信息的逻辑单位,长度不固定,由用户进行划分;页是信息的物理单位,长度固定,由系统进行划分,用户不可见。另外,页式的地址空间是一维的,段式的地址空间是二维的。
  16. 段页式存储管理:段式划分、页式存储。即把程序的各段按页式分配方式存储在内存的块中,每段一个页表,另设一个段表,指示各段的页表位置。此时存储空间的利用率高,并能满足各种应用要求。但这种管理技术过于复杂,软硬件开销也很大,因此较少使用。

以上是关于Linux存储管理的主要内容,如果未能解决你的问题,请参考以下文章

操作系统——内存基本分段式存储管理

Linux下C程序的存储空间布局

Linux下C程序的存储空间布局

操作系统内存管理——分区页式段式管理

操作系统的内存管理——页式段式管理段页式管理

操作系统--页式段式段页式内存管理的逻辑与物理地址对应关系