『面试问答』:什么是内存碎片?如何减少内存碎片?

面试官: 请说一下,什么是内存碎片?如何减少内存碎片?

内存碎片即“碎片的内存”,它分为外部碎片和内部碎片。外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。

操作系统为了防止多进程运行时造成的内存地址冲突,引入了虚拟内存地址,为每个进程提供了一个独立的虚拟内存空间,使得进程以为自己独占全部内存资源。操作系统使用分段和分页的机制管理虚拟地址与物理地址的映射关系,正是由于操作系统采用的这些内存管理机制导致了内存碎片的产生。

内存分段机制,简单理解就是根据程序申请使用内存的需要,来把物理内存分成一段一段来管理,比如程序需要100M的内存,分段机制就给1段100M连续空间的物理内存与之对应。内存分段可以做到根据实际需求分配内存,有多少需求就分配多大的段,所以不会出现内部碎片。

但是由于每个段的长度不固定,多个段未必能恰好使用所有的内存空间,所以会产生多个不连续的小物理内存,导致新的程序无法被装载,这时就会出现外部碎片的问题。

内存分页将整个虚拟内存和物理内存空间分成一段段固定大小的片,虚拟内存和物理内存的映射以这个片为最小单位进行管理,我们把这个片称为页,在linux系统上,页的大小为4KB。

内存分页由于内存空间都是预先划分好的,页与页之间是紧密排列的,也就不会像内存分段一样,在段与段之间会产生间隙非常小的内存,所以不会有外部碎片。

但是,因为内存分页机制分配内存的最小单位是一页,即使程序不足一页大小,最少也只能分配一个页,所以页内会出现内存浪费,所以分页机制会产生内部碎片的问题。

对于如何减少内存碎片?在操作系统层面,Linux系统使用伙伴系统Buddy分配器以页为单位来组织物理内存页框,对物理内存页进行合理的分配和回收,让内存分配与相邻内存合并能快速进行,用于缓解外部内存碎片,同时为了减少内部碎片,Linux还引入了slab算法,将内存页拆分为更小的单位来管理,slab可以对小对象空间进行分配,而不需要分配整个页面给对象,这样可以节省空间,内核中对于频繁使用的小对象,slab还会对此作缓存,避免频繁的内存分配和回收。

#晒一晒我的offer##24届软开秋招面试经验大赏##我发现了面试通关密码##如何判断面试是否凉了#
软件开发面试问答 文章被收录于专栏

分享软件开发岗位面试题及答案

全部评论

相关推荐

评论
3
4
分享

创作者周榜

更多
牛客网
牛客企业服务