有人能说出为什么直到Linux Kernel 2.4使用的struct buffer_head结构效率低下,以及在内核2.5.1的新重新设计的块层中使用的struct bio结构中实现了什么?
答案 0 :(得分:4)
在2.5之前的内核中,buffer_head曾经是 IO的单元。但是,就buffer_head而言,执行IO可能效率低下。例如,跨越多个块的单个写入将导致创建多个buffer_head对象,从而浪费空间和时间。因此, buffer_head结构最适合用于提供块到物理内存映射,这正是它所做的(以及它所做的唯一的事情)来自2.5内核以后。
另一方面, struct bio在以后的内核版本中被设计为IO的单位。 * *它代表当前在中的活动 IO内核。**请注意,块到内存的映射仍保留在buffer_head中。但是,buffer_head现在不会超载包含有关当前活动IO的信息的字段。因此,当更高级别的代码(如文件系统)发出IO时,会向request_queue添加一个请求。该请求又包含指向生物结构的指针。控制发出IO的设备的设备驱动程序将获取请求并提供服务。
struct bio结构也用于分割IO,例如,通过RAID磁盘设备驱动程序。查看struct bio定义,你会发现它维护着一个io_vectors数组(它们只是偏移到内存页面中)。此外,bi_idx用于索引这些io_vec。通过为不同的磁盘使用不同的bi_idx值,每个磁盘将选择一组不同的io_vec进行写入(或读取),因此IO将以真正的并行方式完成。
答案 1 :(得分:2)
使用source,luke!
来自include/linux/buffer_head.h
:
/*
* Historically, a buffer_head was used to map a single block
* within a page, and of course as the unit of I/O through the
* filesystem and block layers. Nowadays the basic I/O unit
* is the bio, and buffer_heads are used for extracting block
* mappings (via a get_block_t call), for tracking state within
* a page (via a page_mapping) and for wrapping bio submission
* for backward compatibility reasons (e.g. submit_bh).
*/
struct buffer_head {
[ ... ]
来自linux/include/bio.h
:
/*
* main unit of I/O for the block layer and lower layers (ie drivers and
* stacking drivers)
*/
struct bio {
[ ... ]
两个解耦I / O特性和“更高级别”(I / O到文件系统)和“低级别”(I / O到块开发)的操作。这允许更高的性能,因为在某处等待的缓冲层不会阻止块层在其他地方执行工作。关于它的一些解释可以找到here,Jens Axboe简要地谈到它in this interview。
答案 2 :(得分:0)
Robert Love的LKD 3rd对此有非常详细的解释。
旧与新
缓冲头和新头之间的区别 生物结构很重要。生物结构代表一个I / O 操作,其中可能包含一个或多个页面。在另一 另一方面,buffer_head结构代表单个缓冲区,其中 描述磁盘上的单个块。因为缓冲头与 在单个页面中的单个磁盘块中,缓冲头导致 不必要的将请求划分为块大小的块,仅用于 稍后重新组装它们。因为生物结构很轻,所以它 可以描述不连续的块,而不必拆分I / O 操作。从struct buffer_head切换到提供的struct bio 其他好处:
生物结构很容易代表高记忆力,因为struct bio 仅处理物理页面,而不处理直接指针。
生物结构可以代表正常的页面I / O和直接I / O(I / O 不通过页面缓存的操作-请参见第16章,“ 页面缓存和页面写回”,有关页面缓存的讨论。
生物结构使执行分散聚集(矢量化)变得容易 阻止I / O操作,并在操作中涉及数据 来自多个物理页面。
- 生物结构很多 比缓冲头更轻巧,因为它仅包含 代表块I / O操作所需的最少信息 与缓冲区本身有关的不必要信息。