文档章节

内存Page与磁盘Block

满小茂
 满小茂
发布于 2016/09/14 00:03
字数 1541
阅读 2325
收藏 23

在计算机虚拟内存的概念中,页、内存页或者虚拟页是指内存中的一段固定长度的块,这个内存块在物理地址和虚拟内存地址上都是连续的。一个页通常是以下操作的最小单元:

  • 操作系统为程序分配空间
  • 内存和外存传输,比如说硬盘。

一般来说,系统中页的大小是规定好的,比如说4096B,也即4KB。

cache page size就是内存页的最小分配单元,默认8KB,应用于R/W cache。如果I/O < 8KB,那么一个page可能会服务多个I/O,从而优化了cache page的使用。

  • 如果应用环境是Mixed I/O,建议不要更改。
  • 如果应用环境主要是【顺序,大I/O】,将page size 改成16KB能增加性能
  • 如果应用环境主要是【随机,小I/O】,比如OLTP 4KB,那么改成4KB能优化cache page的使用率。

  总的来说,是否要改page size,需要在方案设计期间就确定应用程序的主要I/O大小,进而匹配存储的cache page size,实现优化。如果不确定,8KB是一个最佳实践值。

        在内存页中,有一种叫专门用途的页面叫“缓冲区页”。专门用来放块缓冲区。而每个块缓存区由两部分组成,缓冲区首部(用数据结构buffer_head表示)及真正的缓冲区内容(即所存储的数据,这些数据就放在刚刚说到的缓冲区页中)。在缓冲区首部中,有一个指向数据的指针和一个缓冲区长度的字段。当一个块被调入到内存中,它要被存储在一个缓冲区中每个缓冲区与一个块对应,它相当于磁盘块在内存中的表示。而文件在内存中由file结构体表示,而磁盘块在内存中是由缓冲区来进行表示的。由于内核处理块时需要一些信息,如块属于哪个设备与块对应于哪个缓冲区。所以每个缓冲区都有一个缓冲区描述符,称为buffer_head. 它包含了内核操作缓冲区所需要的全部信息。

  块=缓冲区=1/4 缓冲区页=1/4 Page。

struct buffer_head {

    unsigned long b_state;        /* buffer state bitmap (see above) 缓冲区的状态标志*/

  /*circular list of page's buffers 页面中缓冲区(一般一个页面会有多个块组成,一个页面中的块是以一         个循环链表组成在一起的,该字段指向下一个缓冲区首部的地址。)*/
    struct buffer_head *b_this_page;


  /* the page this bh is mapped to *存储缓冲区的页面/(指向拥有该块的页面的页面描述符)*/
    struct page *b_page;      

    sector_t b_blocknr;        /*start block number 逻辑块号*/

    size_t b_size;            /* size of mapping 块大小*/

    char *b_data;            /* pointer to data within the page 指向该块对应的数据的指针*/

    struct block_device *b_bdev; //对应的块设备(通常是指磁盘或者是分区)

    bh_end_io_t *b_end_io;        /* I/O completion */

    void *b_private;        /* reserved for b_end_io *I/O完成的方法*/

    struct list_head b_assoc_buffers; /* associated with another mapping */

    /*mapping this buffer is associated with *缓冲区对应的映射,即address_space*/
    struct address_space *b_assoc_map; 

    atomic_t b_count; /*users using this buffer_head *表示缓冲区的使用计数*/

}

       

        buffer_head中有两个字段表示块的磁盘地址:

                   b_bdev 表示包含该块的块设备(通常是磁盘或者分区)

                   b_blocknr存放逻辑块号,也就是块在磁盘或分区中的编号

                    b_data 字段表示块缓冲区数据在缓冲区页中的位置。

                   b_state存放缓冲区的状态,例如BH_uptodate(缓冲区包含有效数据时候被置位),Bh_Dirty(缓冲区脏就置位),BH_New(如果相应的块刚被分配而还没被访问过就置位)。

             只要内核必须单独访问一个块,就要涉及存放块缓冲区中的缓冲区页,并检查相应的buffer_head

 

 一个应用实例:如果虚拟文件系统要读1024个字节的inode 块,内核并不是只分配一个单独的缓冲区,而是必须分配一整个页,从而存放4个缓冲区(假设页大小4k),这些缓冲区将存放块设备上相邻的四块数据。其中包含所有的inode块

他们之间的关系如下:(假定一个块是1K ,一个页是4K )

在一个缓冲页内所有块缓冲区大小必须相同,因此,在80X86体系结构上,根据块的小大,一个缓冲区页(page)可以包括1~8个缓冲区。如果一个页作为缓冲区页使用,那么与它的块缓冲区相关的所有缓冲区首部都被收集在一个单向循环链表中。page的private字段指向页中第一个块的buffer_head,每个buffer_head存放在b_this_page字段中,该字段是指向链表中的下一个缓冲区首部的指针。此外,每个buffer_head还把page的地址存放在b_page字段中,整个图如上所示。
   

mmap  系统调用
mmap系统调用是将硬盘文件映射到用内存中,其实就是将page cache中的页直接映射到用户进程地址空间中,从而进程可以直接访问自身地址空间的虚拟地址来访问page cache中的页,从而省去了内核空间到用户空间的copy。

查看系统参数

     tune2fs命令允许系统管理员调整“ext2/ext3”文件系统中的可该参数。

     需要注意到系统可能有多个盘多个文件系统,可通过df命令查看
     数值单位是字节

$sudo /sbin/tune2fs -l /dev/sda1|grep "Block size"  
$getconf PAGESIZE  

文件操作数据流

 如图:

© 著作权归作者所有

共有 人打赏支持
满小茂
粉丝 77
博文 121
码字总数 136324
作品 0
成都
程序员
私信 提问
从free到page cache

Free 我们经常用free查看服务器的内存使用情况,而free中的输出却有些让人困惑,如下: 图1-1 先看看各个数字的意义以及如何计算得到: free命令输出的第二行(Mem):这行分别显示了物理内存的...

长平狐
2012/09/03
769
0
mpage机制中的BH_Boundary详解以及bio思想

这个特性的存在要归结于文件系统在磁盘上的布局,文件需要元数据以便更高效的被系统 所管理,元数据分为两类,一类为抽象给用户的元数据,比如所有者,访问控制列表,修改日期等等,另一类是...

晨曦之光
2012/04/10
677
0
MySQL · 引擎特性 · InnoDB 文件系统之IO系统和内存管理

综述 在前一篇我们介绍了InnoDB文件系统的物理结构,本篇我们继续介绍InnoDB文件系统的IO接口和内存管理。 为了管理磁盘文件的读写操作,InnoDB设计了一套文件IO操作接口,提供了同步IO和异步...

阿里云RDS-数据库内核组
2016/02/03
0
0
合在页高速缓存里面的缓冲区高速缓存

一直以来,缓存和缓冲的概念十分容易引起混淆,其实如果用英文来表示的话可能会好一些,用英文表示,缓冲就是buffer,缓存就是cache,buffer有减轻,减震的作用,其实就是为了减少抖动而采取...

晨曦之光
2012/04/10
936
0
【腾讯Bugly干货分享】TRIM:提升磁盘性能,缓解Android卡顿

Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。 在业内,Android 手机一直有...

腾讯Bugly
2016/03/04
699
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
37分钟前
3
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
1
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
8
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部