磁盘块和缓冲块

README

  • 作者:邢万里
  • 学校:重庆邮电大学
  • email:wlxing@yahoo.com
  • 基于内核Linux 0.12源码

磁盘块

术语解释

  1. 定义:
    磁盘块表示磁盘上存储数据的地方,也就是数据真正存放的地方。即使电脑关机、文件保存等情况发生,磁盘块即是数据最终写入的位置(磁盘块的数据不会丢失,除非意外操作或者磁盘损坏等无法避免的情况)。
  2. 磁盘块==盘块==逻辑块==数据块
     a. 数据块,字面意思为存放数据的位置,但是这里(在Linux0.12中表示的只是磁盘中的一部分数据,不包括引导块、超级块、位图和i节点等)为下面第一张图的数据区部分。
     b. 逻辑块,定义为存储在磁盘或者磁带上的数据块(和磁盘块相同)。

存储、关联和读写

  1. MINIX文件系统在磁盘上的真正存放布局:
    磁盘块表示图中的数据区部分,在磁盘块前面有8块(1024字节),分别是引导块、超级块、位图和i节点。第一块盘块在超级块的成员s_firstdatazone表示,其值为8。注意,盘块号是包括前面8块在内计算,计算方式即为:block = nr + s_firstdatazone - 1; block即为盘块号,nr为位图中的索引(见“位图与磁盘关联方式”部分)。
  2. i节点与磁盘块的关联方式:
    通过i节点的成员i_zone数组,表示逻辑块的存放方式是由直接块、一次间接块和二次间接块构成。这基本的三部分均表示的是磁盘块,不是缓冲块,其存储的数据是盘块号。通过文件的i节点就能对应到相应的磁盘块号,再对应具体的磁盘块。
  3. 位图与磁盘块的关联方式:
    通过超级块的成员s_zmap数组,其成员b_data指针指向一块为1024字节的区域。s_zmap数组为struct buffer_head类型,代表的缓冲头部,由该头部进行指引作用,s_zmap的成员b_data指向一个缓冲区,缓冲区的每一位用0或者1表示,每一位依次按照盘块的顺序代表盘块是否正在使用,如果正在使用则表示1,否则为0。位图是缓冲块,顺序从0计数(特殊:s_zmap[0]的第一个位不用),所以如果对应到磁盘的计算过程即为,nr = block - s_firstdatazone + 1;block即为盘块号,nr即为位图(从0开始计数)的第nr个位置。再次注意:盘块号是从8开始计数(因为有8块在磁盘块前),而位图是从0开始计数。
  4. 磁盘块的读写方式:ll_rw_block()函数。
    通过设置该函数的第一个参数为write或read等,判断系统需要读取还是写入数据。
     a. 读取磁盘块过程(bread()函数):确定磁盘块号block–>获得与block和dev相关的缓冲块bh-->ll_rw_block(READ,bh)
     b. 写入磁盘块过程(sync_dev()函数):确定设备号dev–>找到相应的缓冲块bh-->ll_rw_block(WRITE,bh)
    注:
  5. “i节点与磁盘块的关联方式”是磁盘与磁盘的真实存在的关联方式。i节点成员i_zone数组保存的内容是盘块号。
  6. “位图与磁盘块的关联方式”是内存(缓冲块)与磁盘的关联方式。位图保存的内容是逻辑块是否占用。但通过求出某块在位图的偏移地址,再通过公式block = nr + s_firstdatazone - 1即能求出盘块号。由于位图的限制,一个文件最大能表示8 x 8 x 1024 bit为64MB。

缓冲块

术语解释
注: 请反复注意词汇“cache是缓存”和“buffer是缓冲”!
1. cache是高速缓存,用于CPU和内存之间的缓存。
2. buffer是I/O缓冲,用于内存和硬盘的缓冲。
3. 英文解释,如下:

“ 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. ”

  1. cache缓存是集成于CPU中,是介于CPU与主内存间的一种容量较小但速度很高的存储器。目的是为了打破内存读写速度慢的问题,减少了CPU的等待时间,提高了系统的效率。

  2. buffer缓冲是用于暂时存放数据,不同于磁盘块。当机器关机后,缓冲块数据清除,因此不是数据真正存放的位置。缓冲块占用的是内存,用于保护硬盘或减少网络传输的次数。同时也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护磁盘。【注意:和高速缓存(cache)区别!】如下图可知,buffer是物理内存的一部分(而高速缓存是CPU一部分)。

  3. 缓冲块头部==缓冲区头部==缓冲头,是指的struct buffer_head结构体,用于指引到具体的缓冲块位置,其结构如下(b_data指向缓冲块):

struct buffer_head {char * b_data;  /* pointer to data block (1024 bytes) */unsigned long b_blocknr;    /* block number */unsigned short b_dev;       /* device (0 = free) */unsigned char b_uptodate;unsigned char b_dirt;       /* 0-clean,1-dirty */unsigned char b_count;      /* users using this block */unsigned char b_lock;       /* 0 - ok, 1 -locked */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;
};

布局、关联和检索

  1. 高速缓冲区的布局:低端部分是struct buffer_head,弧线箭头是b_data指针,高端部分是具体的缓冲块部分。

  2. 空闲缓冲块的关联方式:通过缓冲头的成员b_prev_free和b_next_free指针进行关联,构建双向循环链表,再由缓冲头寻找具体的缓冲块。

  3. 缓冲块的关联/检索方式:通过缓冲头的成员b_prev和b_next指针进行关联,构建hash表,再由缓冲头寻找具体的缓冲块。

易混淆函数(block系列)

bitmap.c

  1. free_block()new_block()均是对磁盘上的数据块进行操作。一个是将磁盘上某块的数据全部失效(指没有人使用它),一个是将磁盘块新分配(指给特定设备使用)。

buffer.c

  1. getblk()的返回值是返回相应的缓冲块,作用为根据设备号和盘块号获取相应的缓冲块。其参数中的block是盘块号。

truncate.c

  1. free_ind()free_dind()truncate()函数均是对磁盘上数据操作,即为磁盘块。truncate()函数根据i节点的成员i_zone,找到对应的缓冲块头部,通过头部的成员b_data找到对应的缓冲块(其中是以0/1表示的位图),继而根据位图对磁盘上相应的磁盘块进行截断,截断文件后的长度为0,意味着该文件的数据全部失效。

技巧

  1. 关注参数名称是否为block,如果是,则参数为磁盘块号。
  2. 关注函数返回值是否是struct buffer_head,如果是则函数作用是寻找一个缓冲块。
  3. 一般寻找或者释放缓冲块都是需要由dev设备号和block盘块号进行定位。
  4. (注)只要记住这3条原则,就不会混淆了。

参考

  1. Linux内核完全剖析(基于0.12内核)赵炯–>第12章节。
  2. buffer与cache之间的区别:http://blog.chinaunix.net/uid-24020646-id-2939696.html。

MINIX - 磁盘块和缓冲块相关推荐

  1. 扇区、磁盘块、页、页框、缓冲区之间的关系!

    扇区.磁盘块.页.页框.缓冲区之间的关系! 扇区是块设备传输数据的基本单元,也就是说它是块设备中最小的寻址单位,扇区通常的大小为512B. 块是内核对文件系统的一种抽象,也就是说内核执行的所有磁盘操作 ...

  2. 假设磁盘块与缓冲区大小相同,每个盘块读入缓冲区的时间为10μs,由缓冲区送至用户区的时间是5μs,系统对每个磁盘块数据的处理时间为2μs。若用户需要将大小为10个磁盘块的

    [详细计算公式!][详细计算公式!][详细计算公式!] 做这道题的时候伤透了脑筋, 而网上只有答案没有过程, 经过漫长的推算,参考网上和书上的解析,终于总结出了做这种题的万能公式! 送给大家! 题目: ...

  3. 磁盘块与扇区的区别和联系

    什么是扇区? 盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区.扇区是磁盘的最小组成单元,通常是512字节.(由于不断提高磁盘的大小 ...

  4. 操作系统:磁盘结构和磁盘块号计算方法

    磁盘结构 磁盘存储器是一种高速.大容量的随机存储设备 用于存放大量的文件和数据 磁盘设备由一组盘组组成: 包括一张或多张盘片,每张盘片分正反两面 每面可划分成若干磁道各磁道之间留有必要的间隙 每条磁道 ...

  5. 什么是扇区,磁盘块,页?

    扇区,sector 磁盘块,IO Block 页,page 命令索引 扇区,sector 硬盘的读写以扇区为基本单位.磁盘上的每个磁道被等分为若干个弧段,这些弧段称之为扇区.硬盘的物理读写以扇区为基本 ...

  6. 采用链接分配方式进行外存分配时,可采用的两种形式及其特点。假定磁盘块大小为4K,对于128G的硬盘,其文件分配表FAT需占用多少存储空间?

    采用链接分配方式进行外存分配时,可采用的两种形式及其特点.假定磁盘块大小为4K,对于128G的硬盘,其文件分配表FAT需占用多少存储空间? 隐式链接:除文件的最后一个盘快外,每个盘快中都存有指向下一个 ...

  7. 计算机系统的工作方式,某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲 - 信管网...

    第2题: 实时操作系统(RTOS)内核与应用程序之间的接口称为(  ). A.I/O接口 B.PCI C.API D.GUI答案解析与讨论:www.cnitpm.com/st/2867029381.h ...

  8. linux多磁盘块文件删除过程,如何整理Linux磁盘碎片

    Linux界曾经有过这样一个神话:Linux操作系统永远不需要整理磁盘碎片,相信很多人都听说过.由于Linux采用了优秀的日志文件系统(ext2.ext3.ext4,btrfs等),现在基本上不用ex ...

  9. 磁盘块管理器DiskBlockManager

    文章目录 简介 创建 主要成员 主要功能 创建本地目录 获取BlockId对应的文件路径 查询BlockId对应的文件是否存在 创建临时Block文件 简介 DiskBlockManager主要用来创 ...

最新文章

  1. 看下Linux 如何查看端口占用情况
  2. LINQ to SQL 运行时动态构建查询条件
  3. java URI 与URL问题
  4. 有效用例分析阅读笔记一
  5. QML做图片倒影效果(控件倒影)
  6. JDBC操作数据库的基本流程
  7. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
  8. find the nth digit(数学 思维)
  9. IntelliJ IDEA for Mac 中 Java Web Project 默认的工件(Artifacts)输出目录
  10. saml java实现_java-saml
  11. 保存的图数据丢失_锡柴自主刷写和备份共享数据文件使用介绍
  12. 从0开始学习 GitHub 系列之「05.Git 进阶」
  13. 试题 基础练习 圆的面积-蓝桥杯
  14. 微信小程序消息通知-打卡考勤
  15. arm板配置ssh服务
  16. Gson解析空字符串异常的处理
  17. 成功解决ThinkPad T14 高负载下CPU降频问题
  18. linux shell脚本攻略 第三章 以文件之名 find,chmod,touch,head,tail,tree,wc
  19. 关于服务器基本概念汇总
  20. python 3d库_python的3d库

热门文章

  1. 甲方、乙方、监理三者之间的关系及其在项目管理过程中的若干事项
  2. 团灭了3个月的线下营销,还有希望吗?
  3. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...
  4. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...
  5. Python 多线程曲线救国
  6. 成功 自信 快乐, ――给中国青年学生的一封信
  7. 北京软件开发商城app系统软件开发大概多少钱
  8. 新浪微博桌面客户端2014 v3.0.5 官方正式版
  9. 基带信号及其眼图MATLAB仿真实现,Matlab通信仿真——带限系统下的基带信号
  10. 机器人基础技术教学_乒乓球推挡技术完整攻略[基础教学]