本章将介绍write()系统调用的过程。和第二章read()一样我们将从file_operations.write()开始。

1. write():从file operation到page cache

file_operations.write()的核心函数是generic_perform_write()。

大部分文件系统的file_operations.write()最后都会调用generic_perform-write()这个通用的函数。generic_perform-write()的实现方法体现了Linux文件系统write()的典型流程。

这个函数的流程如下图:


从上图可以看到以下几个要点:

  • Write是一个一个Page Write的
  • 大部分实质性的工作都是在aops.write_begin()和aops.write_end()里做的。

struct address_space_operations ext2_aops = {

........
             .write_begin            = ext2_write_begin,
             .write_end              = ext2_write_end,
            }

  • write_begin()之后page就ready了,用户的数据就可以copy到page中了。

write_begin()的作用主要是:找到(创建)page->找到(创建)bh->map buffer。流程如下图所示:

2. write():从page cache到writeback queue

用户的数据已经写到page cache中去了, 将page cache真正写到block device的过程比read()复杂,因为当中有writeback的机制。整个writeback机制将在下一章做详细介绍。这里只介绍page cache是怎样交给writeback queue的,这个过程就是在aops.write_end()里完成的。要写的page加到了writeback queue后将有writeback thread将其真正写到block device上。

下图是大部分aops.write_end()使用的典型函数generic_write_end()的流程,这个流程的调用层次比较深,大致可分为三个层次:generic_write_end() -> __block_commit_write() ->__mark_inode_dirty()。下面也是分三张图来说明他们的流程和作用。

2.1 顶层write_end的典型函数:generic_write_end()


2.2 generic_write_end()主要调用了__block_commit_write()

2.3 将dirty inode放到writeback queue的关键动作在__mark_inode_diry()里

read()/write()的生命旅程之三——第三章:write()相关推荐

  1. 生命旅程中何生命个体

    佛家云:"苦海无边,回头是岸."放弃对功名利禄的追逐,你随遇而安得到的将会是宁静与淡泊:放弃对金钱无止的掠夺,你安常处顺得到的将会是安心与快乐:放弃掌声鲜花的陶醉幸福,你激流勇退得 ...

  2. Kaldi单步完美运行AIShell v1 S5之三:三音tri1,tri2,tri3,tri4,tri5

    Kaldi单步完美运行AIShell v1 S5之三:三音tri1 2 3 4 5 致谢 机器配置 Kaldi下AIShell v1详细输出之三:三音triphone 第五部分:三音结果更新 第六部分 ...

  3. 基于全生命周期的主数据管理:MDM详解与实战学习03 第三章 主数据管理的关键技术

    第三章 主数据管理的关键技术 3.1 数据标准 3.1.1 数据标准的分类 3.1.2 物资类数据标准 1.国际标准 2.国内标准 3.1.3 产品数据标准 3.1.4 财务数据标准 3.2 信息分类 ...

  4. 从“二分之一加二分之三等于三”说起………

    从1/2+3/2=3说起---- 老师在课堂上无情的嘲弄了一个二分之一加二分之三等于三的同学,差把他说成民族败类了-- 对此,我感到不解,难道算错一道题就这么不可原谅吗? 还有,二分之一加二分之三等于 ...

  5. 高红梅:第三章 海明威社会身份的定位 第一节 文学梦与作家身份的认同

    第三章  海明威社会身份的定位 海明威一生都在世界各地旅行,其足迹遍及欧洲.非洲.美洲和亚洲,有世界公民的美誉.正如学者卡洛斯·贝克(Baker ,Carlos)所言,"早在他五十五岁荣获诺 ...

  6. 试读angular源码第三章:初始化zone

    直接看人话总结 前言 承接上一章 项目地址 文章地址 angular 版本:8.0.0-rc.4 欢迎看看我的类angular框架 文章列表 试读angular源码第一章:开场与platformBro ...

  7. “JavaScript patterns”中译本 - 《JavaScript 模式》第三章

    第三章 直接量和构造函数 JavaScript中的直接量模式更加简洁.富有表现力,且在定义对象时不容易出错.本章将对直接量展开讨论,包括对象.数组和正则表达式直接量,以及为什么要使用等价的内置构造器函 ...

  8. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  9. 第二、三章:信息系统项目管理基础与立项管理-章节真题

    一.单选题 1.( )不是项目目标特性. A.多目标性 B.优先性 C.独特性 D.层次性 2.某公司的组织结构如下图所示,( )不属于该组织结构类型的缺点 A.部门之间横向联系较少,不利于沟通.技术 ...

  10. mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

    执行计划中牢记几句话: -- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描 -- 尽可能少的使用like关键字进行模糊查询 -- 建立适当的索引可以提高查询效率 十三. ...

最新文章

  1. Redis设计与实现
  2. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)
  3. vb6实现union数据结构_数据结构与算法——并查集(不相交集合)
  4. 引用变量和指针变量初探
  5. windows 下终止指定端口的进程
  6. oracle光标位置无效,解决在Form表单中光标移动不了问题
  7. 信号的采样与恢复matlab实验报告,实验七 连续信号的采样与恢复
  8. ios学习笔记——RunTime
  9. postgresql查看死锁及解决方法
  10. windows下解决弹窗广告
  11. 从财报看纳德拉上任两年:云服务是最大的突破
  12. uniapp开发FFmpeg安卓原生短视频插件支持裁剪、添加背景音乐、压缩视频、视频播放器、拍照、录屏
  13. 微麦投影仪android遥控器,投影仪遥控器如何使用 投影仪遥控器使用方法【详解】...
  14. ubuntu系统 有线网络无法通过网页认证上网
  15. HRBUST 1849 商品中心
  16. 异常检测---离群点
  17. iOS 使用HMAC
  18. Mac系统如何查看更新R版本
  19. 国内电子商务从业人员需要具备哪些知识?
  20. AudioPlayer-简易音频播放器

热门文章

  1. Windows Performance Monitor 学习笔记
  2. BZOJ1861:[ZJOI2006]书架——题解
  3. Lucene.Net中 FSDirectory存储方式下一个 Document是如何得到的
  4. ACL2016最佳论文:通过交互学习语言游戏
  5. mui ajax请求 登录
  6. cacti的安装与配置(一)安装
  7. C#笔记30:Trace、Debug和TraceSource的使用以及日志设计
  8. 在下层捕获上层抛出的异常
  9. PythonServer
  10. PMP学习笔记之四 第三章 单个项目管理过程