关于缓冲的一些梳理(操作系统/数据库/用户进程空间)-未整理完
区分几个概念:
1.内存页大小:见下面
2.文件系统块大小:设备块(扇区)的整数倍,OS将磁盘按照这个大小划分
4.数据库页大小:pagesize的整数倍,实现结构化数据的按块操作(文件系统如何实现按块操作?),另外数据库应该单独实现缓存,因为OS缓存按页或块管理
5.sector(扇区)和block(块/簇):
block是操作系统可以操作的最小单位,是对磁盘逻辑的划分,扇区的整数倍,一个文件(node)包括多个block
blocksize和pagesize大小关系:
sector是设备驱动可以访问的最小单位,磁盘每次读取一个扇区
区分页和块
同样对于大文件使用较大的块和页会获取较好的性能
说明:块的大小在文件系统创建时指定
内存页大小
操 作系统以内存页为单位管理内存,内存页的大小对系统性能有影响。内存页设得太小,内存页会很多,管理内存页的数组会比较大,耗内存,同时TLB大小是固定 的,导致TLB MISS增加。所谓TLB就是把虚拟内存页面与物理内存页面的转换结果存起来,不用每次都用MMU作转换。内存页设大了,因为一个进程拥有的内存是内存页 大小的整数倍,会导致碎片,即申请了很多内存,真正用到的只有一点。如果考虑SWAP分区(即把硬盘当内存用,在WINDOWS下应该叫虚拟内存),需要 把硬盘数据读入内存,硬盘的读性是,连续读大片数据比分多次读小数据要快,这时候应该把内存页大小设大些
在不同的应用场合,内存页的大小的最优值是不同的。所以一般的系统都支持多种内存页的取值。
就线上服务器来说,一般是只跑少数几个进程,内存大都是被某个进程所用,这时候可以把内存页设得比较大
操作系统的页大小:
对于操作系统来说, 存放文件不是以文件的大小来存放的,而是首先将内存按照一定的大小,给拆分开来,比如4K大小作为一个单元。这样做有什么好处呢?
使用了分页的机制后, 就可以使用虚拟存储的概念了。对于32位操作系统来说,每个程序来都有4G的逻辑访问空间,这4G逻辑访问空间是虚拟出来的,实际没有这么多。操作系统负 责虚拟4g的逻辑访问空间,可能和外存来不断交换协调。比如windows操作系统,在C盘下有一个叫 pagefile.sys 的文件,这个就是虚拟内存所存放在硬盘的地址。
逻辑4G分成了很多页,而实际的物理内存也分成了很多页, 它们大小是相等的。进程只管向OS要页,你给我多少页来,运行一个程序。不管物理内存够不够用, 操作系统总会想办法来协调。
数据库的页大小:
数据库的页大小和操作系统类似,是指存放数据时,每一块的大小。比如一个1M的数据存放在数据库中时, 需要大概12块页来存放。如果是在操作系统上安装的数据库,最好将数据库页大小设置为操作系统页大小的倍数,才是最佳设置。
/**************************************************************************************************************************end of part1*****************************************************************************************************************************************/
Linux运用一个功能广泛的缓冲和缓存框架来提高系统的速度。缓冲和缓存利用一部分系统物理内存,确保最重要、最常使用的块设备数据在操作时可直接从主内存获取,而 无需从低速设备读取。物理内存还用于存储从快设备读取的数据,使得随后对该数据的访问可直接在物理内存进行,而无需从外部设备再次取用。考虑系统中多种因 素然后延迟写回在总体上改进了系统的性能。前面分析的部分,例如内存管理的slab缓存是一个内存到内存的缓存,其目地不是加速对低速设备的操作,而是对 现有资源进行更简单、更高效的使用。文件系统的Dentry缓存也用于减少对低速块设备的访问,但他无法推广到通用场合,因为他是专门用于处理单一数据类 型的。
内核为块设备提供了两种通用的缓存方案:
1)页缓存,针对以页为单位的所有操作,并考虑了特定体系结构上的页长度。一个主要的例子是内存映射技术。因为其他类型的文件访问也是基于内核中的这一技术实现的。所以页缓存实际上负责了块设备的大部分缓存工作。
2)块缓存,以块为操作单位。在进行I/O操作时,存取的单位是设备的各个块,而不是整个内存页。尽管页长度对所有文件系统都是相同的,但块长度取决于特定的文件系统或其设置。因而,块缓存必须能够处理不同长度的块。
目前用于块传输的标准数据结构已经演变为structbio。用这种方式进行块传输更为高效,因为他可以合并同一请求中后续的块,加速处理的进行。在许 多场合下,页缓存和块缓存是联合使用的。例如,一个缓存的页在写操作期间可以划分为不同的缓冲区,这样可以在更细的力度下,识别出页被修改的部分。好处在 于,在将数据写回时,只需要回写被修改的部分,无需将这个页面传输回底层的块设备。
小结:
1.缓冲用于缓存常用数据,如元数据;可以对缓冲区的数据进行操作,即对文件的操作直接
在内存上进行(???应该是拷贝到用户空间去吧),我的意思是说下次可以无需访问外存
2.
3.
/**************************************************************************************************************************end of part2*****************************************************************************************************************************************/
缓存的存是内存的存,区别缓冲区
磁盘缓冲区:硬盘的缓冲区是硬盘与外部总线交 换数据的场所。硬盘的读数据的过程是将磁信号转化为电信号后,通过缓冲区一次次地填充与清空,再填充,再清空,一步步按照PCI总线的周期送出,可见,缓 冲区的作用是相当重要的。它的作用也是提高性能,但是它与缓存的不同之处在于:一、它是容量固定的硬件,而不像缓存是可以由操作系统在内存中动态分配的。 二、它对性能的影响大大超过磁盘缓存对性能的影响,因为如果没有缓冲区,就会要求每传一个字(通常是4字节)就需要读一次磁盘或写一次磁盘。它是磁盘自带的高速缓存(cache),分为写通式和回写式,
所谓写通式,就是指在读硬盘时系统先检查请求,寻找所要求的数据是否在高速缓存中。如果在则称为被命中,缓存就会发送出相应的数据,磁头也就不必再向磁盘访问数据,从而大幅度改善硬盘的性能。
所谓回写式,指的是在内存中保留写数据,当硬盘空闲时再次写入。
磁盘缓冲区大小在十几M
磁盘缓存:
缓冲
缓冲页
缓冲区
缓冲块
/**************************************************************************************************************************end of part3*****************************************************************************************************************************************/
缓冲块和缓冲页
/**************************************************************************************************************************end of part4*****************************************************************************************************************************************/
用户空间的缓冲与OS缓冲的关系
如果打开读,就只有输入缓冲区,打开写,则为输出缓冲区,如果读写则有两个缓冲区了。你不能获得这个缓冲区地址,如果要强行刷新缓冲区,需要利用函数,如fflush,缓冲区就是预先开辟的内存,你也可以自己实现,文件等到缓冲区满了再一次写入文件,或一次读入一个缓冲区数据,所有这些都是为了加快文件读写,因为文件读写是程序中最费时的操作之一!
为什么要分读缓存和写缓存:读缓存和写缓存的操作不同,写缓存需要不断刷新缓存的内容(缓存满了再写,提高效率),读缓存则是???
区分内核缓存和用户缓存:以写为例,用户缓存写满了后动作时刷新,内核缓存写满后的动作应该是申请新缓存块继续写(??)
从几个函数来考虑:
sysc fflush
Linux,unix在内核中设有 缓冲区高速缓冲或页面高速缓冲,大多数磁盘I/O都通过缓冲进行,采用延迟写技术。
sync:将所有修改过的块缓存区排入写队列,然后返回,并不等待实际写磁盘操作结束
fsync:只对有文件描述符制定的单一文件起作用,并且等待些磁盘操作结束,然后返回。
fdatasync:类似fsync,但它只影响文件的数据部分。
fsync还会同步更新文件的属性。
fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)
疑问:用户空间的读缓存和OS的缓存块和缓存页什么关系,不是有重复吗?
答:OS缓存不区分读/写???
linux的block对应的sector是连续的吗?