暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
一个IO的传奇一生.pdf
62
52页
1次
2024-12-25
5墨值下载
/
waston
关注 对话
TA的最新馆藏 (共528篇)
喜欢该文的人也喜欢
更多
ins儿童房卡通原…
¥33
ins儿
蛋黄酥雪媚娘海…
¥14.99
蛋黄酥雪
ZYNQ开发基本流程
对付腰椎问题的“眼镜蛇”和“上…
[转] 【康复课堂】图解20个拉伸动作
[转]
【案例分享】胸椎曲度变直到底坑…
傻瓜也能懂的卡尔曼滤波器(翻译…
EDID解析
如果孩子可以选择父母,可能你根…
2020部编版一年级下册语文电子课…
搜书籍、搜电影、搜素材···最全的…
明·张居正《驭人经》原文·译文
越是自卑的男人,这些特征越明显…
85个实体店裂变营销案例,总有一…
鱼山饭宽:做无用之事,过有趣人生
清新脱俗,淡雅亮丽,好美的水墨画
抗日战争中被誉为东方斯大林格勒…
分享
更多
前几天同事提议写一篇文章来仔细分析一下一个IO从创建到消亡的整个过程,我觉得这个想法
很好,一个IO从创建到消亡经历了千山万水,从软件到硬件涉及到很多很多的技术。一个看似
简单的IO读写操作,其实汇集了从计算机软件技术、硬件技术、电子技术、信号处理等各个方
面的内容。所以,我想把IO的一生通过自己的认识把他描述一下,让世人看清在执行一个简单
IO操作究竟汇集了多少的智慧!汇集了工程师、科学家多少的心血!在此,将此系列文章定
名为《一个IO的传奇一生》,与大家一起分享。
针对不同的操作系统,IO历程是有所差别的,但是很多基本思想是相同的。在此,我想以
Linux操作系统为样本,对整个IO历程进行深入分析,最主要的是设计思想方面的考虑。
上图描述了IO操作中所涉及到的软硬件模块,从这张图中我们可以一窥整个系统还是很庞大
的,主要涉及了文件系统、块设备层、SCSI层、PCI层、SAS/Ethernet网络以及磁盘/U盘。本文
会根据作者的理解对IO在上述各个层次的游历过程进行详细阐述。
转藏到我的图书馆
2019-03-05 waston 阅 249 转 2
留言交流
我的图书馆
/
自己搭建服务器
打金传奇
运维管理系统
传奇 1.80
网上找客户
电子印章
电子印章软件
ERP管理系统
关闭
关闭
分享
更多
如果你想保存你的Word资料至本地硬盘,你就会触发一个文件系统写操作。如果你想将一个
文件从本地电脑拷贝到U盘时,你会触发一次文件系统的读写过程。大家知道,为了简化用户
对文件的管理,操作系统提供了文件系统对数据资料进行了管理,文件系统是操作系统最为重
要的组成部分。一旦你想往文件系统写入数据时,一个新的IO请求就会在用户态诞生,但是,
其绝大部分的人生旅程都会在内核空间。对于不同的应用类型,IO请求的属性会大相径庭。除
了文件本身应该具备的基本属性(读写权限等)之外,我们还需要考虑文件的访问模式:异步
IO还是同步IO?对文件系统的Cache是如何控制的?应用程序和内核程序之间是如何交互的?
所以,在创建一个IO时,我们需要考虑很多这样的因素。
我们知道,当我们需要进行文件操作的时候,5API函数是必不可少的。CreateOpen
CloseWriteRead函数实现了对文件的所有操作。Create函数用来打开一个文件,如果该文
件不存在,那么需要在磁盘上创建该文件。Open函数用于打开一个指定的文件。如果在Open
函数中指定O_CREATE标记,那么Open函数同样可以实现Create函数的功能。Close函数用于释
放文件句柄。WriteRead函数用于实现文件的读写过程。举个例子,如果用户需要对一个文
件进行写操作,那么首先调用Open函数打开想要操作的文件,函数完成之后获取所要操作文
件的句柄;然后调用Write函数将数据写入文件;最后采用Close函数释放文件句柄,结束文件
写入过程。上述过程大家应该都非常的熟悉,在上述过程中,整个系统到底发生了哪些操作
呢?
众所周知,用户态的API函数通过系统调用陷入内核。对于Open函数对应了sys_open函数例
程。该函数的主要职责是查找指定文件的inode,然后在内核中生成对应的文件对象。在Linux
中,Sys_open函数调用do_sys_open完成具体功能。在do_sys_open中通过do_filp_open函数完成
文件名解析、inode对象查找,然后创建file对象,最后执行特定文件对应的file->open函数。
Do_filp_open过程中的核心处理函数是link_path_walk。该函数完成了基本的文件路径的解析功
能,是名字字符串解析处理实现的核心。该函数的实现基于分级解析处理的思想。例如,当需
要解析“/dev/mapper/map0”字符串时,其首先需要判断从何处开始解析,根目录还是当前
目录?这个例子是从根目录开始解析的,那么首先获取根目录的dentry对象并开始分析后继字
符串。处理过程是以'/’字符为界按序提取字符串。根据规则,首先我们可以提取“dev”字
符串,并且计算该字符串的Hash值,通过该Hash值查找dentry下的inode Hash表,就可以很快
的找到/dev/目录下的inode对象。Hash值的计算是比较简单的,把所有字符对应的值累加起来
就可以得到一个Hash值。根据规则,依此类推,最后解析得到”/dev/mapper/”目录的inode对象
以及文件名字符串“map0”。到这一步为止,link_path_walk函数的使命完成,最后可以通过
do_last函数获取或者创建文件inode。如果用户态程序设置了O_CREATE标记,那么系统如果找
不到用户指定的inodedo_last会创建一个新的文件inode,并且把这些信息以元数据的形式写
入磁盘。当指定文件的inode找到之后,另一件很重要的事情就是初始化file文件对象。初始化
文件对象通过__dentry_open函数来实现。文件对象通过inode参数进行初始化,并且把inode
操作方法函数集告诉给file对象。一旦file对象初始化成功之后,调用文件对象的open函数执行
进一步的初始化工作。
通过上述分析,整个过程看似比较复杂,涉及到dentryinode以及file对象。其实这个模型还
是很简单的。Dentry用来描述文件目录,在磁盘上会采用元数据的方式存储在一个block中,文
件目录本身在Linux中也是一个文件。Inode描述一个具体的文件,也通过元数据的方式在磁盘
上保存。如果对一个文件系统从根目录开始往下看,整个文件系统是一颗庞大的inode树:
of 52
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜