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

正文內(nèi)容

操作系統(tǒng)課程設(shè)計緩沖區(qū)管理-wenkub

2022-11-27 16:18:02 本頁面
 

【正文】 間的雙向鏈接。高速緩沖采用 hash 表和空閑緩沖塊隊列進(jìn)行操作管理。 圖中高速緩沖區(qū)的起始位置從內(nèi)核模塊末段 end 標(biāo)號開始, end 是內(nèi)核模塊鏈接期間由鏈接程序( ld)設(shè)置的一個值,內(nèi)核代碼中沒有定義這個符號。初始化結(jié)束后,高速緩沖區(qū)中的緩沖頭和緩沖塊一一對應(yīng),其個數(shù)保 存在 NR_BUFFERS中。高速 緩沖區(qū)被劃分為兩部分:低端為緩沖頭,高端為緩沖塊。 三、分析概述 在前面已經(jīng)看到, 、高速緩存、虛擬磁盤(可選)、主存儲區(qū)四個部分。高速緩沖區(qū)位于內(nèi)核代碼塊和主內(nèi)存區(qū)之間。文件系統(tǒng)中其它程序通過指定需要訪問的設(shè)備號和數(shù)據(jù)邏輯塊號來調(diào)用它的塊讀寫函數(shù)。如果數(shù)據(jù)不在高速緩沖中,就發(fā)出讀塊設(shè)備的命令,將數(shù)據(jù)讀到高速緩沖中。 二、分析內(nèi)容及目標(biāo) 本次操作系統(tǒng)的任務(wù)是分析 下的 高速緩沖區(qū)源代碼 。為了訪問文件系統(tǒng)等塊設(shè)備上的數(shù)據(jù),內(nèi)核可以每次都訪問塊設(shè)備,進(jìn)行讀或?qū)懖僮?。但是每?I/O 操作的時間與內(nèi)存和 CPU 的處理速度相比是非常慢的。 在 linux內(nèi)核中,高速緩沖區(qū)位于內(nèi)核代碼和主內(nèi)存區(qū)之間,高速緩沖中存放著最近被使用過的各個塊設(shè)備中的數(shù)據(jù)塊。當(dāng)需要把數(shù)據(jù)寫到塊設(shè)備中時,系統(tǒng)就會在高速緩沖區(qū)中申請一塊空閑的緩沖塊來臨時存放這些數(shù)據(jù)。這些接口函數(shù)有:塊讀取函數(shù) bread()、塊提前預(yù)讀函數(shù) breada()和頁塊讀取函數(shù)bread_page()。高速緩沖區(qū)在塊設(shè)備與內(nèi)核其它程序之間起著一個橋梁用。高速緩沖區(qū)在塊設(shè)備和內(nèi)核其它之間起著橋梁作用,用于緩沖讀寫塊設(shè)備時的數(shù)據(jù)。緩沖塊具有固定的長度 1024字節(jié),用來緩存從塊設(shè)備上讀寫的數(shù)據(jù);緩沖頭用 buffer_head定義,用于描述對應(yīng)緩沖塊的屬性和把所有緩沖頭連接成鏈表。由于緩沖塊是用來緩存塊設(shè)備上的讀寫數(shù)據(jù)的,因此有兩個字段特別關(guān)鍵:設(shè)備號以及數(shù)據(jù)塊編號。當(dāng)在連接生成 system 模塊時, ld 程序的 digest_symbols()函數(shù)會產(chǎn)生此符號。在緩沖區(qū)初始化過程中,從緩沖區(qū)的兩端開始,同時分別設(shè)置緩沖塊頭結(jié)構(gòu)和劃分出對應(yīng)的緩沖塊。 HASH表所使用的散列函數(shù)由設(shè)備號和邏輯塊號組合而成,使用的具 體方法是(設(shè)備號 ^邏輯塊號) mod 307。 現(xiàn)在 Linux系統(tǒng)中已經(jīng)不再有 獨立的緩沖區(qū)高速緩存了。 該情況存在于 ,但是從 ,統(tǒng)一了這兩種緩存,現(xiàn)在 Linux只有惟一的磁盤緩存 — 頁高速緩存。 睡眠函數(shù) ? ll_rw_block():讀設(shè)備塊請求函數(shù) ? get_hash_table():哈希搜索函數(shù) ,程序中使用的具體函數(shù)是:(設(shè)備號 ^邏輯塊號 ) Mod 307 2. 緩沖頭數(shù)據(jù)結(jié)構(gòu) struct buffer_head { char * b_data。 //更新標(biāo)志:表示數(shù)據(jù)是否已更新 unsigned char b_dirt。 //指向等待該緩沖區(qū)解鎖的任務(wù) struct buffer_head * b_prev。// 空閑表上后一塊 }。除了塊設(shè)備驅(qū)動程序以外,內(nèi)核程序如果需要訪問塊設(shè)備中的數(shù)據(jù),就都需要經(jīng)過高速緩沖區(qū)來間接地操作。另外還有幾個狀態(tài)標(biāo)志:數(shù)據(jù)有效(更新)標(biāo)志、修改標(biāo)志、數(shù)據(jù)被使用的進(jìn)程數(shù)和本緩沖塊是否上鎖標(biāo)志。 這些緩沖區(qū)數(shù)據(jù)存取和管理函數(shù)的調(diào)用層次關(guān)系可用 下圖來描述。程序中使用的具體函數(shù)是: (設(shè)備號 ^邏輯塊號 ) Mod 307。 上面提及的三個函數(shù)在執(zhí)行時都調(diào)用了緩沖塊搜索函數(shù) getblk(),以獲取適合的緩沖塊。若找到的空閑塊既沒有被修改也沒有被鎖定,就不用繼續(xù)尋找了。否則判斷該緩沖塊是否已被修改過,若是,則將該塊寫盤,并等待該塊解鎖。最后,我們才算找到了一塊沒有被進(jìn)程使用、沒有被上鎖,而且是干凈(修改標(biāo)志未置位)的空閑緩沖塊。整個 getblk()處理過程可參見下圖所示。在醒來后再判斷數(shù)據(jù)是否有效Getblk 搜索 HASH表 塊在高速緩存中? 搜索空閑隊列 又被別人占用? 等待 (若已經(jīng)被上鎖 ) 已在高速緩沖中 ? 該塊已被修改過 ? 找到合適的塊? 又被別人占用? 將該塊重新插入散列表對 應(yīng)項頭部和空閑隊列尾部 將數(shù)據(jù)寫入設(shè)備 置占用該塊的設(shè)備號塊號 是 設(shè)置該塊引用計數(shù) 1,復(fù)位 有效和修改標(biāo)志 ,并從散列 表和空閑隊列中移出此塊 返回緩沖頭指針 進(jìn)入睡 眠等待 進(jìn)入睡眠狀態(tài) 否 是 否 否 否 是 是 是 否 是 否 9 了。 當(dāng)程序不再需要使用一個緩沖塊中的數(shù)據(jù)時,就調(diào)用 brelse()函數(shù),釋放該緩沖塊并喚醒因等待該緩沖塊而進(jìn)入睡眠狀態(tài)的進(jìn)程。除驅(qū)動程序以外,內(nèi)核其它上層程序?qū)K設(shè)備的讀寫操作需要經(jīng)過高速緩沖區(qū)管理程序來間接地實現(xiàn)。如果所需的數(shù)據(jù)暫時還不在緩沖區(qū)中,則管理程序會通過 ll_rw_block()向塊設(shè)備驅(qū)動程序申請,同時讓程序?qū)?yīng)的進(jìn)程睡眠等待。以宏的形式定義變量參數(shù)列表。 24 include linux/ // 調(diào)度程序頭文件,定義了任務(wù)結(jié)構(gòu) task_struct、初始任務(wù) 0 的數(shù)據(jù), // 還有一些有關(guān)描述符參數(shù)設(shè)置和獲取的嵌入式匯編函數(shù)宏語句。定義了設(shè)置或修改描述符 /中斷門等的嵌入式匯編宏。 // 由連接程序 ld 生成用于表明內(nèi)核代碼末端的變量。 // NR_HASH = 307 項。 35 //// 等待指定緩沖區(qū)解鎖。 40 sleep_on(amp。 42 } 43 //// 系統(tǒng)調(diào)用。 48 49 sync_inodes()。 iNR_BUFFERS 。 // 產(chǎn)生寫設(shè)備塊請求。 62 struct buffer_head * bh。 i++,bh++) { 66 if (bhb_dev != dev) 67 continue。 bhb_dirt) 70 ll_rw_block(WRITE,bh)。 74 for (i=0 。 78 if (bhb_dev == dev amp。 82 } 83 //// 使指定設(shè)備在高速緩沖區(qū)中的數(shù)據(jù)無效。 88 89 bh = start_buffer。 // 繼續(xù)掃描下一塊。 94 if (bhb_dev == dev) 95 bhb_uptodate = bhb_dirt = 0。mount39。我想這是將速度和實用性相結(jié)合的 * 最好方法。 113 void check_disk_change(int dev) 114 { 115 int i。 119 if (!floppy_change(dev amp。 iNR_SUPER 。 126 } 127 // hash 函數(shù)和 hash 表項的計算宏定義。 // 如果該緩沖區(qū)是該隊列的頭一個塊,則讓 hash 表的對應(yīng)項指向本隊列中的下一個緩沖區(qū)。 144 bhb_next_freeb_prev_free = bhb_prev_free。 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。 156 /* put the buffer in new hashqueue if it has a device */ /* 如果該緩沖塊對應(yīng)一個設(shè)備,則將其插入新 hash 隊列中 */ 157 bhb_prev = NULL。 162 hash(bhb_dev,bhb_blocknr) = bh。 166 static struct buffer_head * find_buffer(int dev, int block) 167 { 168 struct buffer_head * tmp。amp。目前 , 這種情況實際上是不會發(fā)生的,但處理的代碼已經(jīng)準(zhǔn)備好了。 188 if (!(bh=find_buffer(dev,block))) 189 return NULL。 // 由于經(jīng)過了睡眠狀態(tài),因此有必要再驗證該緩沖區(qū)塊的正確性,并返回緩沖區(qū)頭指針。 // 如果該緩沖區(qū)所屬的設(shè)備號或塊號在睡眠時發(fā)生了改變,則撤消對它的引用計數(shù),重新尋找。 * * 算法已經(jīng)作了改變:希望能更好,而且一個難以琢磨的錯誤已經(jīng)去除。 // 返回相應(yīng)緩沖區(qū)頭指針。 // 掃描空閑數(shù)據(jù)塊鏈表,尋找空閑緩沖區(qū)。 215 if (tmpb_count) 216 continue。 219 if (!BADNESS(tmp)) 220 break。buffer_wait)。 // 如果該緩沖區(qū)又被其它任務(wù)使用的話,只好重復(fù)上述過程。 231 while (bhb_dirt) { 232 sync_dev(bhb_dev)。 */ // 在高速緩沖 hash 表中檢查指定設(shè)備和塊的緩沖區(qū)是否已經(jīng)被加入進(jìn)去。置引用計數(shù)為 1,復(fù)位修改標(biāo)志和有效 (更新 )標(biāo)志。 // 從 hash 隊列和空閑塊鏈表中移出該緩沖區(qū)頭,讓該緩沖區(qū)用于指定設(shè)備和其上的指定塊。 // 然后根據(jù)此新的設(shè)備號和塊號
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1