linux内核知识收集
-
概述
使用Linux时, 随着时间的推移,内存的free越来越小,而cached越来越大, 原因是内核的文件Cache机制.
文件Cache的实现, 是页面Cache.
应用程序读取文件的数据时,操作系统先分配一些内存,将数据从存储设备读入到这些内存中, 然后再将数据分发给应用程序;
往文件中写数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。
文件Cache管理,就是对这些由操作系统分配,并用来存储文件数据的内存的管理。
读文件:
多数情况下,内核在读磁盘时都先通过页面Cache。
若页面不在Cache中,新页加入到页面Cache中,并用从磁盘上读来的数据来填充页面。
如果有足够的内存空间,该页可以在页面Cache长时间驻留,其他进程再访问该部分数据时,不需要访问磁盘。
这就是free命令显示内核free值越来越小,cached值越来越大的原因。
写文件:
把一页数据写到块设备之前,内核首先检查对应的页是否已经在页面Cache中;
如果不在,就在页面Cache增加一个新页面,并用要写到磁盘的数据来填充。
数据的I/O传输并不会立即开始执行,而是会延迟几秒左右;这样进程就有机会进一步修改写到磁盘的数据。
页面Cache可能是下面的类型:
a. 含有普通文件数据的页;
b. 含有目录的页;
c. 含有直接从块设备文件(跳过文件系统层)读出的数据页;
d. 含有用户态进程数据的页,但页中的数据已被交换到磁盘;
e. 属于特殊文件系统的页,如进程间通信中的特殊文件系统shm。
下图是块设备的操作流程图
内核页面Cache的实现主要为了满足下面两种需要:
a. 快速定位含有给定所有者相关数据的特定页。
为了尽可能发挥页面Cache的优势,查找过程必须快。
b. 记录在读或写页中的数据时,应该如何处理页面Cache中的每个页。
例如,从普通文件、块设备文件或交换区读一个数据页, 必须用不同的方式; 这样内核必须根据页面拥有者来选择正确的操作。
页面Cache中的数据单位是整页数据。
一个页面中的数据在磁盘上不必是相邻的
页面不能用设备号和块号来识别
Cache中的页面识别是通过拥有者和拥有者数据中的索引,通常是inode和相应文件内的偏移量。
文件Cache是文件数据在内存中的副本,因此文件Cache管理与内存管理系统和文件系统都相关:
一方面文件 Cache 作为物理内存的一部分,需要参与物理内存的分配回收过程,
另一方面文件Cache中的数据来源于存储设备上的文件,需要通过文件系统与存储设备进行读写交互。
从操作系统的角度考虑, 文件Cache可以看做是内存管理系统与文件系统之间的联系纽带。
因此,文件Cache管理是操作系统的一个重要组成部分,它的性能直接影响着文件系统和内存管理系统的性能
2. 重要数据结构和函数
a. address_space
数据结构address_space是
页面Cache的核心.
address_space结构体嵌入在拥有该页面的inode对象中。
在Cache中,可能有多个页面同属于一个inode, 这样他们就可能指向同一个address_space对象。
同时,通过该对象将拥有者的页面和在这些页面上的操作方法联系起来
b. address_space_operations
c. find_get_page
d. add_to_page_cache
e. remove_from_page_cache
3. 文件读写流程
a. 读文件过程
1>.数据不在页cache中
2>.数据在页cache中
b. 写文件过程
阅读(748) | 评论(0) | 转发(0) |