读取文件进程进程调用库函数向内核发起文件读取请求;内核通过检查进程的文件描述符定位虚拟文件系统的打开文件列表项;调用文件可用的系统调用Functionread();read()函数通过文件表项链接到目录入口模块,根据传入的文件路径在目录入口模块中查找,找到文件的inode;在inode中,通过文件内容的偏移量计算找到要读取的页;通过inode找到文件对应的address_space;访问address_space中文件的pagecache树,找到对应的pagecache节点:(1)如果pagecache命中,则直接返回文件内容;(2)如果pagecache缺失,会产生pagemissing异常,创建一个pagecachepage,同时通过inode找到该文件page的磁盘地址,并相应的页面将被读取以填充缓存页面;重新执行第6步以找到页面缓存;写文件过程的前5个步骤与读文件相同。在address_space中检查对应页的pagecache是??否存在:如果pagecache命中,则直接修改更新pagecache的page中的文件内容。写入文件结束。此时文件修改位于页面缓存中,并没有写回磁盘文件;如果pagecache缺失,会产生pagemissing异常,创建pagecachepage,通过inode找到文件page的磁盘地址,读取对应的page。页来填充缓存页。此时缓存页面命中,继续第6步。页面缓存中的页面如果被修改则标记为脏。脏页需要以文件块的形式写回磁盘。将脏页写回磁盘有两种方式:(1)手动调用sync()或fsync()系统调用将脏页写回(2)pdflush进程会定时将脏页写回磁盘,不能被替换掉记忆。如果脏页正在被写回,写回标志将被设置。此时页面会被锁定,其他的写请求会被阻塞,直到释放锁。
