0、整体来说,Linux 文件缓冲区分为page cache和buffer cache,每一个 page cache 包含若干 buffer cache。
》 内存管理系统和 VFS 只与 page cache 交互,内存管理系统负责维护每项 page cache 的分配和回收,同时在使用“内存映射”方式访问时负责建立映射。
》 VFS 负责 page cache 与用户空间的数据交换。
》 而具体文件系统则一般只与 buffer cache 交互,它们负责在存储设备和 buffer cache 之间交换数据,具体的文件系统直接 *** 作的就是disk部分,而具体的怎么被包装被用户使用是VFS的责任(VFS将buffer cache包装成page给用户)。
》 每一个page有N个buffer cache,struct buffer_head结构体中一个字段b_this_page就是将一个page中的buffer cache连接起来的结构
看一下这个结构:/include/linux/mm.h,对于struct buffer_head下面再看。
看到下面167行代码就懂
一个缓冲头结构中标志了对应缓冲块的相关性质,采用缓冲头结构组来对整个缓冲区的缓冲块进行管理, *** 作方便。在缓冲区中,低端存储区存放的是对应缓冲头结构,高端区对应的是缓冲区数据结构,这是在进行缓冲区初始化过程中,初始化程序从整个缓冲区的两端开始,分别同时设置缓冲区头结构和对应的缓冲区。即第一个缓冲区头结构所对应的是最后一个缓冲数据块,如此递推下去。(缓冲块是1024个字节的块)缓冲头结构的结构分析:
设备号、块号、状态(含有当前缓冲区状态)以及其他一些算法所需要的数据。
高速缓冲块采用hash表和包含所有缓冲区块的链表来进行管理 *** 作。
1块缓冲区即1024个字节,低端(对应各缓冲块的缓冲头结构)分别建立起对应各缓冲块的缓冲头结构buffer_head,这些缓冲头连接成链表,从而对整个缓冲区进行 *** 控。
下面这个是linux0.11内核中所定义的缓冲区头结构:
struct buffer_header{
char *b_data
unsigned short b_dev
unsigned char b_uptodate
unsigned char b_dirt
unsigned chart b_count
unsigned char b_lock
struct task_struct * b_wait
struct buffer_head *b_prev
struct buffer_head *b_next
struct buffer_head *b_prev_free
struct buffer_head *b_next_free
}
(我们所研究的缓冲区是磁盘块在主存中的拷贝,一个缓冲区的数据与文件系统上一个逻辑磁盘块中的数据想对应,并且内核是通过考察缓冲区头部中的标识字符来识别缓冲区内容的。缓冲区的内容并不是永久存在的,而是每隔一定时间间断就会发生更新的区域。)
b_block锁定标志,表示驱动程序正在对该缓冲区内容进行 *** 作,此时该缓冲区不能被第二者访问。这里可以发现,对缓冲区的直接 *** 作是驱动程序,而不是应用程序,应用程序通过调用系统调用来对缓冲区进行相应的 *** 作。
思考:向缓冲块中写数据的写 *** 作不由CPU控制,CPU起到 的只是控制管理功能而已。而缓冲块中写数据写 *** 作则是由硬件来完成,如何为完成???
b_count缓冲buffer使用之计数值,表示相应缓冲块正被各个进程使用的次数,主要用于对缓冲块的程序引用计数管理,所谓空闲块指b_count=0的块。
b_update是数据更新标志,说明缓冲块中数据是否有效。b_dirt和b_update标志的应用是很重要的,同时一很容易弄混淆,b_dirt所起到的作用是当缓冲区中的数据被改变时,相应的b_dir被赋值为1,表明此时缓冲区中的数据与磁盘块中的数据是不同的,这就意味着磁盘中的数据需要重新写,即更新,所使用的是延迟写。而b_update说明缓冲块中的数据是否有效。当我们将释放块时,这两个值被赋为0,表明该缓冲区中的数据无效,这里的释放块指的是将缓冲区的数据进行了释放更新,缓冲区中的数据已经不再被当前进程使用,而磁盘中的数据并没有丢失,只是缓冲区中的数据丢失了而已。当b_dir比指明为1时,用通俗的话说这个块脏了,需要将其中的内容写入磁盘块中,但是此时还没有将其放入到磁盘中,所以数据是无效的。只有当数据被写入到磁盘设备或者是从块设备中读入缓冲块时,数据才是变为有效的。
接下来,来看看缓冲头结构buffer_head结构中字段类型为buffer_head的几个字段的用法,下面这个函数是从linux0.11内核代码中摘录下来的,主要是使用了buffer_head这几个字段来进行 *** 作,很容易理解:
函数的功能是:将缓冲块插入空闲链表尾部,同时放入hash队列中。
static inline void insert_info_queues(struct buffer_head * bh)
{
bh->b_next_free=free_list//将bh指向的下一个节点指定为free_list,即空闲表的头指针;
bh->b_prev_free=free_list->b_prev_free//将bh的后指针指向为之前空闲表的最后一个节点;
free_list->b_prev_free->b_next_free=bh
free_list->b_prev_free=bh
bh->b_prev=NULL
bh->b_next=NULL
if(!bh->b_dev)
return
bh->b_next=hash(bh->b_dev,bh->b_blocknr)
hash(bh->b_dev,bh->b_blocknr)=bh
bh->b_next->b_prev=bh
}
以上的代码程序就是对buffer_head中buffer_head字段的使用,这就是这些字段作用之一,有趣吧!
现在来分析缓冲区所使用的两个数据结构:散列表和空闲表。
缓冲区中的所有块是通过散列表进行管理和 *** 作的,对于磁盘而言,如果要使用散列表来进行管理,其散列表是不变的。但是,高速缓冲区中的散列表是变化着的。散列表的控制 *** 作是由对应的散列函数进行实施的。要注意的是,缓冲块所存在的散列表并不是规定的,可以结合实际来安排,当然,系统所追求的是一种均衡的分配方式,这样做只是为了更好地对缓冲块进行管理,同时效率也是很高的!
一个缓冲块可以存在于两个链表中:散列表或者是空闲表。如果我们需要寻找一个特定的缓冲块,我们可以在散列表中寻找,举个例子:在一个 *** 作系统中,有多个进程在执行着,现在进程1在使用一个缓冲块,此时进程2也需要访问相应的块,那么进程2就会在散列表中进行寻找,而不是到空闲表中寻找。
而buffer_head结构的字段:b_next、b_prev、b_prev_free、b_next_free就是用来对散列表和空闲表进行 *** 作的。
这仅仅是对缓冲区头结构进行的一个简单的学习总结,还有相应算法会频繁使用到这些字段,相应的总结将在后面的总结中列出。
如果相对高速缓冲有更直接的认识,了解内存结构是很有好处的,所以,要把内存管理弄明白。呵呵!
buffer 与cache 的区别A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.
更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?
cache 和 buffer的区别:
Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的 *** 作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi会非常小。
==============================================================================================cache是高速缓存,用于CPU和内存之间的缓冲;
buffer是I/O缓存,用于内存和硬盘的缓冲
cache最初用于cpu cache, 主要原因是cpu 与memory, 由于cpu快,memory跟不上,且有些值使用次数多,所以放入
cache中,主要目的是,重复使用, 并且一级\二级物理cache速度快,
buffer 主要用于disk 与 memory, 主要是保护硬盘或减少网络传输的次数(内存数据表现dataSet).当然也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护disk,
asp.net的cache有outputcahe与数据cache, 主要目的是 重复使用,提高速度,outputcache主要存储Reader后的页,一般是多次使用同一个HTML,建议不要varybyparam,不要存多version,
数据cache,如dataSet, dataTable, 等
@page buffer="true", 使用buffer,让buffer满后再显示读出或写入,(c中文件输出也是如此,主要目的是保护硬盘), 也可以提高下次的访问速度. 在client browse端表现是: true是一次性显示,要么不显示, 中间等, false是一次显示一些,
这在网络输出也是如此表现.
对于文件访问c中默认采用的是buffer = true, 这与asp.net一样,
相当于Response.write()中当buffer满后输出,以减少网络的传输次数
<%@ OutputCache Duration="60" VaryByParam="none"%>, 是将asp.net生成的HTML缓存起来,在指定的时间内不需要重新生成html, control.ascx.也有组件缓存(htmlCach)。 dataSet也是如此。DataCache,
cache和buffer都是缓冲区, 在翻译上,cache翻译成高速缓冲区要好一点(因为主要是为下次访问加速), buffer翻译成缓冲区好点。都是缓冲的作用,可目的有点不同,主要是理解,不需要太咬文嚼字.
cache 和 buffer的区别
1, Buffer是缓冲区
2, Cache 是高速缓存,分library cachedata dictionary cachedatabase buffer cache
Buffer cache 缓冲区高速缓存,用于缓存从硬盘上读取的数据,减少磁盘I/O.
3, buffer有共享SQL区和PL/SQL区 , 数据库缓冲区高速缓存有独立的subcache
4, pool 是共享池 用于存储最近执行的语句等
5, cache:
A cache is a smaller, higher-speed component that is used to speed up the
access to commonly used data stored in a lower-speed, higher-capacity
component.
database buffer cache:
The database buffer cache is the portion of the SGA that holds copies of data
blocks
read from data files. All user processes concurrently (同时地,兼任地)connected
to the instance share access to the database buffer cache.
buffer cache就是以block为单位读入写出的。
缓存(cache)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写 *** 作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:
我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯
就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策
略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。
-----------------------------------------
两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中
读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求
有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存
。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被
做成cache以方便下次被访问,这样可提供系统性能。
A buffer is something that has yet to be "written" to disk. A cache is
something that has been "read" from the disk and stored for later use.
更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,
是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共
享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?
cache 和 buffer的区别:
Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于
CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期, Cache中保存
着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调
用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)
和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现
在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据
的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据
时,速度快的设备的 *** 作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被
cache住,那么磁盘的读IO bi会非常小。
===========================================
# sync
# echo 1 >/proc/sys/vm/drop_caches
echo 2 >/proc/sys/vm/drop_caches
echo 3 >/proc/sys/vm/drop_caches
cache释放:
To free pagecache:
echo 1 >/proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 >/proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 >/proc/sys/vm/drop_caches
说明,释放前最好sync一下,防止丢数据。
因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)