在我看来,当我们通过调用open然后读取系统调用来读取文件时,首先在内核空间中读取磁盘中文件的内容然后复制到用户空间或进程,因此,如果文件是1G这样的大文件,读取将占用物理内存中的2G内存,1G映射到内核空间,1G映射到进程。我知道这可能是错的,但我错在哪里? Linux如何在读取文件的情况下管理内存?如果我使用mmap而不是read,那么Linux如何处理它呢?
答案 0 :(得分:2)
如果文件是1G这样的大文件,读取将占用物理内存中的2G内存,1G映射到内核空间,1G映射到进程。
不,这个假设是错误的。
依赖于文件系统,内核可以读取文件,例如4K部分(一页)。
当用户通过read
系统调用请求1G字节时,内核可能只复制到文件的4K部分用户缓冲区,并且已经读取了返回的字节数。之后,用户可以使用调整后的大小和缓冲区地址重复read
系统调用。
如果我使用mmap而不是read,那么Linux如何处理它呢?
如果mmap
读取文件中的每个4K块,则可能会被删除,直到用户实际访问该块为止。
这是对用户内存的一般解释:用户使用虚拟内存进行操作,该内存应映射到物理> em>仅在访问时 。