前段:
1.假设我们在一个32位的Linux操作系统上,有4GB的物理内存。
1.没有交换分区!
1.有一个内核,保留了200 MB的不可分页内存,其他任何人都不能占用(这整个声明只是我的假设,你可以纠正内核不这样做的值或状态)。
1.在时间t,有三个进程p1
、p2
和p3
消耗1GB的物理内存。
1.现在第四个进程开始了,mmap(2)
的内存为4GB,MAP_PRIVATE
为一个空文件,PROT_WRITE
!这个进程开始了一个for
循环,向这个mmap
艾德ed数组的每个元素写入一些值;像这样:
for(int i=0; i<4GB; i++)
mmap_array[i] = i*i%255;
字符串
提问:
1.当进程p4
已经写入了2.8GB的数据,要求写入下一个字节时,内核是否停止其他3个进程,创建它们的映像,并且由于没有交换,将它们存储回RAM;这又消耗了1GB的物理内存(因为它们运行时有1GB的RAM,所以相同的映像大小)?
1.如果上面的问题是YES,这是否意味着如果一个进程请求更多的内存,而这些内存是由其他进程占用的,那么就会有上下文切换?
1.关于页面错误是如何工作的,从现在开始,由于这1GB不能被释放,可用RAM仍然是2.8GB,当p4
请求数组的下一个元素时,内核是否卸载第一个页面,然后加载新页面而不是卸载页面?
1.如果第三个问题的答案是YES(我对此表示怀疑),那么内核如何保存这个新页面所使用的物理内存的未加载页面的值呢?(没有交换分区;它会强制磁盘交换空间吗?)
1.如果它是MAP_SHARED
呢?卸载的页面的值是否会通过备份文件携带,然后释放物理空间?
1.当像p4
这样的进程这样做时(或者当RAM达到100%时的其他情况),为什么系统挂起?是因为它需要额外的空间来恢复p1
,p2
和p3
的映像吗?或者这些映像将在1GB中恢复,但一旦他们要求更多内存,他们就会冻结?
1.同样,如果#6是YES,并且使用MAP_SHARED
的这3个进程不能或它们是否充当#5?继续但缓慢(当时只有一页RAM)?
SysRq
仍然可以工作;这是否意味着每个进程都会挂起,但由于内核保留了内存,所以不会挂起?
所有这些问题都集中在一个帖子中的原因是通过理解所有这些,我能够理解我在标题中写的实际问题!
我只是把我想得到答案的事情编号,以避免评论人们写的答案。
1条答案
按热度按时间knpiaxh11#
让我向您介绍“Linux内存不足(OOM)杀手”https://rakeshjain-devops.medium.com/linux-out-of-memory-killer-31e477a45759
基本上,Linux内核确实为每个进程维护了一个“可扩展性”的分数,如果它遇到无法完成内存分配的情况,它将按照分数的顺序牺牲进程,以腾出空间。
如果推来推去,尝试mmap-ed写的进程无法完成,因为无论内核多么努力地尝试腾出空间,最终该进程都会收到SIGBUS(总线错误,内存访问错误)信号。