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..............|
    三、扯淡
    这个现象感觉好像有问题,但是文件系统当时设计的时候就没有准备让用户态程序通过块设备来准确的获得其中的数据,而是主要为了让文件系统进行自己的元数据操作?总之,非到不得已的时候,还是应该乖乖的用文件操作,直接操作块设备的扇区可能会出现不一致的问题,但是这个时间应该不会太久,等内核把脏页面定期冲刷到设备上就好了。
     
     
     
     
     
  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/tsecer/p/10486077.html
Copyright © 2011-2022 走看看