磁盘写入流程

简介:

数据从用户空间到写入计算机磁盘,一般会经过以下几个流程:1.写入用户态的内存空间 2.存储到内核内核Page页中 3.调用底层驱动写入到磁盘中。根据用户态数据写入的方式,通常有以下3种方式:buffer io、mmap和direct io,下图为三种方式的具体写入流程:
请添加图片描述

Buffered IO

数据在被写入的时候,默认使用的Buffer I/O。使用Buffer I/O的时候才在内存与磁盘中间加了一层page cache。
数据在写入的时候,数据会被先写入page cache。如果用户采用的时同步写(synchronous write),则数据会立即从page cache写回到磁盘中;如果使用的时延迟写(deferred writes),那么应用程序就完全不需要等到数据全部被写回到磁盘,数据只要被写到页缓存中就可以了,操作系统会定期将页缓存中的数据刷回到磁盘。
linux中的c库包括:POSIX库和标准IO库, POSIX库中的函数包含一组不带缓存的io(open,write,read等函数),这里的不带缓存是指,在不在用户空间创建缓存,每次读写都直接调用内核函数,写道内核的page cache中,但是依然存在从用户态到内核态的转换。而标准IO库中的一组带缓存的io函数(fopen,fread,fwrite等函数),每次调用则不直接调用内核函数,而是在用户态中创建缓存,等到一定量时才和内核交互,其中调用fflush则可以将用户态的数据刷到内核态的内存页中。

优缺点

优点:减少了磁盘的交互次数,由内核控制读取写入时机。
缺点:数据需要在用户态和内核态进行多次交互,增加了内核开销;其次若机器突然宕机,则数据可能会丢失。

MMap

MMap(Memort-map) IO 能将一个磁盘文件映射到存储空间中(用户态)的一个缓存区上,于是,当从缓存区中读取数据时,就相当于读文件中的相应字节。于此类似,将数据存入缓存区时,相应字节就自动写入文件。这样就可以不使用read和write的情况下执行I/O,因此减少了内核态到用户态,用户态到内核态的多次转换。可以调用msync将mmap的page cache刷入磁盘中。

优缺点

优点: 减少了内核态到用户态交互的开销,减少了磁盘的交互次数。
缺点:机器宕机,还没写写入磁盘的数据会丢失。

Direct IO

Linux允许应用程序在执行磁盘IO时绕过缓冲区高速缓存,从用户空间直接将数据传递到文件或磁盘设备,称为直接IO(direct IO)或者裸IO(raw IO)。

优缺点

优点:如果要传输的数据量很大,降低数据在page cache中的拷贝带来的开销,提高性能。
缺点:Direct I/O的开销大,因为没有page cache的使用,因此内核中很多对page cache的优化也无法使用(例如:按顺序预读取,在成簇磁盘块上执行IO,允许访问同一文件的多个进程共享高速缓存的缓冲区等)

缓存流程如下

请添加图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值