操作系统课程设计缓冲区管理内容摘要:
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。操作系统课程设计缓冲区管理
相关推荐
中照顾他的不便之处(比如工作量大、时间不够用),那他一眼相中你的可能性便会大大提高。 具体说来,你可以参考以下几个做法: 技巧一 :把求职意向 、联系方式等基本信息写清楚,并 放在 简历 开头。 把 求职意向 写清楚,你想应聘哪一个岗位, 要做全职还是兼职,你想在哪里 上班 等。 千万不要以为应聘的就你一个人,要学会帮别人节省时间。 有些人想到外地去工作,投简历时人还没过去,那这时候就要
包括已售出的列车票表信息、 预定车票、售票、退票、车次查询、报表 、列车管理功能 ,可以新增车次 ,修改车次和撤消车次等功能。 2. 需求分析 . 需求分析 随着旅游业的逐渐的成熟发达, 铁路 客运量大幅度的提高, 各大省市的列车都显著 的增加,这些都对 列车票务 管理系统提出了更高的要求,所以要不断的完善更新 列车票务 管理 系统,提高 列车 售票系统的 工作效率。 随着科学的不断进步
for i 0。 i total_vp。 i++ pl[i].pn i。 pl[i].pfn INVALID。 /*置页面控制结构中的页号,页面为空 */ pl[i].counter 0。 pl[i].time 1。 /*页面控制结构中的访问次数为 0,时间为 1*/ for i 1。 i total_pf。 i++ pfc[i1].next amp。 pfc[i]。 pfc[i1].pfn
2、结构和操作规程后才能上岗作业。 操作时,若设备发生故障,应对症采取以下维修和保养措施:1、分离机常见故障及排除使用时,磨浆分离机磨片间隙应调整为 米左右,操作时先拧上部的手柄以使螺旋旋紧,然后回退 90 度即可;如果刨碎分离和磨浆分离机在工作时出现主轴卡碰,应立即停车检查;若发现轴承损坏应及时更换同型号的轴承;制粉机组工作时,若发现刨碎分离机的电流表长时间处于超载状态,应调整清洗机的喂入量。
作的功能选项 1 2 3 4 5 进行所选进程操作 选 1且 进程正在执行 Y 操作不能执行 选择 N N N 选择 5 Y Y 开始 结束 8 / 17 三、 详细设计 1.源程序代码 include class queuenode { friend class queue。 private: char data。 queuenode * link。 queuenode (char d=0