Linux磁盘IO流程

Linux磁盘IO流程,第1张

文件IO的分层设计

先看图:

malloc的buf对应application buffer,用户空间;

fwrite是系统提供的最上层接口,也是最常用的接纤哗口。它在用户进程空间开辟一个CLib buffer,将多次小数据量相邻写 *** 作(application buffer)先缓存起来,合并,最终调用write函数一次性写入(或者将大块数据分解多次write调用);

write函数通过调用系统调用接口,将数据从应用层copy到内核慎巧层,所以write会触发内核态/用户态切换。当数据到达page cache后,内核并不会立即把数据往下传递。而是返回用户空间。数据什么时候写入硬盘,有内核IO调度决定,所以write是一个异步调用

read调用是先检查page cache里面是否有数据,如果有,就取出来返回用户,如果没有,就同步传递宽竖键下去并等待有数据,再返回用户,所以read是一个同步过程;

fclose隐含fflush函数,fflush只负责把数据从Clibbuffer拷贝到pagecache中返回,并没有刷新到磁盘上,刷新到磁盘上可以使用fsync函数;

即便fsync仍有可能没写到磁盘上,一是磁盘有缓存,二是即便关闭缓存也可能为了跑分没有真正关闭;

** 一致性

fwrite使用用户进程私有空间,多线程必然需要做同步。write如果写大小小于PIPE_BUF,是原子 *** 作。根据已知信息,内核所做仅限于此,如果两个进程同时写文件,可能出现错乱,需要实测。

** 安全性

从前面的分层设计来看,使用fsync函数可以最大限度保障安全写入,但仍然没有绝对的安全性。

另外一张图

进程在运行过程中主要是在就绪、运行和阻塞三种状态间进行转换。创建状态和退出状态描述进程创建的过程和进程退出的过程。 1)运行状态(running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。 2)就绪状态(ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排人低优先级队列;当进程由i/o *** 作完成而进入就绪状态时,排入高优先级队列。 3)阻塞状态(blocked):当进程由于等待i/o *** 作或进程同步等条件而暂停运行时,它处于阻塞状态。 4)创建状态(new):进程正在创建过程中,还不能运行。 *** 作系统在创建状态要进行的工作包括分配和建立进程控制块表项、建立资源表格(如打开文件表)并分配资源、加载程序并建立地址空间表等。 5)退出状态(exit):进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记帐和则消将退出代码传递给父进程)。 五状态进程模型中的状态转换主要包括下列几种。 *** 作系统中多个进程的并发执行是通过调度与超时两种转换间的循环,或调度、等待事件和事件出现三种转换间的循环来描述的。 1)创建新进程:创建一个新进程,以运行一个程序。创建新进程的可能原因包括用户登录、 *** 作系统创建以提供某项服务、批处理作业等。 2)收容(admit,也称为提交):收容一个新进程,进入就绪状态。由于性能、内存等原因,系统会限制并发进程总数。 3)调度运行(dispatch):从就绪进程表中选择一个进程,进入运行状态。 4)释放(release):由于进程完成或失败而终止进程运行,进入结束状态。 为了简洁,状态变迁图中只画出了运行状态到退出状态间的释放转换;但实际上,还存在孙仔知从就绪状态或阻塞状态到退出状态的释放转换。运行到结束的转换可分为正常退出(exit)和异常退出(abort);其中异常退出是指进程执行超时、内存不够、非法指令或地址访问、i/0 *** 作失败、被其他进程所终止等原因而退出。从就绪状态或阻塞戚氏状态到结束状态的释放转换可能是由于多种原因引发,如父进程可在任何时间终止子进程。 5)超时(timeout):由于用完时间片或高优先级进程就绪等原因导致进程暂停运行 6)事件等待(event wait):进程要求的事件未出现而进入阻塞;可能的原因包括申请系统服务或资源、通信、i/o *** 作等。 7)事件出现(eventoccurs):进程等待的事件出现;如 *** 作完成、申请成功等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12264217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存