读文件流程
- 过程调用库函数向内核发动读文件申请;
- 内核通过查看过程的文件描述符定位到虚构文件系统的已关上文件列表表项;
- 调用该文件可用的零碎调用函数 read();
- read() 函数通过文件表项链接到目录项模块,依据传入的文件门路,在目录项模块中检索,找到该文件的 inode;
- 在 inode 中,通过文件内容偏移量计算出要读取的页;
- 通过 inode 找到文件对应的 address_space;
- 在 address_space 中拜访该文件的页缓存树,查找对应的页缓存结点:
(1)如果页缓存命中,那么间接返回文件内容;
(2)如果页缓存缺失,那么产生一个页缺失异样,创立一个页缓存页,同时通过 inode 找到文件该页的磁盘地址,读取相应的页填充该缓存页;从新进行第 6 步查找页缓存;
写文件流程
前 5 步和读文件统一,在 address_space 中查问对应页的页缓存是否存在:
- 如果页缓存命中,间接把文件内容批改更新在页缓存的页中。写文件就完结了。这时候文件批改位于页缓存,并没有写回到磁盘文件中去;
- 如果页缓存缺失,那么产生一个页缺失异样,创立一个页缓存页,同时通过 inode 找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第 6 步。
- 一个页缓存中的页如果被批改,那么会被标记成脏页。脏页须要写回到磁盘中的文件块。有两种形式能够把脏页写回磁盘:
(1)手动调用 sync() 或者 fsync() 零碎调用把脏页写回
(2)pdflush 过程会定时把脏页写回到磁盘
- 同时留神,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其余写申请被阻塞直到锁开释。