加入收藏 | 设为首页 | 会员中心 | 我要投稿 马鞍山站长网 (https://www.0555zz.cn/)- 媒体处理、内容创作、云渲染、网络安全、业务安全!
当前位置: 首页 > 服务器 > 系统 > 正文

Linux 是如何进行内存调整的

发布时间:2023-10-19 12:49:10 所属栏目:系统 来源:
导读:Linux 内核与用户进程使用不同的内存区域,其中内核区域用于内核处理,而 user 区域是供应用程序使用的,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:

32 位系统的内核空间
Linux 内核与用户进程使用不同的内存区域,其中内核区域用于内核处理,而 user 区域是供应用程序使用的,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:

32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;
64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。
再来说说,内核空间与用户空间的区别:

进程在用户态时,只能访问用户空间内存;
只有进入内核态后,才可以访问内核空间的内存;
虽然每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。

0x0000 0000 到 0x0804 8000 这段虚拟内存地址是一段不可访问的保留区,因为在大多数操作系统中,数值比较小的地址通常被认为不是一个合法的地址,这块小地址是不允许访问的。比如在 C 语言中,我们通常会将一些无效的指针设置为 NULL,指向这块不允许访问的地址。
代码段,包括二进制可执行代码;
数据段,包括已初始化的静态常量和全局变量;
BSS 段,包括未初始化的静态变量和全局变量;
堆段,包括动态分配的内存,从低地址开始向上增长;
堆空间的上边是一段待分配区域,用于扩展堆空间的使用
文件映射段,包括动态库、共享内存等,从低地址开始向上增长
栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;
申请内存的两种方式
用于申请系统级内存空间连通性一般就采用了两种截然不同的方法,一种是malloc,另一种是mmap映射空间。 在使用malloc()分配内存的时候,可能系统调用brk(),也可能调用mmap()。

malloc的调用规律
1. 即分配一块小型内存(小于或等于128kb),malloc()会调用brk 函数将堆顶 指针向高地址移动,获得新的内存空间。

2. 当分配一块大型内存(大于128kb),mmap() 系统调用中「私有匿名映射」的方式,在文件映射区分配一块内存

缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。

malloc 申请的内存,free 释放内存会归还给操作系统吗
malloc 通过 brk() 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用;
malloc 通过 mmap() 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放。
mmap 和 brk 分配内存的区别
mmap 来分配内存的问题
mmap 分配的内存每次释放的时候,都会归还给操作系统,于是每次mmap 分配的虚拟地址都是缺页状态的,然后在第一次访问该虚拟地址的时候,就会触发缺页中断。

也就是说,频繁通过 mmap 分配的内存话,不仅每次都会发生运行态的切换,还会发生缺页中断(在第一次访问虚拟地址后),这样会导致 CPU 消耗较大。

为了改进这两个问题,malloc 通过 brk()系统调用在堆空间申请内存的时候,由于堆空间是连续的,所以直接预分配更大的内存来作为内存池,当内存释放的时候,就缓存在内存池中。

等下次在申请内存的时候,就直接从内存池取出对应的内存块就行了,而且可能这个内存块的虚拟地址与物理地址的映射关系还存在,这样不仅减少了系统调用的次数,也减少了缺页中断的次数,这将大大降低 CPU 的消耗。

只使用 brk 来分配内存的问题
前面我们提到通过 brk 从堆空间分配的内存,并不会归还给操作系统,那么我们那考虑这样一个场景。

如果我们连续申请了 10k,20k,30k 这三片内存,如果 10k 和 20k 这两片释放了,变为了空闲内存空间,如果下次申请的内存小于 30k,那么就可以重用这个空闲内存空间。这个方法适用于所有情况,不过要注意的是,如果你的系统是安卓系统,那么就不能使用这个方法了。

(编辑:马鞍山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章