Linux基础之文件读写流程
来源:互联网 发布:linux和unix哪个好 编辑:程序博客网 时间:2024/06/05 02:25
读文件流程
- 进程调用库函数向内核发起读文件请求;
- 内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;
- 调用该文件可用的系统调用函数read();
- read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
- 在inode中,通过文件内容偏移量计算出要读取的页;
- 通过inode找到文件对应的address_space;
- 在address_space中访问该文件的页缓存树,查找对应的页缓存结点:如果页缓存命中,那么直接返回文件内容;如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;
- 文件内容读取成功;
写文件流程
前5步和读文件一致
6. 在address_space中查询对应页的页缓存是否存在:
如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去;
如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步。
7. 一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:
1) 手动调用sync()或者fsync()系统调用把脏页写回;
2) pdflush进程会定时把脏页写回到磁盘;
注意: 脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。
读写文件特点
- 发生了系统调用,需要从用户态切换到内核态;
- 发生了两次数据拷贝:数据先从磁盘拷贝到页缓存,在从页缓存拷贝到用户主存;
阅读全文
0 0
- Linux基础之文件读写流程
- linux文件读写的流程
- linux基础之文件锁,读写锁相关
- iOS基础之文件读写
- linux学习之读写文件
- Linux之文件读写过程
- Linux基础之启动流程
- Java语言基础之文件读写
- java基础学习之文件读写
- JavaIO流基础之文件读写
- 文件读写流程
- HDFS文件读写流程
- HDFS读写文件流程
- HDFS读写文件流程
- HDFS文件读写流程
- Linux文件系统之文件的读写
- Linux文件系统之文件的读写
- Linux文件系统之文件的读写
- JavaMail发送邮件api实例
- Turtlebot3入门手册之二:硬件
- java 发起HTTPS请求-SSL客户端
- MySQL学习笔记一(数据库及表的操作)
- Object.prototype.toString.call()方法浅谈
- Linux基础之文件读写流程
- MySQL存储过程中使用动态行转列
- C语言实现顺序链表
- 凸包问题的五种解法
- gradient descent 的python实现
- vmware虚拟机安装centos步骤,最好用的步骤
- spring+shiro
- lintcode二叉树的最大深度
- [LeetCode]35. Search Insert Position