【问题标题】:How Linux manage memory when doing IOLinux在做IO时如何管理内存
【发布时间】:2017-06-09 03:19:41
【问题描述】:

在我看来,当我们通过调用 open 然后 read 系统调用读取文件时,磁盘中文件的内容将首先被读取到内核空间,然后复制到用户空间或进程,所以,如果文件是1G这样的大文件,读取会占用物理内存中的2G内存,1G映射到内核空间,1G映射到进程。我知道这可能是错的,但我错在哪里? Linux如何在读取文件等情况下管理内存?如果我使用 mmap 而不是 read,那么 Linux 的处理方式会有什么不同呢?

【问题讨论】:

    标签: linux linux-kernel system-calls mmap


    【解决方案1】:

    如果文件是1G这样的大文件,读取会占用2G物理内存,1G映射到内核空间,1G映射到进程。

    不,这个假设是错误的。

    取决于文件系统,内核可以读取文件,例如 4K 部分(一页)。

    当用户通过read 系统调用请求 1G 字节时,内核可能仅将文件的 4K 部分复制到用户缓冲区,并返回已读取的字节数。之后,用户可以使用调整后的大小和缓冲区地址重复read 系统调用。

    如果我使用 mmap 而不是 read,那么 Linux 的处理方式有何不同?

    如果mmap 从文件中读取每个 4K 块,可能会延迟到用户实际访问该块。

    这遵循对用户内存的一般解释:用户使用虚拟内存进行操作,应该映射物理 em>一个只有在访问时

    【讨论】:

    • 会从内核空间读取系统调用拷贝数据到用户空间吗?
    • 那么如果我读取一个1G的文件,所有的文件内容都必须复制到内核,但是这些1G的内容不会全部在内核空间,内核有时会释放一些块,全部内容文件只能在用户空间,对吗?
    • whole content of file can only be in user space - 几乎是真的。部分内容可以交换。
    • 是的,内核可能会释放(忘记)它之前读过的一些块。
    • 是的,交换是为了节省内存。当交换的虚拟内存将被访问时,其内容将自动从交换中恢复。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2017-04-26
    • 2011-11-29
    相关资源
    最近更新 更多