Linux中的读函数与块高速缓存
为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时同步脏的数据页面(如果是同步模式则立刻同步),也就是常说的Unix延迟写,这样会极大提高系统读写的效率。有人或许问,数据不直接写在设备上的话断电的话数据丢失怎么办,只能说,对不起,没办法。
下面介绍三个重要的内核读函数。
(1)__find_get_block().函数__find_get_block()的参数有:block_device描述符地址bdev,块号block和块大小size。函数返回页高速缓存中的块缓冲区对应的缓冲区首部的地址;如果不存在指定的块,就返回NULL.
(2)__getblk().__getblk()其与__find_get_block()接收相同的参数,并返回与缓冲区对应的缓冲区首部的地址。与__find_get_block()不同的是,如果块不存在,__getblk()会分配块设备缓冲区页并返回将要描述块的缓冲区首部的指针。注意,__getblk()返回的块缓冲区不必存有有效数据(因为还没读磁盘)。
struct buffer_head * __getblk(struct block_device *bdev, sector_t block, int size)
{
……
__find_get_block(bdev, block, size);
……
grow_buffers()
……
}
grow_buffers()这个函数就是将分配的缓冲区加入块高速缓存中,参数与__find_get_block相同。grow_buffers()调用流程如下:grow_buffers---->grow_dev_page--->find_or_create_page在块高速缓存中搜索需要的页,如果需要,就把新的页插入高速缓存--->add_to_page_cache_lru将块缓存加入lru链表--->add_to_page_cache将块缓存加入块高速缓存中.
(3) __bread(). __bread()的参数也与前两个相同,返回与缓冲区对应的缓冲区首部的地址,与__getblk()不同的是,__bread()会从读取相应的磁盘块,并将其填充到缓冲区。
struct buffer_head * __bread(struct block_device *bdev, sector_t block, int size)
{
……
__getblk(bdev, block, size);
……
__bread_slow(bh);
}
__bread_slow()函数调用submit_bh()函数填充块缓存bh.
从三个函数可以看出来,它们的关系是递进的,第一个函数只负责在块高速缓存中查找,第二个则多了一个分配高速缓存块的操作,最后多了一个从磁盘中读取相应块并填充缓存块的操作。
参考资料:《深入理解linux内核》
Linux中的读函数与块高速缓存的更多相关文章
- 深入解析Linux中的fork函数
1.定义 #include <unistd.h> #include<sys/types.h> pid_t fork( void ); pid_t 是一个宏定义,其实质是int, ...
- 如何测试Linux 中的wait函数能不能等待子进程的子进程?
#include <stdio.h> #include <stdlib.h> int main() { pid_t pid = fork(); switch(pid) { : ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- 关于linux中的system函数
Linux下使用system()函数一定要谨慎 https://blog.csdn.net/senen_wakk/article/details/51496322 system()正确应用 https ...
- Unix/Linux中的fork函数
fork函数介绍 一个现有进程可以调用fork函数创建一个新进程.该函数定义如下: #include <unistd.h> pid_t fork(void); // 返回:若成功则在子进程 ...
- Linux中的入口函数main
main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...
- 练习一下linux中的list函数。
所有的list函数见 include/linux/list.h 自己从 include/linux/list.h 拷贝了一些函数到自己的list.c中, 然后练习了一下. 没有别的目的,就是想熟练一下 ...
- linux中内核延时函数 (转)
第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...
- linux中字符串转换函数 simple_strtoul【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...
随机推荐
- 我的开源框架之Accordion控件
需求: (1)实现手风琴面板控件,支持静态HTML与JSON方式创建控件 (2)支持远程加载数据 (3)支持面板激活.远程加载事件注册 (4)支持动态添加.删除项目 实现图例 客户代码 <div ...
- 继续Python爬虫
先贴上代码 # coding:utf-8 import urllib2 import urllib import re gjc = urllib.quote('你好') url = 'http://s ...
- 镜像树(dfs)
1214: J.镜像树 时间限制: 1 Sec 内存限制: 64 MB提交: 18 解决: 7 标签提交统计讨论版 题目描述 一棵二叉树,若其与自己的镜像完全相同,就称其为镜像树(即这棵二叉树关于 ...
- C语言之预处理命令
/**************************************************************************** Title:C之预处理命令 Time:201 ...
- JS 函数中返回另一个函数
function createComparisonFunction(propertyName) { return function (object1, object2) { var value1 = ...
- 手机天猫nba项目总结
页面逻辑: 技术统计 比赛竞猜 猜你喜欢 进入页面时,获取服务器的当前时间.然后进行页面上的每秒递增.1.每隔n秒向后台发送请求,获取最新比分信息,球队图像,球员信息.然后更改页面.2.每隔n秒向后台 ...
- Silverlight 结合ArcGis 使用inforwindow
原文 http://www.dotblogs.com.tw/justforgood/archive/2012/05/10/72089.aspx 也许有些人不知道什么事inforwindow,简单来说就 ...
- java 下拉框级联及相关(转)
ActionLintsner都实现此接口,其它监听器可以监听的事件都可以被它捕获 public interface ActionListener extends EventListenerThe li ...
- 【LeetCode练习题】Combination Sum
Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combin ...
- cmd用到的基本操作
dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 a = all dir c: /a:d #显示 C 盘当前目录中的目录 d = direc ...