码迷,mamicode.com
首页 > 系统相关 > 详细

对于linux中读操作

时间:2015-08-09 22:45:50      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

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

本文介绍文件的读操作。

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

具体一点就是:

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

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

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

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

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

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

对于linux中读操作

标签:

原文地址:http://my.oschina.net/u/1375613/blog/489837

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!