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的写时拷贝(延迟分配)【转】的更多相关文章

  1. Linux写时拷贝技术(copy-on-write)

    COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内 ...

  2. 【转】Linux写时拷贝技术(copy-on-write)

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 源于网上资料 COW技术初窥: 在Linux程序中,fork()会 ...

  3. [转] Linux写时拷贝技术(copy-on-write)

    PS:http://blog.csdn.net/zxh821112/article/details/8969541 进程间是相互独立的,其实完全可以看成A.B两个进程各自有一份单独的liba.so和l ...

  4. Linux写时拷贝技术【转】

    本文转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html COW技术初窥: 在Linux程序中,fork()会产 ...

  5. copy-on-write(写时拷贝技术)

    今天看<Unix环境高级编程>的fork函数与vfork函数时,看见一个copy-on-write的名词,貌似以前也经常听见别人说过这个,但也一直不明白这究竟是什么东西.所以就好好在网上了 ...

  6. Linux写时拷贝技术(copy-on-write)

    1.传统的fork()函数创建一个子进程,子进程和父进程共享正文段,复制数据段,堆,栈到子进程示意图如下: 2.Linux的fork()函数-写时复制(copy-on-write)创建一个子进程,内核 ...

  7. 计算机程序的思维逻辑 (73) - 并发容器 - 写时拷贝的List和Set

    本节以及接下来的几节,我们探讨Java并发包中的容器类.本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理.它们的用法比较 ...

  8. String类的实现(4)写时拷贝浅析

    由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝.这也是一种 ...

  9. 并发容器之写时拷贝的 List 和 Set

    对于一个对象来说,我们为了保证它的并发性,通常会选择使用声明式加锁方式交由我们的 Java 虚拟机来完成自动的加锁和释放锁的操作,例如我们的 synchronized.也会选择使用显式锁机制来主动的控 ...

随机推荐

  1. Recommending music on Spotify with deep learning 采用深度学习算法为Spotify做基于内容的音乐推荐

    本文参考http://blog.csdn.net/zdy0_2004/article/details/43896015译文以及原文file:///F:/%E6%9C%BA%E5%99%A8%E5%AD ...

  2. MCS-51单片机的指令时序

    时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. 节拍与状态:    我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示), ...

  3. 借鉴DP思想: HouseRobberIII

    The thief has found himself a new place for his thievery again. There is only one entrance to this a ...

  4. HDOJ(HDU) 1673 Optimal Parking

    Problem Description When shopping on Long Street, Michael usually parks his car at some random locat ...

  5. Response.Expires 属性 (转载于疯狂客的BLOG)

    Expires 属性 Expires 属性指定了在浏览器上缓冲存储的页距过期还有多少时间.如果用户在某个页过期之前又回到此页,就会显示缓冲区中的版本 语法 Response.Expires [= nu ...

  6. VC CArchive类使用

    CFile file("D:\\1.txt",CFile::modeCreate | CFile::modeWrite); CArchive ar(&file,CArchi ...

  7. asdasd

    adasdasd asdasd asdasd asd

  8. springboot中的406(Not Acceptable)错误

    今天遇到一个很奇怪的问题,我用springboot开发时,用ajax请求服务想返回json数据,页面总是报406错误,这个错误使我郁闷了很久,原来我的后台服务是这么写的 看到没value的后面有个.h ...

  9. 宙斯是一个完整的Hadoop的作业平台[转]

    https://github.com/alibaba/zeus 宙斯(zeus)是什么 宙斯是一个完整的Hadoop的作业平台从Hadoop任务的调试运行到生产任务的周期调度 宙斯支持任务的整个生命周 ...

  10. IntelliJ IDEA 的Project structure说明

    IntelliJ IDEA 的Project structure可以在File->Project structure中打开,同时,在新建项目是IDE一般用向导的方式让你填写Project str ...