建设网站用什么语言好,网站建设和网络优化的区别,wordpress前端接口,用阿里云建设网站malloc是函数而不是系统调用#xff0c;他的底层是同调调用brk和mmap这两个系统调用实现功能的#xff0c;具体选择brk还是mmap要看申请的空间大小以及malloc中的阈值#xff08;一般是128kb#xff09; 注意申请的空间只有使用才会触发缺页中断映射到物理内存 不理解的话先… malloc是函数而不是系统调用他的底层是同调调用brk和mmap这两个系统调用实现功能的具体选择brk还是mmap要看申请的空间大小以及malloc中的阈值一般是128kb 注意申请的空间只有使用才会触发缺页中断映射到物理内存 不理解的话先去学习一下分页和分段这些概念
brk
特点
进行堆指针的偏移申请的空间会比申请的大容易产生内存碎片空间释放后不会返回给操作系统而是给内存池维持了内存池从而减少了系统调用
mmap
特点
申请的空间大申请的空间释放后回归操作系统而非内存池从文件映射区挖一块内存
brk相较于mmap适合用作小空间处理的原因可以从两方面理解
brk的原理是移动堆指针地址连续用着用着会产生大量的内存碎片性能提升不会太高减少对操作系统并发性的影响大空间被挖走当内存池会影响操作系统的整体性能
free释放时是如何知道释放多大空间的
在malloc的前边几个字段会存储申请的空间大小释放的时候会偏移回去可以借助指针看看空间大小一般会比申请的大
#includeiostream
#includestdlib.h
using namespace std;
int main(){int *cur(int*)malloc(32);for(int i0;i8;i) cur[i]i;for(int i-5;i15;i){cout*(curi)endl;}
}可以看到这里的实际大小是奇数计算一下堆的对齐方式是16字节头部8字节多申请一位应该是为了避免你申请8字节时出现堆指针和内存重叠的情况你细品
内存不够用时申请物理内存会发生什么
如果没有空闲的物理内存那么内核就会开始进行回收内存的工作回收的方式主要是两种直接内存回收和后台内存回收。
后台内存回收在物理内存紧张的时候会唤醒 kswapd 内核线程来回收内存这个回收内存的过程异步的不会阻塞进程的执行。直接内存回收如果后台异步回收跟不上进程内存申请的速度就会开始直接回收这个回收内存的过程是同步的会阻塞进程的执行。如果直接内存回收后空闲的物理内存仍然无法满足此次物理内存的申请那么内核就会触发 OOM机制OOM机制会根据页面置换算法选择一个占用物理内存较高的进程然后将其杀死以便释放内存资源如果物理内存依然不足OOM会继续杀死占用物理内存较高的进程直到释放足够的内存位置。
回收对象
文件页缓存磁盘数据/缓存文件数据等如果修改过没有提交是脏页需要进行页面置换否则的话一般认为可以直接释放匿名页比如栈、堆数据这类必须要进行页面置换
所以说当申请的空间大于实际拥有的内存量时需要进行大量的文件IO会变得非常的卡可以设置回收倾向来适当缓解一般推荐优先回收文件页
new/delete和malloc/free的关系