MAD*_*DER 3 memory operating-system memory-management
请妥善解释.不要只写定义.还解释它的作用以及它与细分的不同之处.
需要使用内存分配技术来考虑碎片.分页基本上不是内存分配技术,而是提供虚拟地址空间的方法.
考虑到与分段的比较,您可能要问的是使用固定大小块的内存分配技术(如分页页面,假设此处有4KB页面大小)与使用可变大小块的技术(如使用的分段)之间的区别用于细分).
现在,假设您直接使用页面分配接口来实现内存管理,即您有两个处理内存的函数:
alloc_page,它分配一个页面并返回一个指向新可用地址空间开头的指针,和free_page,释放单个分配的页面.现在假设使用了所有当前可用的虚拟内存,但您需要存储1个额外字节.你打电话alloc_page给一个4KB的内存块.您只使用该巨大块的1个字节,但从分配器的角度来看,其他4095个字节也是使用的.如果多次发生这种情况,最终将分配所有页面,因此进一步调用alloc_page将失败.即使您只需要另外一个字节(可能是上面浪费的4095之一),分配器也会告诉您内存不足.这是内部碎片.
另一方面,如果你使用可变大小的块(比如在分段中),那么你很容易受到外部碎片的影响:假设你管理6个字节的内存(F意思是"免费"):
FFFFFF
Run Code Online (Sandbox Code Playgroud)
您首先分配3个字节a,然后分配1个,b最后分配2个字节c:
aaabcc
Run Code Online (Sandbox Code Playgroud)
现在,你解放了a和c,只留下b分配:
FFFbFF
Run Code Online (Sandbox Code Playgroud)
您现在有5个字节的未使用内存,但如果您尝试分配4个字节的块(小于可用内存),则由于内存的不利放置,分配将失败b.这是外部碎片.
现在,如果扩展页面分配器以便能够分配多个页面并添加alloc_multiple_pages,则必须处理内部和外部碎片.
分页中没有外部碎片,但存在内部碎片。首先,我们需要了解什么是外部碎片化。当我们有一个内存来容纳一个进程但它不是连续的时,就会发生外部碎片。分页时怎么不出现?分页将虚拟内存或所有进程划分为大小相等的页面,将物理内存划分为固定大小的帧。因此,您通常将称为页面的相同大小的块固定到称为框架的相同块状空间中!尝试想象并得出结论,永远不会有外部碎片。
在分段的情况下,我们将虚拟地址划分为不同大小的块,这就是为什么主内存中的某些块可能必须粘在一起或压缩为新进程腾出空间的原因!我希望它有帮助!