例如,在具有2 GB物理内存的计算机上:如果我mmap' d 100GB文件并且尽可能快地开始喷写,那么预期的行为是什么?当页面被刷新到磁盘时写入内存块,还是系统缓冲区失控最终会因某种内存不足错误而死?
答案 0 :(得分:1)
你经常交换。 mmap()
只是意味着您使用普通文件而不是交换分区或文件进行交换。
当然,这仅适用于您mmap()
编辑文件的情况。如果您进行了匿名映射(即MAP_ANONYMOUS
),则您必须遵守通常的规则。
您现在也可以使用MAP_POPULATE
触发部分交换,而不是稍后,这类似于阻止。
答案 1 :(得分:1)
是的,在写回操作完成之前,调用将会阻塞。
对内存中未缓存的页面的任何访问都会产生页面错误,因此会停止执行并将控制权交还给操作系统。操作系统将安排从内存加载页面所需的所有IO操作(如果换出硬盘,则安排硬盘)。然后它将运行其他进程,直到IO完成。完成IO后,您的进程将附加回准备执行的进程队列。
无论是换出内存还是在内存中,一旦没有缓存执行就会停止执行,直到数据在缓存中可用,这样你的调用就会停止。
访问什么样的内存实际上并不重要。当你映射文件时,它的行为类似于换出的内存。访问它的内容会将其带入缓存,当需要缓存中的空间时,它将被写回内存或磁盘。当内存填充时,内存的行为就像交换空间的缓存一样。
您可以在此处阅读有关页面错误的信息:https://en.wikipedia.org/wiki/Page_fault