网站首页 > 开源技术 正文
文件读写是计算机系统中非常重要的一个功能,读写过程是一个程序、操作系统、硬盘紧密协作的过程,涉及程序、缓存、文件系统、驱动、硬盘控制器、硬盘等多个方面,如图1所示,下面我们将分别从程序层、操作系统层、硬盘控制器层详细阐述三个文件IO过程。
程序层I/O过程
程序是计算机的一组指令,经过编译和执行才能最终完成程序设计的动作,像TortoiseSVN这样的程序通常是由高级编程语言(如C/C++)编写而成,所以在程序层我们以函数调用的过程来详述其IO过程。
操作系统为了安全通常将分为用户态和内核态操作,程序层处于用户态,下面以C++写过程为例,如图2用户空间部分所示:
- 当我们编辑完文件进行保存时,调用C++标准库中的输出流isotream进行输出。在输入输出流中为了更高效的处理IO,通常会使用缓冲区,缓冲区是作为IO中介的内存块,用于协调输入输出两端的速度。程序在调用输出后通常会将文件信息写入输出流的缓冲区中。
- 当缓冲区满或程序主动调用了清空缓冲的操作时,就会调用操作系统的写操作,将指令和数据发送给操作系统进行输出操作。
操作系统层I/O过程
程序调用函数库时依然是在用户态,当调用操作系统的输出操作后就会从用户态转换到内核态,该过程就是系统调用过程。下面为Linux为例详述操作系统的操作。现代操作系统进行文件IO的操作主要由文件系统完成:
- Linux遵循一切皆文件的原则,会将机器中所有硬件设备全部通过驱动、各位文件系统及VFS虚拟为文件,其实现的核心就是虚拟文件系统(Virtual File System,VFS)。VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。一个Linux机器上可以挂载多种文件系统,但统一呈现为一个统一一致的操作接口。调用操作系统的输出操作实质就是对VFS调用输出操作,VFS会根据调用类型转换为调用不同的文件系统的输出操作,如文件IO对应ext3或ext4等文件系统IO。
- 通常像ext3、ext4这样的文件系统也有自身的缓存机制,以匹配高速的程序处理过程和缓慢的硬盘读写过程。当文件信息写入文件系统的缓冲区后,内核有pdflush线程在不停地检测脏页,判断是否要写回到磁盘中。把需要写回的页提交到IO队列——即IO调度队列。由IO调度队列调度策略调度何时写回。当然也可以由程序主动调用强制刷新操作来完成缓冲区写入硬盘的操作。
- 提到IO调度队列,不得不提一下磁盘结构磁头和电梯一样,尽量走到头再回来,避免来回抢占是跑,磁盘也是单向旋转,不会反复逆时针顺时针转的。IO队列有2个主要任务。一是合并相邻扇区的,二是排序。合并相信很容易理解,排序就是尽量按照磁盘选择方向和磁头前进方向排序。内核中有多种IO调度算法。当硬盘是SSD时候,没有什么磁道磁头,是随机读写的,加上这些调度算法反而画蛇添足。一般使用noop调度算法。
- 从IO队列出来后,就到了驱动层,驱动层通过DMA,将数据写入磁盘cache。至于磁盘cache什么时候写入磁盘介质,那是磁盘控制器的事情。
硬盘I/O过程
硬盘控制器简介
硬盘控制器即磁盘驱动器适配器。是计算机与磁盘驱动器的接口设备。它接收并解释计算机来的命令,向磁盘驱动器发出各种控制信号。检测磁盘驱动器状态,按照规定的磁盘数据格式,把数据写入磁盘和从磁盘读出数据。磁盘控制器类型很多,但它的基本组成和工作原理大体上是相同的,它主要由与计算机系统总线相连的控制逻辑电路,微处理器,完成读出数据分离和写入数据补偿的读写数据解码和编码电路,数据检错和纠错电路,根据计算机发来的命令对数据传递,串并转换以及格式化等进行控制的逻辑电路,存放磁盘基本输入输出程序的只读存储器和用以数据交换的缓冲区等部分组成。
磁盘控制器工作过程
磁盘控制器,顾名思义,是磁盘的控制设备。操作系统只需要关注磁盘控制器的类型和工作模式,不需要关注硬盘的信息,磁盘控制器在两者之间进行连接。驱动程序是硬件与系统之间的桥梁,系统通过驱动程序控制和管理硬件,并通过驱动程序发挥出硬件的最佳能力。而磁盘控制器驱动程序是系统与磁盘控制器之间的桥梁,系统通过磁盘控制器驱动管理磁盘控制器,又通过磁盘控制器管理磁盘。系统只要能够通过驱动操作磁盘控制器,那么对硬盘的管理完全由磁盘控制器承担。
现代的磁盘控制器和硬盘都内置固件(Firmware)进行,以实现复杂的驱动能力和连接。操作系统发出的操作和数据通过磁盘控制器驱动转化为磁盘控制器的操作和数据,磁盘控制器再根据指令发生硬盘操作指令并完成数据读写。
猜你喜欢
- 2025-05-08 基本Spring Cloud的微服务架构搭建及应用(一)
- 2025-05-08 代码质量扫描工具SonarQube原理及环境搭建
- 2025-05-08 小心!你的这些习惯和粗心,可能正在泄露信息!丨提示
- 2025-05-08 一步步搭建openwrt编译环境并编译ddserver源码
- 2025-05-08 远程办公、巡逻机器人、口罩识别……离不开一群“研发技术宅”
- 2025-05-08 树莓派可以DIY有趣的小制作(自己做树莓派)
- 2025-05-08 Git使用指南 | 教你轻松学会Git(git用法教程)
- 2025-05-08 UE5官方推荐!大型项目版本控制用Perforce还是SVN?
- 2025-05-08 戴尔服务器T410三块硬盘RAID5数据恢复成功案例
- 2025-05-08 为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
你 发表评论:
欢迎- 05-08Peking Opera Featuring National Treasure Min Fanglei Premiers in Changsha
- 05-08安卓版Opera Mini浏览器更新,增强大屏设备支持
- 05-08Opera 36.0开发者版本发布:个性化新闻+简化菜单
- 05-08Vitas发布20周年专辑《OPERA20》首支单曲
- 05-08Android 版 Opera 89 带来了大量标签页改进
- 05-08基本Spring Cloud的微服务架构搭建及应用(一)
- 05-08代码质量扫描工具SonarQube原理及环境搭建
- 05-08小心!你的这些习惯和粗心,可能正在泄露信息!丨提示
- 最近发表
-
- Peking Opera Featuring National Treasure Min Fanglei Premiers in Changsha
- 安卓版Opera Mini浏览器更新,增强大屏设备支持
- Opera 36.0开发者版本发布:个性化新闻+简化菜单
- Vitas发布20周年专辑《OPERA20》首支单曲
- Android 版 Opera 89 带来了大量标签页改进
- 基本Spring Cloud的微服务架构搭建及应用(一)
- 代码质量扫描工具SonarQube原理及环境搭建
- 小心!你的这些习惯和粗心,可能正在泄露信息!丨提示
- 一步步搭建openwrt编译环境并编译ddserver源码
- 远程办公、巡逻机器人、口罩识别……离不开一群“研发技术宅”
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)