zoukankan      html  css  js  c++  java
  • 内存管理(3)---块设备缓冲和文件缓冲独立性验证

    一、块读取和文件读取
    在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东西可能只有我们这些无聊的geek会关心考虑这个问题,事实上没有人这么使用。但是作为一种现象,我还是想验证一下这个不一致,所谓“光说不练假把式”就是这个意思。
    二、通过文件修改之后看块设备未更新
    这里的方法就是首先先各自通过文件和块设备访问设备中的某一个块,从而迫使内核将这个块的内容读入各自的页面缓冲中,然后通过文件系统修改这个文件的内容,之后再通过块设备来读取相同块,由于块设备和文件使用的是独立的页面缓冲,所以块设备访问的是没有更新的内容。
    [root@Harry boot]# cat incon.txt 
    hello
    [root@Harry boot]# stat incon.txt 
      File: `incon.txt'
      Size: 6             Blocks: 4          IO Block: 1024   regular file        ext2文件系统中每个块大小为1024字节
    Device: 801h/2049d    Inode: 34          Links: 1                             该文件分配的inode编号为34
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2012-01-16 22:03:04.000000000 +0800
    Modify: 2012-01-16 21:59:20.000000000 +0800
    Change: 2012-01-16 21:59:20.000000000 +0800
    [root@Harry boot]# debugfs -R 'bmap <34>  0' /dev/sda1         通过debugfs查看34号inode使用的块编号为11782
    debugfs 1.41.9 (22-Aug-2009)
    11782
    [root@Harry boot]# echo tsecer>>incon.txt                            向文件中追加内容。
    [root@Harry boot]# debugfs -R 'bmap <34>  0' /dev/sda1      inode使用的块编号没有变化
    debugfs 1.41.9 (22-Aug-2009)
    11782
    [root@Harry boot]# echo world>>incon.txt                             再次追加内容
    [root@Harry boot]# hexdump -Cvs 12064768  /dev/sda1 | more    通过块设备查看文件内容没有变化,这里的参数12064768=11782×1024
    00b81800  68 65 6c 6c 6f 0a 74 73  65 63 65 72 0a 00 00 00  |hello.tsecer....|
    [root@Harry boot]# cat incon.txt  通过文件系统查看文件内容已经变化
    hello
    tsecer
    world
    [root@Harry boot]# hexdump -Cvs 12064768  /dev/sda1 | more 经过一段时间再次查看这个块设备的数据,可以看到其内容已经变化
    00b81800  68 65 6c 6c 6f 0a 74 73  65 63 65 72 0a 77 6f 72  |hello.tsecer.wor|
    00b81810  6c 64 0a 00 00 00 00 00  00 00 00 00 00 00 00 00  |ld..............|
    三、扯淡
    这个现象感觉好像有问题,但是文件系统当时设计的时候就没有准备让用户态程序通过块设备来准确的获得其中的数据,而是主要为了让文件系统进行自己的元数据操作?总之,非到不得已的时候,还是应该乖乖的用文件操作,直接操作块设备的扇区可能会出现不一致的问题,但是这个时间应该不会太久,等内核把脏页面定期冲刷到设备上就好了。
     
     
     
     
     
  • 相关阅读:
    容器适配器————priority_queue
    容器适配器————queue
    容器适配器之总结
    序列式容器之总结
    序列式容器————forward_list
    序列式容器————list
    序列式容器————dequeue
    13.软件项目管理与敏捷方法——如何变更职责笔记
    10.软件项目管理与敏捷方法——沟通管理笔记
    09.软件项目管理与敏捷方法——人力资源管理笔记
  • 原文地址:https://www.cnblogs.com/tsecer/p/10486077.html
Copyright © 2011-2022 走看看