我有以下关于 Linux 内存的问题:
我知道活动内存是最常访问的内存部分。但是有人可以解释一下linux如何考虑将内存位置用于活动内存或非活动内存。
有源内存由哪些组件组成?磁盘/文件缓存是否被视为活动内存的一部分。
Buffers
和 和有什么区别Cached
?
我试着回答你的问题:
(1) 基本上,你的想法是正确的。但是 Linux Kernel 中的页面缓存实现很复杂。Linux 内核使用 LRU(最近最少使用)算法来管理页面缓存列表。一个Linux系统中可能有不同的内存区域,每个区域都维护着几个LRU列表,例如LRU_INACTIVE_ANON、LRU_ACTIVE_ANON(这两个列表用于匿名页面缓存)、LRU_INACTIVE_FILE、LRU_ACTIVE_FILE(这两个列表用于文件页面缓存)、LRU_UNEVICTABLE。这些列表使用 LRU 算法维护(添加到尾部,从头部删除)。并且页面根据访问频率在活动列表和非活动列表之间转换。只有当页面被访问并且它位于非活动列表中时,页面才会添加到活动列表尾部。如果活动列表变得太大,处于活动列表头部的页面将被移动到非活动列表尾部。页面回收发生在非活动列表上,从非活动列表的头部开始。
(2) 常规文件读/写、块设备文件访问和内存映射文件都可以触发 Linux Kernel 生成页面缓存,无论是活动的还是非活动的。此外,用户空间进程和用户空间堆栈中使用的 malloc 可以触发 Linux 内核生成页面缓存。
(3)也许我误解了你的问题,我猜你的意思是缓冲区缓存和页面缓存之间的区别:旧版本的内核同时使用缓冲区缓存和页面缓存。页面缓存用于文件访问(例如常规文件访问、内存映射文件、块设备文件访问),缓冲区缓存用于物理磁盘块访问(通常物理磁盘块的大小小于一页,所以有几个物理磁盘块可以填满一页)。虽然新版本内核仍然使用缓冲区缓存的概念,但新内核在页缓存的基础上实现了缓冲区缓存。
或者你的意思是内存缓冲区和cpu缓存之间的区别,如果是这样,内存缓冲区是为了加速磁盘/外围设备的访问,而cpu缓存是为了加速内存访问。