对于linux中读操作

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

本文介绍文件的读操作。

先说一下读操作的轮廓。这个读操作是从磁盘把数据读入到内核缓冲区,数据在内核缓冲区被组织成radix_tree形式,然后在把这个缓冲区的内容拷贝到用户缓冲区,用户就可以操作自己缓冲区内的数据了。

具体一点就是:

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

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

用户会先从高速缓存中寻找它需要的页,如果找到此页,要检查这个页是不是最新的。因此要对此页进行互斥访问,可是在这之前有可能出现这种情况:

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

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

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

你可能感兴趣的:(对于linux中读操作)