我们都知道,程序要加载到内存中才能运行。要是少了这玩意儿,即使你的计算机性能再强劲,也跑不起来!
内存管理是操作系统中最重要、最复杂的任务之一。
内存管理把内存视为一个资源,它可以分配给多个活动进程,或由多个活动进程共享。
内存管理的基本工具是分页和分段。
下边,我们就来聊聊内存和内存管理相关的几个概念。
1 内存
图:内存条
上图的就是内存条喽!
要想理解操作系统对内存的管理的种种策略、机制,充分认识内存本身的特性,就显得十分必要。
内存,学名随机存储器,也就是 Random Access Memory,简称 RAM 。
几大特点:
所谓「随机存取」,指的是当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置无关。
相对地,有串行访问存储器包括顺序存取存储器(如:磁带)和直接访问存储器(如:磁盘)。很显然,这类非随机存储设备的读取或写入时间是跟数据所在位置密切相关的。
断电后 RAM 中的数据会丢失。如果需要保存数据,就必须把它们写入非易失性的长期存储设备中,如磁盘,光盘等。
内存,几乎是目前所有存储设备中写入和读取速度最快的。存取延迟相比其他涉及机械运作的存储设备,显得微不足道。不过,速度仍然不如 CPU 中的 SRAM 。
这些物理特性,决定了操作系统内存管理的方方面面。
2 地址/地址空间
地址,跟我们实际生活中一样:如果我们要找人,一定会问,他具体的地址,在哪个街道哪个门牌号。依据这个地址,我们就能找到。
计算机中访问数据也类似,必须知道数据的具体位置,也就是** 地址** 。
操作系统中,进程所占用的所有地址,构成的就是该进程的地址空间。
3 物理地址/虚拟地址
物理地址(Physical Address),也叫实地址(Real Address),是计算机地址总线上的地址,指向物理内存中的某个位置。 凭借该地址,就可以访问到物理内存。
很显然,物理内存的大小总是有限的。如果程序所需的内存大于物理内存大小呢 ?
这就要说到虚拟内存。
虚拟内存就是把内存中暂时不用的内存块转移到交换分区或磁盘,从而使得系统中可用内存远大于物理内存的技术。
因此,虚拟地址(Virtual Address),指的就是在虚拟内存中的地址,往往是应用程序指定的地址,如 C 语言中,取地址运算符 & 所计算出来的地址,就是虚拟地址。虚拟地址存在于进程内部,仅靠虚拟地址,并不能直接访问到物理内存。
4 内存分配/分段/分页
采用分页技术,每个进程被划分为相对较小的、大小固定的页。
采用分段技术可以使用大小不同的块。
图:分段硬件
分段(segmentation),将进程逻辑地址空间视为一组段组成。每个段的大小由段基址和段界限控制。每一段的虚拟地址空间是连续的,转换得到的物理地址空间也是连续的。但是各个段之间不需要连续。
分段式的内存管理有几大优点:
1.进程的物理内存空间可以划分为若干个段,段与段之间不需要连续。
2.支持共享与保护。进程可以指向相同的基址和界限来共享某些段,同时还可以给不同的段设置不同的权限。
不过缺点也很明显:
1.进程的上下文切换,需要保存相关进程的所有段基址和段界限。
2.物理内存的空闲空间管理。由于段的大小不同且不连续,导致内存中剩余的物理空间难以被利用,造成内存碎片。
分页:
物理内存划分为固定大小的块,称为页帧(Page Frame),且将逻辑内存也分为同样大小的块,称为页(Page)。
由 CPU 生成的每个地址分为两个部分:页号(p)和页偏移(d)。
页号作为页表中的索引。
页表包含每页所在物理内存的基地址,这些基地址与页偏移的组合就形成了物理地址,就可以送交物理单元。
图:分页硬件
分页的优点有:
1.内存分配和管理方便、灵活。由于虚拟内存页的大小与物理页帧的大小一致,且大小固定(由硬件决定),极大地方便了内存的管理。
2.保护和共享。通过页表配置相应的保护位,控制内存页的相关权限;将多个进程的虚拟地址指向同一块物理内存,从而实现进程间的内存共享。
3.写时复制(Copy-on-Write)。通过 fork() 方法创建的子进程,刚开始时可以与父进程共享同一页面。只有当子进程对页面进行修改时,才进行物理内存的实际拷贝。
缺点:
1.内存管理变得复杂,需要为每个进程保存一个进程页表。
2.需要选择合适大小的页帧。页帧太大,容易产生内部碎片;太小,则页表开销过大。
~~
5 内部碎片/外部碎片
分页按照固定大小的内存块分配内存,而分段的每个段则是大小不固定。
这就形成了两种不同的内存浪费:内部碎片/外部碎片。
分页内存分配是以帧为单位进行的。
如果进程所要求的内存并不是页的整数倍,那么最后一个帧就可能用不完。
如下图中,页面 3 只用了页帧 3 的一部分,剩下的便成了内部碎片(位于页帧内部)。
图:内部碎片
分段内存分配时,每个段的大小并不是固定的,这就导致内存中越来越多的小“洞”,以致于无法为更多的段分配空间。
图:外部碎片
这些都只是操作系统内存管理中最基础的概念!
万丈高楼从地起,基础性的知识,是日后向更高层学习研究的根本。
更多操作系统内存管理的内容,稍后继续……
相关阅读: