struct buffer_head低效率

时间:2011-03-30 09:41:00

标签: linux operating-system kernel block

有人能说出为什么直到Linux Kernel 2.4使用的struct buffer_head结构效率低下,以及在内核2.5.1的新重新设计的块层中使用的struct bio结构中实现了什么?

3 个答案:

答案 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操作所需的最少信息   与缓冲区本身有关的不必要信息。
  •