UNIX文件系统:演变、设计与实现
1. 传统UNIX缓冲区结构特点
在传统的UNIX系统中,缓冲区结构有其独特之处。与一般的设计不同,缓冲区结构里没有标志位。取而代之的是, b_uptodate 和 b_dirt 字段分别用于指示缓冲区内容是否有效,以及缓冲区是否为脏数据(即需要写入磁盘)。
脏缓冲区会由更新进程或 bdflush 内核线程定期刷新到磁盘。至于 bdflush 的工作机制,后续会有详细介绍。
有效缓冲区会根据设备和块号进行哈希处理,并通过 buffer_head 结构的 b_next 和 b_pref 字段存储在双向链表中。用户可以调用 getblk() 函数获取有效缓冲区,使用完毕后调用 brelse() 函数释放。由于缓冲区已经链接在相应的哈希队列上, brelse() 函数除了检查是否有其他进程在等待该缓冲区,并在必要时发出唤醒调用外,几乎不需要做其他事情。
I/O操作通过调用 ll_rw_block() 函数来执行,该函数实现在设备驱动层之上。如果I/O操作需要同步执行,调用线程会调用 wait_on_buffer() 函数,这会使线程进入睡眠状态,直到I/O操作完成。
早期的Linux内核版本在文件I/O方面遵循旧的UNIX模型,即通过缓冲区缓存来读写所有文件
超级会员免费看
订阅专栏 解锁全文
81

被折叠的 条评论
为什么被折叠?



