高速缓冲区是内存中的一块内存,在块设备与内核其它程序之间起着一个桥梁作用。内核程序如果需要访问块设备中的数据,都需要经过高速缓冲区来间接的操作。
高速缓冲区被划分为1k大小的缓冲块,与磁盘块大小一致。高速缓冲区主要包含两部分内容,缓冲块头结构(buffer_head,bh)及其对应的缓冲块。缓冲块用于缓存磁盘数据,并且具有一个缓冲块头结构;缓冲块头结构保存对应缓冲块的元数据。高速缓冲采用hash表和包含所有缓冲块的链表进行操作管理。
缓冲块头结构用于建立内存缓冲块和磁盘被缓冲数据块之间的映射关系,并记录一些访问状态、管理属性。缓冲块头结构具有指向缓冲块的指针,并记录有被缓冲磁盘块的信息,包括磁盘块所属设备号,磁盘块号等,从而建立起映射关系。
使用双向链表串联空闲缓冲块头结构,使用b_prev_free和b_next_free指针域。
为支持对缓冲区的高速访问,使用hash表管理已分配缓冲块。根据被缓冲磁盘块所在设备号和逻辑块号,分配的缓冲块被哈希到哈希表中,哈希函数为:(设备号^逻辑块号)Mod 307。使用拉链发处理hash冲突,具有相同哈希值的缓冲块被组织为双向链表,使用b_pre、b_next指针域
当用户程序读文件时会发生什么?
1)read函数读文件时,底层进一步调用bread函数读设备的磁盘块数据。
2)bread调用getblk函数获取缓冲块,若缓冲块数据有效,则直接返回缓冲块头指针;否则调用块设备低层块读写函数ll_rw_block()读写数据到缓冲块中,并等待在该缓冲区上。
唤醒:设备完成读写后,会发出中断,中断处理程序会唤醒等待在缓冲块上的进程
缓冲区管理函数之间的层次关系
手机扫一扫
移动阅读更方便
你可能感兴趣的文章