freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

操作系統(tǒng)課程設(shè)計(jì)緩沖區(qū)管理-文庫(kù)吧資料

2024-11-24 16:18本頁(yè)面
  

【正文】 173 return NULL。amp。 tmp != NULL 。 166 static struct buffer_head * find_buffer(int dev, int block) 167 { 168 struct buffer_head * tmp。 164 } 165 //// 在高速緩沖中尋找給定設(shè)備和指定塊的緩沖區(qū)塊。 162 hash(bhb_dev,bhb_blocknr) = bh。 159 if (!bhb_dev) 160 return。 156 /* put the buffer in new hashqueue if it has a device */ /* 如果該緩沖塊對(duì)應(yīng)一個(gè)設(shè)備,則將其插入新 hash 隊(duì)列中 */ 157 bhb_prev = NULL。 154 free_listb_prev_freeb_next_free = bh。 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。 145 if (free_list == bh) 146 free_list = bhb_next_free。 144 bhb_next_freeb_prev_free = bhb_prev_free。 140 /* remove from free list */ /* 從空閑緩沖區(qū)表中移除緩沖塊 */ 141 if (!(bhb_prev_free) || !(bhb_next_free)) 13 142 panic(Free block list corrupted)。 // 如果該緩沖區(qū)是該隊(duì)列的頭一個(gè)塊,則讓 hash 表的對(duì)應(yīng)項(xiàng)指向本隊(duì)列中的下一個(gè)緩沖區(qū)。 131 static inline void remove_from_queues(struct buffer_head * bh) 132 { 133 /* remove from hashqueue */ /* 從 hash 隊(duì)列中移除緩沖塊 */ 134 if (bhb_next) 135 bhb_nextb_prev = bhb_prev。 126 } 127 // hash 函數(shù)和 hash 表項(xiàng)的計(jì)算宏定義。 124 invalidate_inodes(dev)。 iNR_SUPER 。 // 軟盤已經(jīng)更換,所以釋放對(duì)應(yīng)設(shè)備的 i 節(jié) 點(diǎn)位圖和邏輯塊位圖所占的高速緩沖區(qū);并使該設(shè)備的 // i 節(jié)點(diǎn)和數(shù)據(jù)塊信息所占的高速緩沖區(qū)無(wú)效。 119 if (!floppy_change(dev amp。 117 if (MAJOR(dev) != 2) 118 return。 113 void check_disk_change(int dev) 114 { 115 int i。 * * 注意!盡管目前該子程序僅用于軟盤,以后任何可移動(dòng)介質(zhì)的塊設(shè)備都將使用該 * 程序, mount/open 操作是不需要知道是否是 軟盤或其它什么特殊介質(zhì)的。我想這是將速度和實(shí)用性相結(jié)合的 * 最好方法。open39。mount39。該子程序相對(duì)來(lái)說(shuō)較慢,所以我們要盡量少使用它。 94 if (bhb_dev == dev) 95 bhb_uptodate = bhb_dirt = 0。 // 等待該緩沖區(qū)解鎖(如果已被上鎖)。 // 繼續(xù)掃描下一塊。 iNR_BUFFERS 。 88 89 bh = start_buffer。 84 void inline invalidate_buffers(int dev) 85 { 86 int i。 82 } 83 //// 使指定設(shè)備在高速緩沖區(qū)中的數(shù)據(jù)無(wú)效。 bhb_dirt) 79 ll_rw_block(WRITE,bh)。 78 if (bhb_dev == dev amp。 i++,bh++) { 75 if (bhb_dev != dev) 76 continue。 74 for (i=0 。 // 將 i 節(jié)點(diǎn)數(shù)據(jù)寫入高速緩沖。 bhb_dirt) 70 ll_rw_block(WRITE,bh)。 69 if (bhb_dev == dev amp。 i++,bh++) { 66 if (bhb_dev != dev) 67 continue。 65 for (i=0 。 62 struct buffer_head * bh。 57 } 58 //// 對(duì)指定設(shè)備進(jìn)行高速緩沖數(shù)據(jù)與設(shè)備上數(shù)據(jù)的同步操作。 // 產(chǎn)生寫設(shè)備塊請(qǐng)求。 // 等待緩沖區(qū)解鎖(如果已上鎖的話)。 iNR_BUFFERS 。 50 bh = start_buffer。 48 49 sync_inodes()。 44 int sys_sync(void) 45 { 46 int i。 42 } 43 //// 系統(tǒng)調(diào)用。 41 sti()。 40 sleep_on(amp。 // 關(guān)中斷。 35 //// 等待指定緩沖區(qū)解鎖。 33 static struct task_struct * buffer_wait = NULL。 // NR_HASH = 307 項(xiàng)。end。 // 由連接程序 ld 生成用于表明內(nèi)核代碼末端的變量。定義硬件端口輸入 /輸出宏匯編語(yǔ)句。定義了設(shè)置或修改描述符 /中斷門等的嵌入式匯編宏。含有一些內(nèi)核常用函數(shù)的原形定義。 24 include linux/ // 調(diào)度程序頭文件,定義了任務(wù)結(jié)構(gòu) task_struct、初始任務(wù) 0 的數(shù)據(jù), // 還有一些有關(guān)描述符參數(shù)設(shè)置和獲取的嵌入式匯編函數(shù)宏語(yǔ)句。 22 23 include linux/ // 內(nèi)核配置頭文件。以宏的形式定義變量參數(shù)列表。見(jiàn)下圖所示。如果所需的數(shù)據(jù)暫時(shí)還不在緩沖區(qū)中,則管理程序會(huì)通過(guò) ll_rw_block()向塊設(shè)備驅(qū)動(dòng)程序申請(qǐng),同時(shí)讓程序?qū)?yīng)的進(jìn)程睡眠等待。上層程序若要訪問(wèn)塊設(shè)備數(shù)據(jù)就通過(guò) bread()向緩沖區(qū)管理程序申請(qǐng)。除驅(qū)動(dòng)程序以外,內(nèi)核其它上層程序?qū)K設(shè)備的讀寫操作需要經(jīng)過(guò)高速緩沖區(qū)管理程序來(lái)間接地實(shí)現(xiàn)。只有當(dāng)被寫盤刷新、解鎖且沒(méi)有其它進(jìn)程引用時(shí)(引用計(jì)數(shù) =0),才能挪作它用。 當(dāng)程序不再需要使用一個(gè)緩沖塊中的數(shù)據(jù)時(shí),就調(diào)用 brelse()函數(shù),釋放該緩沖塊并喚醒因等待該緩沖塊而進(jìn)入睡眠狀態(tài)的進(jìn)程。于是,釋放該緩沖塊,并返回 NULL 值。在醒來(lái)后再判斷數(shù)據(jù)是否有效Getblk 搜索 HASH表 塊在高速緩存中? 搜索空閑隊(duì)列 又被別人占用? 等待 (若已經(jīng)被上鎖 ) 已在高速緩沖中 ? 該塊已被修改過(guò) ? 找到合適的塊? 又被別人占用? 將該塊重新插入散列表對(duì) 應(yīng)項(xiàng)頭部和空閑隊(duì)列尾部 將數(shù)據(jù)寫入設(shè)備 置占用該塊的設(shè)備號(hào)塊號(hào) 是 設(shè)置該塊引用計(jì)數(shù) 1,復(fù)位 有效和修改標(biāo)志 ,并從散列 表和空閑隊(duì)列中移出此塊 返回緩沖頭指針 進(jìn)入睡 眠等待 進(jìn)入睡眠狀態(tài) 否 是 否 否 否 是 是 是 否 是 否 9 了。因此對(duì)于讀取數(shù)據(jù)塊操作 (bread()),此時(shí)就要判斷該緩沖塊的更新標(biāo)志,看看所含數(shù)據(jù)是否有效,如果有效就可以直接 將該數(shù)據(jù)塊返回給申請(qǐng)的程序。整個(gè) getblk()處理過(guò)程可參見(jiàn)下圖所示。在設(shè)置了該緩沖塊所屬的設(shè)備號(hào)和相應(yīng)的邏輯號(hào)后,在將其放入 hash 表對(duì)應(yīng)表項(xiàng)的第一個(gè) 和空閑隊(duì)列的末尾處。最后,我們才算找到了一塊沒(méi)有被進(jìn)程使用、沒(méi)有被上鎖,而且是干凈(修改標(biāo)志未置位)的空閑緩沖塊。在經(jīng)歷了以上折騰后,此時(shí)有可能出現(xiàn)另外 8 一個(gè)意外情況,也就是在我們睡眠時(shí),可能其它進(jìn)程已經(jīng)將我們所需要的緩沖塊加進(jìn)了 hash 隊(duì)列中,因此這里需要最后一次搜索一下 hash 隊(duì)列。否則判斷該緩沖塊是否已被修改過(guò),若是,則將該塊寫盤,并等待該塊解鎖。若該空閑塊被鎖定,則進(jìn)程也需進(jìn)入睡眠,等待其它進(jìn)程解鎖。若找到的空閑塊既沒(méi)有被修改也沒(méi)有被鎖定,就不用繼續(xù)尋找了。如果存在就立刻返回對(duì)應(yīng)緩沖頭結(jié)構(gòu)的指針;如果不存在,則從空閑鏈表頭開(kāi)始,對(duì)空閑鏈表進(jìn)行掃描,尋找一 個(gè)空閑緩沖塊。 上面提及的三個(gè)函數(shù)在執(zhí)行時(shí)都調(diào)用了緩沖塊搜索函數(shù) getblk(),以獲取適合的緩沖塊。 其中,雙箭頭橫線表示散列在同一 hash 表項(xiàng)中緩沖塊頭結(jié)構(gòu)之間的雙向鏈接指針。程序中使用的具體函數(shù)是: (設(shè)備號(hào) ^邏輯塊號(hào) ) Mod 307。上圖中 buffer_head 結(jié)構(gòu)的指針 b_prev、 b_next 就是用于 hash 表中散列在同一項(xiàng)上多個(gè)緩沖塊之間的雙向連接。 這些緩沖區(qū)數(shù)據(jù)存取和管理函數(shù)的調(diào)用層次關(guān)系可用 下圖來(lái)描述。這幾個(gè)函數(shù)都使用了緩沖區(qū)搜索管理函數(shù) getblk(),該函數(shù)將在下面重點(diǎn)說(shuō)明。另外還有幾個(gè)狀態(tài)標(biāo)志:數(shù)據(jù)有效(更新)標(biāo)志、修改標(biāo)志、數(shù)據(jù)被使用的進(jìn)程數(shù)和本緩沖塊是否上鎖標(biāo)志。詳細(xì)結(jié)構(gòu)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1