Linux 做IO时如何管理内存
How Linux manage memory when doing IO
在我看来,当我们通过调用open读取文件,然后调用read系统调用时,磁盘中的文件内容会先在内核中读取space,然后复制到用户space或者进程,所以,如果文件是1G这样的大文件,read会在物理内存中占用2G内存,1G映射到内核space,1G映射到进程。我知道这可能是错误的,但我哪里错了? Linux 如何在读取文件等情况下管理内存?如果我使用 mmap 而不是读取,那么 Linux 如何以不同方式处理它?
If the file is big file like 1G, read will occupy 2G memory in physical memory, 1G maps to kernel space, and 1G maps to the process.
不对,这个假设是错误的。
取决于文件系统,内核可能会读取文件,例如 4K 部分(一页)。
当用户通过 read
系统调用请求 1G 字节时,内核可能仅将文件的 4K 部分复制到用户缓冲区,并且已读取 return 字节数。之后,用户可以使用调整后的大小和缓冲区地址重复 read
系统调用。
If I use mmap instead of read, then how the Linux deal with it differently?
如果 mmap
从文件中读取每个 4K 块可能会延迟,直到该块将被用户 实际访问。
这遵循对用户内存的一般解释:用户使用虚拟内存进行操作,应该映射 到 物理 一个 仅在访问时 .
在我看来,当我们通过调用open读取文件,然后调用read系统调用时,磁盘中的文件内容会先在内核中读取space,然后复制到用户space或者进程,所以,如果文件是1G这样的大文件,read会在物理内存中占用2G内存,1G映射到内核space,1G映射到进程。我知道这可能是错误的,但我哪里错了? Linux 如何在读取文件等情况下管理内存?如果我使用 mmap 而不是读取,那么 Linux 如何以不同方式处理它?
If the file is big file like 1G, read will occupy 2G memory in physical memory, 1G maps to kernel space, and 1G maps to the process.
不对,这个假设是错误的。
取决于文件系统,内核可能会读取文件,例如 4K 部分(一页)。
当用户通过 read
系统调用请求 1G 字节时,内核可能仅将文件的 4K 部分复制到用户缓冲区,并且已读取 return 字节数。之后,用户可以使用调整后的大小和缓冲区地址重复 read
系统调用。
If I use mmap instead of read, then how the Linux deal with it differently?
如果 mmap
从文件中读取每个 4K 块可能会延迟,直到该块将被用户 实际访问。
这遵循对用户内存的一般解释:用户使用虚拟内存进行操作,应该映射 到 物理 一个 仅在访问时 .