操作系统课程设计缓冲区管理内容摘要:

uffer_head * bh。 48 49 sync_inodes()。 /* write out inodes into buffers */ /*将 i 节点写入高速缓冲 */ // 扫描所有高速缓冲区,对于已被修改的缓冲块产生写盘请求,将缓冲中数据与设备中同步。 50 bh = start_buffer。 51 for (i=0。 iNR_BUFFERS。 i++,bh++) { 52 wait_on_buffer(bh)。 // 等待缓冲区解锁(如果已上锁的话)。 53 if (bhb_dirt) 54 ll_rw_block(WRITE,bh)。 // 产生写设备块请求。 55 } 11 56 return 0。 57 } 58 //// 对指定设备进行高速缓冲数据与设备上数据的同步操作。 59 int sync_dev(int dev) 60 { 61 int i。 62 struct buffer_head * bh。 63 64 bh = start_buffer。 65 for (i=0。 iNR_BUFFERS。 i++,bh++) { 66 if (bhb_dev != dev) 67 continue。 68 wait_on_buffer(bh)。 69 if (bhb_dev == dev amp。 amp。 bhb_dirt) 70 ll_rw_block(WRITE,bh)。 71 } 72 sync_inodes()。 // 将 i 节点数据写入高速缓冲。 73 bh = start_buffer。 74 for (i=0。 iNR_BUFFERS。 i++,bh++) { 75 if (bhb_dev != dev) 76 continue。 77 wait_on_buffer(bh)。 78 if (bhb_dev == dev amp。 amp。 bhb_dirt) 79 ll_rw_block(WRITE,bh)。 80 } 81 return 0。 82 } 83 //// 使指定设备在高速缓冲区中的数据无效。 // 扫描高速缓冲中的所有缓冲块,对于指定设备的缓冲区,复位其有效 (更新 )标志和已修改标志。 84 void inline invalidate_buffers(int dev) 85 { 86 int i。 87 struct buffer_head * bh。 88 89 bh = start_buffer。 90 for (i=0。 iNR_BUFFERS。 i++,bh++) { 91 if (bhb_dev != dev) // 如果不是指定设备的缓冲块,则 92 continue。 // 继续扫描下一块。 93 wait_on_buffer(bh)。 // 等待该缓冲区解锁(如果已被上锁)。 // 由于进程执行过睡眠等待,所以需要再判断一下缓冲区是否是指定设备的。 94 if (bhb_dev == dev) 95 bhb_uptodate = bhb_dirt = 0。 96 } 97 } 98 99 /* 12 * 该子程序检查一个软盘是否已经被更换,如果已经更换就使高速缓冲中与该软驱 * 对应的所有缓冲区无效。 该子程序相对来说较慢,所以我们要尽量少使用它。 * 所以仅在执行 39。 mount39。 或 39。 open39。 时才调用它。 我想这是将速度和实用性相结合的 * 最好方法。 若在操作过程当中更换软盘,会导致数据的丢失,这是咎由自取 ☺。 * * 注意。 尽管目前该子程序仅用于软盘,以后任何可移动介质的块设备都将使用该 * 程序, mount/open 操作是不需要知道是否是 软盘或其它什么特殊介质的。 */ //// 检查磁盘是否更换,如果已更换就使对应高速缓冲区无效。 113 void check_disk_change(int dev) 114 { 115 int i。 116 // 是软盘设备吗。 如果不是则退出。 117 if (MAJOR(dev) != 2) 118 return。 // 测试对应软盘是否已更换,如果没有则退出。 119 if (!floppy_change(dev amp。 0x03)) 120 return。 // 软盘已经更换,所以释放对应设备的 i 节 点位图和逻辑块位图所占的高速缓冲区;并使该设备的 // i 节点和数据块信息所占的高速缓冲区无效。 121 for (i=0。 iNR_SUPER。 i++) 122 if (super_block[i].s_dev == dev) 123 put_super(super_block[i].s_dev)。 124 invalidate_inodes(dev)。 125 invalidate_buffers(dev)。 126 } 127 // hash 函数和 hash 表项的计算宏定义。 128 define _hashfn(dev,block) (((unsigned)(dev^block))%NR_HASH) 129 define hash(dev,block) hash_table[_hashfn(dev,block)] 130 //// 从 hash 队列和空闲缓冲队列中移走指定的缓冲块。 131 static inline void remove_from_queues(struct buffer_head * bh) 132 { 133 /* remove from hashqueue */ /* 从 hash 队列中移除缓冲块 */ 134 if (bhb_next) 135 bhb_nextb_prev = bhb_prev。 136 if (bhb_prev) 137 bhb_prevb_next = bhb_next。 // 如果该缓冲区是该队列的头一个块,则让 hash 表的对应项指向本队列中的下一个缓冲区。 138 if (hash(bhb_dev,bhb_blocknr) == bh) 139 hash(bhb_dev,bhb_blocknr) = bhb_next。 140 /* remove from free list */ /* 从空闲缓冲区表中移除缓冲块 */ 141 if (!(bhb_prev_free) || !(bhb_next_free)) 13 142 panic(Free block list corrupted)。 143 bhb_prev_freeb_next_free = bhb_next_free。 144 bhb_next_freeb_prev_free = bhb_prev_free。 // 如果空闲链表头指向本缓冲区,则让其指向下一缓冲区。 145 if (free_list == bh) 146 free_list = bhb_next_free。 147 } 148 //// 将指定缓冲区插入空闲链表尾并放入 hash 队列中。 149 static inline void insert_into_queues(struct buffer_head * bh) 150 { 151 /* put at end of free list */ /* 放在空闲链表末 尾处 */ 152 bhb_next_free = free_list。 153 bhb_prev_free = free_listb_prev_free。 154 free_listb_prev_freeb_next_free = bh。 155 free_listb_prev_free = bh。 156 /* put the buffer in new hashqueue if it has a device */ /* 如果该缓冲块对应一个设备,则将其插入新 hash 队列中 */ 157 bhb_prev = NULL。 158 bhb_next = NULL。 159 if (!bhb_dev) 160 return。 161 bhb_next = hash(bhb_dev,bhb_blocknr)。 162 hash(bhb_dev,bhb_blocknr) = bh。 163 bhb_nextb_prev = bh。 164 } 165 //// 在高速缓冲中寻找给定设备和指定块的缓冲区块。 // 如果找到则返回缓冲区块的指针,否 则返回 NULL。 166 static struct buffer_head * find_buffer(int dev, int block) 167 { 168 struct buffer_head * tmp。 169 170 for (tmp = hash(dev,block)。 tmp != NULL。 tmp = tmpb_next) 171 if (tmpb_dev==dev amp。 amp。 tmpb_blocknr==block) 172 re。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。