访问文件较复杂,涉及VFS、块设备处理、磁盘高速缓存。有规范模式、同步模式、内存映射、直接I/O、异步。Read、write系统调用会最终调用相应的服务例程,在其中调用文件对象的read、write方法,确定数据的物理位置,激活驱动程序传输数据。普通文件以相邻扇区成组存放在磁盘上,因此很少移动磁头即可快速检索文件。预读技术会在实际请求前读普通文件几个相邻数据页。预读对随机访问的文件无用,它浪费了页高速缓存空间。如果请求的第一页紧随上次访问请求的末页,内核则将此次访问视作顺序访问。预读算法使用两个页面集,叫“当前窗”与“预读窗”。前者包含请求及预读到的页,后者包含正在预读的页。进程第一次访问一文件时,且第一次请求页偏移为0时,则假定要顺序访问,从第一页创建一个新的当前窗并初始化,顺序读则创建预读窗,随机则删掉预读窗。
写文件是把数据从用户态地址空间移到内核数据结构,再移至磁盘。
内存映射技术是将一个线性区与磁盘文件系统的普通文件关联。共享型指在线性区上写会改变磁盘上的文件;私有型是进程创建的映射只为读文件,试用写时会使内核停止映射。Mmap系统调用完成内存映射。内存映射的数据结构由inode对象其中的address_space对象、文件对象、页框的页描述符及address_space中的PST表示。PST用于从address_space回找文件对象。内存映射创建后,并未直接分页框,而是推迟到缺页异常,也可非线性地映射内存。
非常复杂的程序如高性能数据库服务器它更偏向于直接控制I/O传送机制,此时,内核提供的页高速缓存毫无意义,甚至有害。Linux提供了绕过页高速缓存的方法,直接I/O,在应用程序中按需要实现缓存。