ymc4444 发表于 2017-02-12 16:17

塑料袋 发表于 2017-02-24 20:40

你分这么多,我分这么少,你好意思3问题才给5分么?

1) 他的旧版说的是2.4,当时page cache用做文件页的缓冲,page的键值是(inode, pgoff );buffer cache用做文件系统metadata的缓冲,buffer的键值是( bdev, 块号)

2) page cache中的页4K,文件系统的块1K,那么一个文件页很可能对应到4个离散的磁盘块。

3) 是的

ymc4444 发表于 2017-02-28 13:46

nuclearxin 发表于 2017-02-28 14:21

问题一:

如读一个磁盘文件file1时,分为如下两步:(1)首先要读包含file1 inode结点的磁盘块;(2)读file1的内容;
那么
(1)中读的内容放在块高速缓存中,其树根是与块设备相关的bdev文件系统中索引节点的address_space对象?
address_space 是文件物理“内容”的连续内存的逻辑体现。
。。。我没看懂你问题。
         inode和本身存储空间 和 inode描述空间 不一样。
         inode本身的空间应该由 buffer head 描述,属于文件的metadata
         inode描述对应的address_space 就是文件内容。

(2)中读的内容放在页高速缓存中,其树根是file1 inode对象的address_space中?
          看上面。
          树根是啥东西?



问题二:
ULK3 P610

“下面是内核创建缓冲区页的两种普通情况:”
(1)当读或写的文件页在磁盘块中不相邻时。发生这种情况是因为文件系统为文件分配了非连续的块,或因为文件中”洞“。
(2)当访问一个单独的磁盘块时(例如,当读超级块或索引节点块时)。
“当读或写的文件页在磁盘块中不相邻时。”这一句不太理解,能否给解释一下?文件页是个什么概念?

我感觉我上面的问题应该回答你了。
文件在内存中是连续的(address_space) 在磁盘中不一定连续 。怎么实现?没啥魔法文件系统的作者要 搞定他,自己实现readpage function 提取一个文件1或者n个page的内容 到指定page就好了。
所以在pagecache启动 的时候。 你读写文件都是先添完善addressspace 往里面加page ,然后在填充 page内容 。 组成连续的内容。







问题三:
通过dd if=/dev/sda1 of=/tmp/file1 count=1024 blocksize=1M,这样读sda1时,读到的内容也放在bdev文件系统中块设备文件的高速缓存吗?

运行之后如果内存够用。所有的内容都在 pagecache里面
“bdev文件系统中块设备文件的高速缓存”这个概念不对。
pagecache就是个 表。可以包含多个bdev设备 。。。。

页: [1]
查看完整版本: 请教一个页高速缓存的问题。