linux swap为空,当内存全部被占用时,未触发oom,能否导致线程间的数据被写坏?急!!

码农写博客 2016-07-19 04:30:50
如题:
linux 2.6内核 一个进程 多个线程,无swap, 内存全部被占用时会出现啥问题,

像线程间共用堆,不同虚拟地址映射到同一块内存,缺页中断时会发生什么?(注:此时已经无内存可用,正常情况会用swap)会不会引起线程间内存覆写?

注:baidu很挫,基本找不到有用的信息。

...全文
901 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
码农写博客 2016-07-27
  • 打赏
  • 举报
回复
@renwotao2009 覆盖旧页面,那就是程序间的内存会出错啰?像a的程序映射到一块物理内存,b因为缺页也映射到相同物理内存,那b就覆写了a的内存,a崩溃?
lysysjw 2016-07-27
  • 打赏
  • 举报
回复
一般来说,当物理内存被申请到一定程度(未使用的物理内存小于一定值)会触发oom,你标题中"当内存全部被占用时,未触发oom",如果是物理内存,理论上不会全部被占用,当低到一定程度就应该开始触发oom,至于"能否导致线程间的数据被写坏"应该不会存在这样的情况. "像线程间共用堆,不同虚拟地址映射到同一块内存"这个描述应该不准确,同一个地址空间的不同线程,他们虽然是用了相同的堆空间,但是无论是不是同一线程,不同的虚拟地址映射不会到同一物理地址上.不同虚拟地址映射到同一个物理地址上通过mmap函数可以做到,但是像堆空间,栈空间不会出现不同的虚拟地址映射到同一物理地址上的. 多扯一点,linux使用堆空间的大致原理,例如malloc函数申请一片内存时,也就是使用堆空间的内存时,是通过brk系统调用在内存中申请一片虚拟内存空间vma(virtual memory area),并没有给它分配真正的物理内存,所以这时候它对应的物理地址是不确定的,当开始用到这片内存时,比如从这片内存空间读取数据或者写入数据时,这时候会触发pagefault(不同的架构有不同的处理方式,不过最后它们都归于对pagefault的处理上),这时候会根据当前触发异常的地址找到对应的vma,然后通过伙伴系统算法申请一片空闲的物理内存(页)(如果使能了swap,并且内存已经不足了,这时候就会换出一部分使得这部分换出的页变成了"空闲"页,如果还是没有物理内存,那么就通过oomkiller来获取内存)和这个vma填到页表中.
renwotao2009 2016-07-19
  • 打赏
  • 举报
回复
正常情况下,缺页中断会调入所缺页面到内存,并更新cache,如果内存这时没有可用页框,就使用页面置换算法换出旧页面到swap分区,换入新页面。这里你说没有swap,那么就等于覆盖旧页面了

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧