Linux 缓冲区

本文介绍了标准I/O的三种缓冲类型,包括全缓冲、行缓冲和不带缓冲。还阐述了buffer缓冲区的作用,对比了Buffer和Cache,分析了buffer cache和page cache的区别及特点,重点介绍了page cache的结构和工作原理,如通过inode、address_space等定位文件位置。

标准I/O提供了三种类型的缓冲:

1、全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作。常规文件(如普通文本文件)通常是全缓冲的。

2、行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。标准输入和标准输出对应终端设备(如屏幕)时通常是行缓冲的。当在输入和输出中遇到换行符时,标准I/O库执行I/O操作,也可以通过人为刷新缓冲区,即fflush(stdout),执行I/O操作。

3、不带缓冲:用户程序每次调库函数做写操作都要通过系统调用写回内核(如系统调用函数)。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。

 

buffer缓冲区:

buffer(块设备读写缓冲区)是一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。一方面,通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。另一方面,可以保护硬盘或减少网络传输的次数。

分析:

1、通常在写一个非常大的文件,文件会被分成一个个的小 block块-->一直往内存上写-->然后再写入磁盘, 这个文件非常的大,但是会被分成一个个小的block块,每次都一点一点的-->写入内存-->再写入磁盘,  这样的效率较慢 。

2、这种情况下,内存会攒足一次大的block块-->再写入磁盘,减少延迟。

 

Buffer和Cache:

cache是高速缓冲,用于CPU和内存之间的缓冲,buffer是I/O缓冲,用于内存和硬盘之间的缓冲。简单的说,cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据。

 

buffer cache和page cache

buffer cache和page cache都是为了处理设备和内存交互时高速访问的问题。buffer cache可称为块缓冲器,page cache可称为页缓冲器,在linux采用虚拟内存的机制来管理内存后,页是虚拟内存管理的最小单位,开始采用页缓冲的机制来缓冲内存。页缓存page cache面向的是虚拟内存,块I/O缓存Buffer cache是面向块设备。页缓存和块缓存对进程来说就是一个存储系统,进程不需要关注底层的设备的读写。

buffer cache和page cache两者最大的区别是缓存的粒度。buffer cache面向的是文件系统的块。而内核的内存管理组件采用了比文件系统的块更高级别的抽象:页page,其处理的性能更高。因此和内存管理交互的缓存组件,都使用页缓存。

 

page cache:

页缓存是面向文件、面向内存的。通俗的将,它位于内存和文件之间缓冲区,文件IO操作实际上只和page cache交互,不直接和内存交互。page cache可以用在所有以文件为单元的场景中。page cache通过一系列的数据结构,比如inode, address_space, struct page,实现将一个文件映射到页的级别:

1、struct page结构标志一个物理内存页,通过page + offset就可以将此页帧定位到一个文件中的具体位置。同时struct page还有以下重要参数:

(1)标志位flags来记录该页是否是脏页,是否正在被写回等等;

(2)mapping指向了地址空间address_space,表示这个页是一个页缓存中页,和一个文件的地址空间对应;

(3)index记录这个页在文件中的页偏移量;

2、文件系统的inode实际维护了这个文件所有的块block的块号,通过对文件偏移量offset取模可以很快定位到这个偏移量所在的文件系统的块号,磁盘的扇区号。同样,通过对文件偏移量offset进行取模可以计算出偏移量所在的页的偏移量。

3、page cache缓存组件抽象了地址空间address_space这个概念来作为文件系统和页缓存的中间桥梁。地址空间address_space通过指针可以方便的获取文件inode和struct page的信息,所以可以很方便地定位到一个文件的offset在各个组件中的位置,即通过:文件字节偏移量 --> 页偏移量 --> 文件系统块号 block  -->  磁盘扇区号

4、页缓存实际上就是采用了一个基数树结构将一个文件的内容组织起来存放在物理内存struct page中。一个文件inode对应一个地址空间address_space。而一个address_space对应一个页缓存基数树。它们之间的关系如下:

          

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值