【基础】关于Linux平台malloc的写时拷贝(延迟分配)
来源:互联网 发布:微信授权回调域名1003 编辑:程序博客网 时间:2024/05/16 05:18
Linux内核定义了“零页面”(内容全为0的一个物理页,且物理地址固定),应用层的内存分配请求,如栈扩展、堆分配、静态分配等,分配线性地址后,就将页表项条目指向“零页面”(指定初始值的情况除外),这样“零页面”就被所有进程共享,当向页面执行写入操作时,内核就会新分配一个物理页,实行“写时拷贝”操作,这样就实现了物理页面的延迟分配(如果只有读没有写,则无需另分配物理页)。
动态内存通过glibc库的malloc函数分配,当现有地址空间不够时(即malloc维护的空闲链表中没有足够空间),就调用brk/sbrk扩展进程空间的相关线性区段,然后将对应页表项条目指向“零页面”,写操作时再分配新页面。这样,只要进程空间足够大,malloc操作总是成功的——即使申请的内存大于系统物理内存——失败会发生在为“写时拷贝”分配新页面的时候,当系统可分配内存不足时,且有进程要求分配新页面,内核会Kill该进程,并打印类似“Out of Memory: Killed process xx (xxx).”的信息。这就是Linux的“OOM Killer”特性。
因此不能通过检测malloc的指针是否为NULL,来判定系统能否支持申请的内存大小(即空闲内存大于申请内存)。
malloc操作示意图
malloc分配的这种机制,给应用层判断动态内存是否可分配增加了难度。因为内存不足的错误被延迟到写入操作的时候,而在这里内核没有提供相关接口给应用层(只是发送SEGV信号给临死的进程)。
- 【基础】关于Linux平台malloc的写时拷贝(延迟分配)
- Linux 内存的延迟分配
- 关于内存分配时malloc()和calloc()的区别
- 关于malloc实际分配内存的探讨
- 关于Malloc内存分配函数的解析
- linux 写时拷贝
- malloc的分配方法
- Linux写时拷贝技术
- linux写时拷贝技术
- 关于全局变量指针直接 malloc分配内存的一些问题
- 关于malloc分配内存的“堆被损坏“Bug
- ext4的延迟分配
- ext4的延迟分配
- malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程。
- 自己动手写内存分配函数malloc
- 关于linux的内存分配
- 数据结构 学习笔记之:关于顺序栈中给结构体类型指针分配内存时,使用malloc和不使用malloc的疑惑之解惑!
- string的写时拷贝
- HTML: button和input button的区别
- 12句让人心疼的话 ,你说到那一句了?
- fdhgfhgfjfgjhfj
- wow task
- Microsoft SQL Server 2000综合应用(2)——"配置服务器失败"解决方案
- 【基础】关于Linux平台malloc的写时拷贝(延迟分配)
- 浅谈一个功能模块里的编码规范
- VC++中使用内存映射文件处理大文件
- Linq to Sql 学习系列之一 预备知识
- 安装EDLK的方法
- 个人一直使用的C#工具类
- 图片切换显示
- 项目管理中必须注意软件项目的命名规范
- Linq to Sql 学习系列之二 DataContext与实体