大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。
一、前言
内存碎片是指无法被利用的内存,分为外部碎片和内部碎片。分段机制会导致外部碎片,分页机制会导致内部碎片。
二、外部碎片
分段机制就是一个进程需要多大的内存空间就给该进程多大的连续物理空间。但是会产生一种情况,就是总的空闲内存大小大于进程要申请的空间大小,但是因为这些内存是不连续的所以就不能分配个该进程,就像下图所示:
由图,总的空闲物理内存大小为256MB大于新进程申请的内存大小,但是因为这两块内存不是连续的所以不能分配给该进程,这就是外部碎片。分段是将整个进程内存完整的存到物理内存上,由于每个段的长度不固定,多个段未必能恰好使用所有的内存空间,所以会产生多个不连续的小物理内存,导致新的程序无法被装载,这时就会出现外部碎片的问题。
在分页机制中不会产生外部碎片,分页机制中将物理内存分成一页一页(每一页大小都相同且固定)的,每一页的大小为4KB(在Linux中)。
系统为了隔离各个进程,防止不同进程运行的时候地址覆盖,引入虚拟内存的概念。每个都有一个进程空间,在进程眼里整个内存都是由自己独享的。操作系统将虚拟地址和物理地址都分成一页一页的,然后通过一个元件MMU,将虚拟内存的页映射到物理内存的页上。
由图可以看出来,在不同进程的虚拟空间中,相同的虚拟页映射到了不同的物理页,所以不同进程可以实现隔离。可以看到分页将一个进程内存分割成了一页一页的,然后再映射到物理内存上。虚拟地址和物理地址的最小分配内存大小都是4KB,这样就不会出现总的空闲内存大小够分配但是因为是不连续的所以不能分配内存的这种情况。
简单来说就是分段是直接把进程在物理内存中找个合适的位置塞进去,分页是把进程切成一小片一小片的,然后再塞进物理内存中。
三、内部碎片
分页会导致内部碎片,因为最小的内存分配单位是一页,也就是4KB,但是如果一个程序申请的内存不到一页,系统也得给它分配一页的物理内存,这多出来的就是内部碎片。如图所示:
图上多出来的这3KB就是内部碎片。
四、解决内部碎片办法
TODO