关于缓冲的一些梳理(操作系统/数据库/用户进程空间)-未整理完

摘要:
操作系统负责虚拟4g的逻辑访问空间,该空间可以与外部存储器连续交换和协调。无论物理内存是否足够,操作系统总会找到协调的方法。如果数据库安装在操作系统上,最好将数据库页面大小设置为操作系统页面大小的倍数。缓冲和缓存使用系统的部分物理内存,以确保在操作期间可以直接从主内存中获取最重要和最常用的块设备数据,而无需从低速设备读取数据。2) 块缓存,以块为单位。

区分几个概念:

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是连续的吗?

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇张艾迪(创始人):第一个实习生精英团队使用Flash上传应该注意的问题。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

内存管理:01存储器层次结构

         在日常的编程中,我们简单的把存储器系统看成一个线性的字节数组,但实际的存储系统并不是这样的。          存储器系统是一个由具有不同容量,不同成本,不同访问时间的若干存储设备组成的层次结构,从上到下依次是:寄存器,高速缓存存储器,主存,硬盘,网络文件。层次越高,容量越小,成本越高,访问时间越短,高层的存储设备是底层存储设备的缓存区。...

ArcGIS切片技巧及注意事项三之高级工具应用

1 - 修改已经发布缓存服务的缓存级别 如上图所示,红箱子里有很多缓存管理的工具,这里我们要用的是里面的管理地图服务器缓存比例。 下图中,服务器输入本机,然后选择我们需要调整比例尺级别的服务,这个工具适用于我们的缓存已经发布,例如我们已经发布到500比例尺,现在我们想将缓存发布到200比例尺,这里我们追加一个200比例尺,然后在到我们服务缓存发布界面单独...

C语言精要总结-内存地址对齐与struct大小判断篇

在笔试时,经常会遇到结构体大小的问题,实际就是在考内存地址对齐。在实际开发中,如果一个结构体会在内存中高频地分配创建,那么掌握内存地址对齐规则,通过简单地自定义对齐方式,或者调整结构体成员的顺序,可以有效地减少内存使用。另外,一些不用边界对齐、可以在任何地址(包括奇数地址)引用任何数据类型的的机器,不在本文讨论范围之内。 什么是地址对齐 计算机读取或者写入...

EhCache之最简单的缓存框架

一、简介 Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他...

触屏手机3G网站设计

随着智能手机iphone和Android的热潮,衍生出基于Safari和Chrome浏览器的触屏手机网站Touch Screen Mobile Website。 触屏手机网站在中国还属于起步阶段,从行业的现状来看,其体验参差不齐,笔者将从设备、系统、浏览器、网络、四个维度来与大家共同探讨触屏手机的网站设计: 一、设备 ·分辨率与屏幕尺寸 ·触屏机的交互特点...

Windows XP 注册表修改大全

1、在〔我的电脑〕上隐藏软驱 在〔开始〕→〔运行〕→输入〔Regedit〕→〔HKEY_CURRENT_USER〕→〔Software〕 →〔Microsoft〕→〔Windows〕→〔CurrentVersion〕→〔Policies〕→〔Explorer〕 →增加一个 DWORD 值〔NoDrives〕的数值资料请使用十进制及如下设置 隐藏 A 盘为〔...