7.2内存分区:
P244有所有内存管理技术的总结表
内部碎片:由于被装入的数据块小于分区大小,从而导致分区内部有空间浪费,这种现象称为内部碎片。
由于已经有许多分区方法被历史淘汰了,我就不一一详细总结了。
缺点:
固定分区:限制了活动进程的数目,并且如果可用分区的大小与进程大小非常不匹配,则内存空间的利用率会非常低。会产生内部碎片
动态分区:维护复杂,并且需要进行压缩的额外开销。会产生外部碎片
外部碎片:因为行程持续地被载入与置换,使得可用的记忆体空间被分割成许多不连续的区块。虽然记忆体所剩空间总和足够让新行程执行,却因为空间不连续,导致程式无法载入执行。
内部碎片:发生在以固定长度分割区来进行配置的记忆体中当一个程式载入到固定大小的分割区时,假如程式小于分割区,则剩余的空间将无法被使用,称为内部碎片
伙伴算法:开始给出一个初始大小的内存块,当请求需要的内存很少的时候可以二分这个内存块到一个最合适的时候给进程,进程在需要的时候内存块可以继续分裂和合并。
当前一般使用的都是基于分页和分段机制的虚拟内存更高级。
重定位:
一个进程在它的生命周期中可能占据不同的分区,当第一次创建一个进程映像时,它被装入主存中的某些分区。以后该进程可能会被换出,当它再次被换入时,可能被指定到与上一次不同的分区中。
逻辑地址:是指与当前数据在内存中的物理地址无关的访问地址,在执行对内存的访问之前必须把它转换成物理地址。
相对地址:是逻辑地址的一个特例,是相对于某些已知点(通常是程序的开始处)的存储单元。
物理地址或绝对地址:是数据在主存中的实际位置。
一般情况下我们需要一个硬件机制把相对地址转换成物理主存地址。
7.3分页
大小不等的固定分区和大小可变的外部分区技术在内存的使用上都是低效的,前者会产生内部碎片,后者会产生外部碎片。
新方法
将主存分成大小固定相等的块,且块相对比较小,每个进程也被分成同样大小的块,那么进程中称为页的块可以指定到内存中成为帧或页帧的可用块。
由此方法在内存中为每个进程浪费的空间仅仅是进程最后一页的一小部分形成的内部碎片,没有任何外部碎片。
若是没有足够的连续帧
进程依旧可以被保存,因为这时候可以使用逻辑地址来解决这个问题。
此时除了需要一个简单的基址寄存器以外,操作系统需要为每个进程维护一个页表。
页表:给出了该进程的每一页对应的帧的位置,在程序中每个逻辑地址包括一个页号和在该页中的偏移量。
在分页中,逻辑地址到物理地址的转换仍然由处理器硬件完成,并且处理器必须知道如何访问当前进程的页表,给出逻辑地址(页号和偏移量),处理器使用页表产生物理地址(帧号和偏移量)。
页的大小及帧的大小必须是2的幂
总体概述
采用简单分页技术,主存被分成许多大小相等且很小的帧,每个进程被划分成同样大小的页,较小的进程需要较少的页,较大的进程需要较多的页;当一个进程被装入时,它的所有页都被装入到可用帧中,并且建立一个页表。
7.4分段
采用分段计数,程序和相关数据被划分成一组段。
与分页一致,采用分段技术时的逻辑地址由两部分组成:段号和偏移量(对应分页则是页号和偏移量)。
分段和动态分区的不同:在分段中一个程序可以占据多个分区,并且这些分区不要求是连续的。分段消除了内部碎片,但是和动态分区一样,它会产生外部碎片。
地址转换的步骤:
(1)提取段号,即逻辑地址最左边的n位
(2)以这个段号为索引,查找该进程段表中该段的起始物理地址。
(3)最右边m位标识偏移量,偏移量和段长度进行比较,如果偏移量大于该长度,则该地址无效。
(4)物理地址为该段的起始物理地址加上偏移量的和。
总体概述
采用简单的分段技术,进程被划分成许多段,段的大小不需要相等。当一个进程被调入时,它的所有段都被装入内存可用区域,并建立一个段表。