linux磁盘同步函数,Linux磁盘IO流程

概述

文件IO的分层设计

先看图:

20a9c3cfe517?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

然后看示例代码:

{

char *buf = malloc(MAX_ \nBUF_SIZE);

strncpy(buf, src, , MAX_BUF_SIZE);

fwrite(buf, MAX_BUF_SIZE, 1, fp);

fclose(fp);

}

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函数可以最大限度保障安全写入,但仍然没有绝对的安全性。

另外一张图

20a9c3cfe517?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

IO分层.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值