块设备缓沖区管理 盘块缓沖区及其首部 盘块缓沖池结构 盘块缓沖区的分配 () getblk( )过程 该过程用于从空闲缓沖区队列中获得任一空闲缓沖区该过程首先检查空闲块缓沖队列是否为空若空便调用sleep过程睡眠等待直至在空闲块缓沖队列中出现空闲缓沖区为止否则从空闲块缓沖队列中摘下第一个缓沖区若在其缓沖首部中还有延迟写标志则还须调用bdwrite过程将此缓沖区中的数据写回到磁盘中再从空闲队列中取得一个空缓沖区否则便将bflag中的b[CD*]busy标志置为 并返回指向该缓沖区的指针bp () getblk(dev blkno)过程 该过程用于为指定设备dev和盘块号为blkno的盘块申请一个缓沖区核心首先检查要读入的盘块内容是否已在某个缓沖区中若发现已在某缓沖区中便不再从磁盘上读 否则核心须从磁盘上将数据读入这时才需为其分配一个空缓沖区类似地当要把数据写入一特定盘块时核心先检查该盘块的内容是否已在某缓沖区仅当该块的内容尚不在缓沖区中时才需调用getblk( )过程分配一个空缓沖区 盘块缓沖区的回收 当核心用完某缓沖区时可调用brelse过程将之收回此前可能有些进程因等待使用该缓沖区而睡眠此时释放者进程应将睡眠队列的队首进程唤醒此外还有可能有进程因空闲链表空而处于等待状态同样也应将之唤醒如果在所释放的缓沖区中的数据是有效的为使以后在某进程需要它时也能直接从缓沖区中读出而不必启动磁盘的I/O操作可将该缓沖区链入空闲链表的末尾否则(缓沖区中数据无效)应将它链入空闲队列的头部空闲链表属于临界资源为了保证对它操作的互斥性UNIX系统通过提高处理机的运行级对中断加以屏蔽的方法来实现 ——返回教材目录 了解更多计算机相关基础课程视频 |