对于linux中读操做

关于文件的读写,实在是太过于复杂,细节太多,因此只能分析他的原理,细节牵涉太多。缓存

本文介绍文件的读操做。spa

先说一下读操做的轮廓。这个读操做是从磁盘把数据读入到内核缓冲区,数据在内核缓冲区被组织成radix_tree形式,而后在把这个缓冲区的内容拷贝到用户缓冲区,用户就能够操做本身缓冲区内的数据了。对象

具体一点就是:索引

对于每一进程打开的文件,都拥有一个文件对象描述符,从文件对象描述符中能够寻找到索引节点,从索引节点又能够找到adress_space,这个对象就是文件在内存中的缓存。所以,每个打开此文件的进程都会这个adress_space 对象进行操做。进程

对于每一个给定的文件中的索引和要读取的长度要检查。内存

用户会先从高速缓存中寻找它须要的页,若是找到此页,要检查这个页是否是最新的。所以要对此页进行互斥访问,但是在这以前有可能出现这种状况:原理

这个页也许是另外一个进程从文件中读进来的页,但并未第这个页进行IO操做。所以他认为页中数据无效,须要从磁盘读该页,但是在进行读以前,那个进程可能又要删除此页,因此此时须要进行检查该页还在不在内存中,若是不在,申请一物理页框,并标记为PG_locked ,表示锁定,不能从内存中删除此页,由于要对此页进行IO操做。如今能够开始从磁盘读内容填充此页。数据

读入此页后并无万事大吉,由于上文提到也许存在另外一个进程在操做此文件,并把它的修改内容写回都了磁盘,所以就有可能出现删减文件的几率,因此此时检查若是发现   索引+长度,超出文件,那么此页是无效的,要释放此页。di

最后才是将此页拷贝到用户态缓冲区。文件

相关文章
相关标签/搜索