广州linux系统IO读写过程及IO出错的处理培训

    2023-06-30发布, 次浏览 收藏 置顶 举报
  • 授课时间:

    业余时间,全天班

  • 授课对象:

    想学嵌入式的学员

  • 网报价格:电询    课程原价:电询
  • 咨询热线:400-998-6158
  • 授课地址:广州海珠区
  • 课程详情

  • 机构简介
  • 地图信息
  • 预约试听
linux系统IO读写过程及IO出错的处理培训
培训大纲:
班级规模及环境
为了增加培训效果,增加互动环节,我们坚持小班授课,每期报名人数限3到5人,多余人员安排到下一期进行。
上课时间和地点
上课
◆外地学员:代理安排食宿(需提前预定)
☆注重质量 ☆边讲边练
☆合格学员免费推荐工作
★实验设备请点击这儿查看★
质量bao障
1、培训过程中,如有部分内容理解不透或消化不好,可免费在以后培训班中重听;
2、培训结束后,培训老师留给学员手机和Email,免费提供半年的技术支持,充分增加培训后出效果;
3、培训合格学员可享受免费推荐工作机会。 ☆合格学员免费颁发相关工程师等资格证书,提升您的职业资质。专注高端培训13年,曙海提供的证书得到本行业的广泛认可,学员的能力得到大家的认同,受到用人单位的广泛赞誉

如果您想学习本课程,请预约报名
如果没找到合适的课程或有特殊培训需求,请订制培训
培训特点:
针对实际需求,顾问式咨询,互动式授课,案例教学,小班授课,实际项目演示
IBM,oracle,微软,vmware等大型公司*工程师,项目经理,技术支持行家
大多名牌大学,硕士以上学历,相关技术专业,理论素养丰富
多年实际项目经历,大型项目实战案例,热情,乐于技术分享。
针对客户实际需求,案例教学,互动式沟通,学有所获
程序的终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折中的方案来增加这些。让我们来看一个常用的写文件典型example,也是路径长的IO。


{
char *buf = malloc(MAX_BUF_SIZE);


strncpy(buf, src, , MAX_BUF_SIZE);


fwrite(buf, MAX_BUF_SIZE, 1, fp);

这里malloc的buf对于图层中的application buffer,即应用程序的buffer;调用fwrite后,把数据从application buffer 拷贝到了 CLib buffer,即C库标准IObuffer。fwrite返回后,数据还在CLib buffer,如果这时候进程core掉。这些数据会丢失。没有写到磁盘介质上。当调用fclose的时候,fclose调用会把这些数据刷新到磁盘介质上。除了fclose方法外,还有一个主动刷新操作fflush函数,fflush函数只是把数据从CLib buffer 拷贝到page cache 中,并没有刷新到磁盘上,从page cache刷新到磁盘上可以通过调用fsync函数完成。


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


Write函数通过调用系统调用接口,将数据从应用层copy到内核层,所以write会触发内核态/用户态切换。当数据到达page cache后,内核并不会立即把数据往下传递。而是返回用户空间。数据什么时候写入硬盘,有内核IO调度决定,所以write是一个异步调用。这一点和read不同,read调用是先检查page cache里面是否有数据,如果有,就取出来返回用户,如果没有,就同步传递下去并等待有数据,再返回用户,所以read是一个同步过程。当然你也可以把write的异步过程改成同步过程,就是在open文件的时候带上O_SYNC标记。


数据到了page cache后,内核有pdflush线程在不停的检测脏页,判断是否要写回到磁盘中。把需要写回的页提交到IO队列——即IO调度队列。IO调度队列调度策略调度何时写回。


IO队列有2个主要任务。一是合并相邻扇区的,而是排序。合并相信很容易理解,排序就是尽量按照磁盘选择方向和磁头前进方向排序。因为磁头寻道时间是和昂贵的。


这里IO队列和我们常用的分析工具IOStat关系密切。IOStat中rrqm/s wrqm/s表示读写合并个数。avgqu-sz表示平均队列长度。


内核中有多种IO调度算法。当硬盘是SSD时候,没有什么磁道磁头,人家是随机读写的,加上这些调度算法反而画蛇添足。OK,刚好有个调度算法叫noop调度算法,就是什么都不错(合并是做了)。刚好可以用来配置SSD硬盘的系统。


从IO队列出来后,就到了驱动层(当然内核中有更多的细分层,这里忽略掉),驱动层通过DMA,将数据写入磁盘cache。


至于磁盘cache时候写入磁盘介质,那是磁盘控制器自己的事情。如果想要睡个安慰觉,确认要写到磁盘介质上。就调用fsync函数吧。可以确定写到磁盘上了。


Ps:


O_DIRECT 和 RAW设备根本的区别是O_DIRECT是基于文件系统的,也就是在应用层来看,其操作对象是文件句柄,内核和文件层来看,其操作是基于inode和数据块,这些概念都是和ext2/3的文件系统相关,写到磁盘上终是ext3文件。


而RAW设备写是没有文件系统概念,操作的是扇区号,操作对象是扇区,写出来的东西不一定是ext3文件(如果按照ext3规则写就是ext3文件)。


一般基于O_DIRECT来设计优化自己的文件模块,是不满系统的cache和调度策略,自己在应用层实现这些,来制定自己特有的业务特色文件读写。但是写出来的东西是ext3文件,该磁盘卸下来,mount到其他任何Linux系统上,都可以查看。


而基于RAW设备的设计系统,一般是不满现有ext3的诸多缺陷,设计自己的文件系统。自己设计文件布局和索引方式。举个**例子:把整个磁盘做一个文件来写,不要索引。这样没有inode限制,没有文件大小限制,磁盘有多大,文件就能多大。这样的磁盘卸下来,mount到其他linux系统上,是无法识别其数据的。


两者都要通过驱动层读写;在系统引导启动,还处于实模式的时候,可以通过bios接口读写raw设备

更多培训课程,学习资讯,课程优惠等学校信息,请进入 广州海珠区嵌入式培训广州白云区单片机培训 网站详细了解,免费咨询电话:400-998-6158

预约试听
  • 姓名: *
  • 性别:
  • 手机号码: *
  • QQ:
  • 微信:
  • 其它说明:
  • 验证码: *  看不清,请点击刷新
相关课程