Skip to content

buf.h

TIP

struct buf 代表一个缓冲区,它缓存了磁盘块的内容。 内核通过缓冲区缓存来减少磁盘访问,提高 I/O 性能。 当内核需要读取或写入一个磁盘块时,它首先在缓冲区缓存中查找。 如果找到,就可以直接操作内存中的数据,避免了昂贵的磁盘操作。

struct buf {
  int valid;

TIP

0 表示数据无效(例如,缓冲区是新分配的),1 表示数据有效。

  int disk;

TIP

例如,在调用 virtio_disk_rw() 时会设置此位,以防止其他进程使用该缓冲区。

  uint dev;
  uint blockno;

  struct sleeplock lock;

TIP

任何时候只有一个进程可以持有某个缓冲区的锁,从而防止竞争条件。 当一个进程需要等待 I/O 操作完成时,它会释放 CPU 并在此锁上休眠。

  uint refcnt;

TIP

当一个线程开始使用缓冲区时,引用计数加一。使用完毕后,减一。 只有当 refcnt 为 0 时,这个缓冲区才能被回收并用于缓存其他磁盘块。

  struct buf *prev;

TIP

指向链表中的前一个缓冲区。

  struct buf *next;

TIP

LRU(最近最少使用)算法通过这个链表来决定哪些缓冲区可以被优先回收。

  uchar data[BSIZE];

TIP

它实际存储了从磁盘读取的块数据或将要写入磁盘的数据。

};