




已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Linux進(jìn)程管理 24 04 2020 2 Linux操作系統(tǒng) Linux是一個多用戶 多任務(wù)的操作系統(tǒng) 這就意味著多個用戶可以同時使用一個操作系統(tǒng) 而每個用戶又可以同時運(yùn)行多個命令 在這樣的系統(tǒng)中 各種計算機(jī)資源 如文件 內(nèi)存 CPU等 的分配和管理都以進(jìn)程為單位 為了協(xié)調(diào)多個進(jìn)程對這些共享資源的訪問 操作系統(tǒng)要跟蹤所有進(jìn)程的活動 以及它們對系統(tǒng)資源的使用情況 實施對進(jìn)程和資源的動態(tài)管理 24 04 2020 3 Linux的進(jìn)程及其狀態(tài) 在Linux系統(tǒng)中 進(jìn)程 Process 和任務(wù) Task 是同一個意思 所以 在內(nèi)核的代碼中 這兩個名詞常?;煊?Linux進(jìn)程狀態(tài)在Linux系統(tǒng)中 進(jìn)程有以下幾個狀態(tài) 運(yùn)行態(tài) TASK RUNNING 0 此時 進(jìn)程正在運(yùn)行 即系統(tǒng)的當(dāng)前進(jìn)程 或者準(zhǔn)備運(yùn)行 即就緒態(tài) 等待態(tài)此時進(jìn)程在等待一個事件的發(fā)生或某種系統(tǒng)資源 Linux系統(tǒng)分為兩種等待進(jìn)程 可中斷的 TASK INTERRUPTIBLE 1 和不可中斷的 TASK UNINTERRUPTIBLE 2 可中斷的等待進(jìn)程可以被某一信號 Signal 中斷 而不可中斷的等待進(jìn)程不受信號的打擾 將一直等待硬件狀態(tài)的改變停止態(tài) TASK STOPPED 4 進(jìn)程被停止 通常是通過接收一個信號 正在被調(diào)試的進(jìn)程可能處于停止?fàn)顟B(tài)僵死態(tài) TASK ZOMBIE 3 由于某些原因被終止的進(jìn)程 但是該進(jìn)程的控制結(jié)構(gòu)task struct仍然保留著 24 04 2020 4 Linux進(jìn)程狀態(tài)轉(zhuǎn)換 停止態(tài)TASK STOPPED 正在運(yùn)行態(tài)擁有cpu 就緒態(tài)Task runing 僵死態(tài)TASK ZOMBIE 不可中斷等待態(tài)TASK UNINTERRUPTIBLE 可中斷等待態(tài)TASK INTERRUPTIBLE 進(jìn)程終止do exit 時間片到 進(jìn)程調(diào)度schedule 進(jìn)程跟蹤系統(tǒng)調(diào)用執(zhí)行syscall trace sys exit schedule 未申請到所需資源sleep on schedule interruptible 未申請到所需資源sleep on schedule 收到SIG KILL或SIG CONT后執(zhí)行wake up 所需資源滿足或收到信號wake up interruptible 所需資源滿足wake up 24 04 2020 5 進(jìn)程的模式和類型 在Linux系統(tǒng)中 進(jìn)程的執(zhí)行模式劃分為用戶模式和內(nèi)核模式 如果當(dāng)前運(yùn)行的是用戶程序 應(yīng)用程序或者內(nèi)核之外的系統(tǒng)程序 那么對應(yīng)進(jìn)程就在用戶模式下運(yùn)行 如果在用戶程序執(zhí)行過程中出現(xiàn)系統(tǒng)調(diào)用或者發(fā)生中斷事件 就要運(yùn)行操作系統(tǒng) 即核心 程序 進(jìn)程模式就變成內(nèi)核模式 在內(nèi)核模式下運(yùn)行的進(jìn)程可以執(zhí)行機(jī)器的特權(quán)指令 而且 此時該進(jìn)程的運(yùn)行不受用戶的干預(yù) 即使是root用戶也不能干預(yù)內(nèi)核模式下進(jìn)程的運(yùn)行 按照進(jìn)程的功能和運(yùn)行的程序分類 進(jìn)程可劃分為兩大類 一類是系統(tǒng)進(jìn)程 只運(yùn)行在內(nèi)核模式 執(zhí)行操作系統(tǒng)代碼 完成一些管理性的工作 例如內(nèi)存分配和進(jìn)程切換 另外一類是用戶進(jìn)程 通常在用戶模式中執(zhí)行 并通過系統(tǒng)調(diào)用或在出現(xiàn)中斷 異常時進(jìn)入內(nèi)核模式 24 04 2020 6 有關(guān)進(jìn)程管理的命令 ps命令ps命令是查看進(jìn)程狀態(tài)的最常用的命令 它可以提供關(guān)于進(jìn)程的許多信息 根據(jù)顯示的信息可以確定哪個進(jìn)程正在運(yùn)行 哪個進(jìn)程被掛起 遇到了哪些困難 進(jìn)程已運(yùn)行了多久 進(jìn)程正在使用的資源 進(jìn)程的相對優(yōu)先級 以及進(jìn)程的標(biāo)識號 PID 所有這些信息對用戶都很有用 對于系統(tǒng)管理員來說更為重要 24 04 2020 7 Linux的ps命令格式 ps命令的一般格式是 ps 選項 以下是ps命令常用的選項及其含義 a顯示系統(tǒng)中與tty相關(guān)的所有進(jìn)程的信息 e顯示所有進(jìn)程的信息 f顯示進(jìn)程的所有信息 l以長格式顯示進(jìn)程信息 r只顯示正在運(yùn)行的進(jìn)程 u顯示面向用戶的格式 包括用戶名 CPU及內(nèi)存使用情況等信息 x顯示所有非控制終端上的進(jìn)程信息 pid顯示由進(jìn)程ID指定的進(jìn)程的信息 tty顯示指定終端上的進(jìn)程的信息 24 04 2020 8 Linux的命令ps顯示的信息項 UID進(jìn)程屬主的用戶ID號PID進(jìn)程ID號PPID父進(jìn)程的ID號C進(jìn)程最近使用CPU的估算 STIME進(jìn)程開始時間 以 小時 分 秒 的形式給出TTY該進(jìn)程建立時所對應(yīng)的終端 表示該進(jìn)程不占用終端TIME報告進(jìn)程累計使用的CPU時間 注意 盡管覺得有些命令 如sh 已經(jīng)運(yùn)轉(zhuǎn)了很長時間 但是它們真正使用CPU的時間往往很短 所以 該字段的值往往是0 00CMD是command 命令 的縮寫 往往表示進(jìn)程所對應(yīng)的命令名 24 04 2020 9 Linux的命令ps顯示的信息項 命令ps auxUSER啟動進(jìn)程的用戶 CPU運(yùn)行該進(jìn)程占用CPU的時間與該進(jìn)程總的運(yùn)行時間的比例 MEM該進(jìn)程占用內(nèi)存和總內(nèi)存的比例VSZ虛擬內(nèi)存的大小 以KB為單位RSS占用實際內(nèi)存的大小 以KB為單位STAT表示進(jìn)程的運(yùn)行狀態(tài) 包括以下幾種代碼 D不可中斷的睡眠 R就緒 在可運(yùn)行隊列中 S睡眠 T被跟蹤或停止 Z終止 僵死 的進(jìn)程 24 04 2020 10 Linux的kill命令 通常終止一個前臺進(jìn)程可以使用 Ctrl C 組合鍵 但是 對于一個后臺進(jìn)程就須用kill命令來終止 kill命令是通過向進(jìn)程發(fā)送指定的信號來結(jié)束相應(yīng)進(jìn)程 默認(rèn)情況下 采用編號為15的TERM信號 TERM信號將終止所有不能捕獲該信號的進(jìn)程 對于那些可以捕獲該信號的進(jìn)程就要用編號為9的KILL信號 強(qiáng)行殺掉該進(jìn)程 24 04 2020 11 Linuxkill命令的格式 kill s信號 p a 進(jìn)程號 kill l 信號 其中選項各選項的含義如下 s指定需要發(fā)送的信號 既可以是信號名 如KILL 也可以是對應(yīng)信號的號碼 如9 p指定kill命令只是顯示進(jìn)程的pid 進(jìn)程標(biāo)識號 并不真正發(fā)出結(jié)束信號 l顯示信號名稱列表 這也可以在 usr include linux signal h文件中找到 24 04 2020 12 使用kill命令時應(yīng)注意 1 kill命令可以帶信號號碼選項 也可以不帶 如果沒有信號號碼 kill命令就會發(fā)出終止信號 TERM 這個信號可以殺掉沒有捕獲到該信號的進(jìn)程 也可以用kill向進(jìn)程發(fā)送特定的信號 例如 kill 21234它的效果等同于在前臺運(yùn)行PID為1234的進(jìn)程的時候 按下 Ctrl C 但是普通用戶只能使用不帶signal參數(shù)的kill命令 或者最多使用 9信號 2 kill可以帶有進(jìn)程ID號作為參數(shù) 當(dāng)用kill向這些進(jìn)程發(fā)送信號時 必須是這些進(jìn)程的主人 如果試圖撤銷一個沒有權(quán)限撤銷的進(jìn)程 或者撤銷一個不存在的進(jìn)程 就會得到一個錯誤信息 24 04 2020 13 使用kill命令時應(yīng)注意 3 可以向多個進(jìn)程發(fā)信號 或者終止它們 4 當(dāng)kill成功地發(fā)送了信號 Shell會在屏幕上顯示出進(jìn)程的終止信息 有時這個信息不會馬上顯示 只有當(dāng)按下回車鍵使Shell的命令提示符再次出現(xiàn)時才會顯示出來 5 信號使進(jìn)程強(qiáng)行終止常會帶來一些副作用 比如數(shù)據(jù)丟失或終端無法恢復(fù)到正常狀態(tài) 發(fā)送信號時必須小心 只有在萬不得已時才用kill信號 9 因為進(jìn)程不能首先捕獲它 要撤銷所有的后臺作業(yè) 可以鍵入 kill0 因為有些在后臺運(yùn)行的命令會啟動多個進(jìn)程 跟蹤并找到所有要殺掉的進(jìn)程的PID是件很麻煩的事 這時 使用 kill0 來終止所有由當(dāng)前Shell啟動的進(jìn)程是個有效的方法 24 04 2020 14 Linux的sleep命令 sleep命令的功能是使進(jìn)程暫停執(zhí)行一段時間 其一般格式是 sleep時間值其中 時間值 參數(shù)以秒為單位 即使進(jìn)程暫停由時間值所指定的秒數(shù) 此命令大多用于Shell程序設(shè)計中 使兩條命令執(zhí)行之間停頓指定的時間 24 04 2020 15 Linux進(jìn)程的數(shù)據(jù)結(jié)構(gòu) 在Linux中 進(jìn)程用task struct表示 所有進(jìn)程被組織到以init task為表頭的雙向鏈表中 見 include linux sched h SET LINKS 宏 該鏈表是全系統(tǒng)唯一的 系統(tǒng)維護(hù)一個名為task的數(shù)組 task包含指向系統(tǒng)所有進(jìn)程的task struct結(jié)構(gòu)的指針 task數(shù)組默認(rèn)值為512 Linux從系統(tǒng)內(nèi)存分配一個task struct結(jié)構(gòu)并將其加入task數(shù)組 當(dāng)前運(yùn)行進(jìn)程的結(jié)構(gòu)用current指針指示 24 04 2020 16 Linux內(nèi)核0 11task struct 進(jìn)程控制塊是task struct結(jié)構(gòu) 在include linux sched h中定義task struct結(jié)構(gòu)體中各數(shù)據(jù)項含義 24 04 2020 17 Linux內(nèi)核0 11的task struct structtask struct therearehardcoded don ttouch longstate 1unrunnable runnable 0stoped longcounter longpriority longsignal structsigactionsigaction 32 longblocked bitmapofmaskedsignals intexit code variousfields unsignedlongstart code end code end data brk start stack longpid father pgrp session leader unsignedshortuid euid suidunsignedshortgid egid sgid longalarm longutime stime cutime cstime start time unsignedshortused math filesysteminfo inttty 1ifnotty soitmustbesigned unsignedshortumask structm inode pwd structm inode root structm inode executable unsignedlongclose on exec structfile filp NR OPEN ldtforthistask0 zero1 cs2 ds 24 04 2020 18 Linuxtask struct的信息分類 進(jìn)程的狀態(tài)信息進(jìn)程調(diào)度信息進(jìn)程標(biāo)識信息進(jìn)程通信信息進(jìn)程的鏈接信息進(jìn)程的時間和定時器信息有關(guān)文件系統(tǒng)的信息虛擬內(nèi)存信息進(jìn)程上下文信息其它信息 24 04 2020 19 Linux的PCB task struct stateLinux的進(jìn)程狀態(tài)主要分為三類 可運(yùn)行的 TASK RUNNING 相當(dāng)于運(yùn)行態(tài)和就緒態(tài) 被掛起的 TASK INTERRUPTIBLE TASK UNINTERRUPTIBLE和TASK STOPPED 不可運(yùn)行的 TASK ZOMBIE 調(diào)度器主要處理的是可運(yùn)行和被掛起兩種狀態(tài)下的進(jìn)程 其中TASK STOPPED又專門用于SIGSTP等IPC信號的響應(yīng) 而TASK ZOMBIE指的是已退出而暫時沒有被父進(jìn)程收回資源的 僵尸 進(jìn)程 need resched布爾值 在調(diào)度器中用于表示該進(jìn)程需要申請調(diào)度 24 04 2020 20 Linux的PCB task struct policy在Linux2 4中 進(jìn)程的調(diào)度策略可以有三種選擇 SCHED FIFO 先進(jìn)先出式調(diào)度 除非有更高優(yōu)先級進(jìn)程申請運(yùn)行 否則該進(jìn)程將保持運(yùn)行至退出才讓出CPU SCHED RR 輪轉(zhuǎn)式調(diào)度 該進(jìn)程被調(diào)度下來后將被置于運(yùn)行隊列的末尾 以保證其他實時進(jìn)程有機(jī)會運(yùn)行 SCHED OTHER 常規(guī)的分時調(diào)度策略 另外 policy中還包含了一個SCHED YIELD位 置位時表示主動放棄CPU rt priority用于表征實時進(jìn)程的優(yōu)先級 從1 99取值 非實時進(jìn)程該項應(yīng)該為0 這一屬性將用于調(diào)度時的權(quán)值計算 詳見 就緒進(jìn)程選擇算法 counter該屬性記錄的是當(dāng)前時間片內(nèi)該進(jìn)程還允許運(yùn)行的時間 以CPU時鐘tick值為單位 每個進(jìn)程的counter初值與nice值有關(guān) nice越小則counter越大 即優(yōu)先級越高的進(jìn)程所允許獲得的CPU時間也相對越多 并參與 就緒進(jìn)程選擇算法 在Linux2 4中 每個 非SCHED FIFO實時 進(jìn)程都不允許運(yùn)行大于某一時間片的時間 一旦超時 調(diào)度器將強(qiáng)制選擇另一進(jìn)程運(yùn)行 詳見 調(diào)度器工作流程 24 04 2020 21 Linux的PCB task struct nice用戶可支配的進(jìn)程優(yōu)先級 將參與 就緒進(jìn)程選擇算法 同時該值也決定了該進(jìn)程的時間片長度cpus allowed以位向量的形式表示可用于該進(jìn)程運(yùn)行的CPU 見 調(diào)度器工作流程 cpus runnable以位向量的形式表示當(dāng)前運(yùn)行該進(jìn)程的CPU 相應(yīng)位為1 如果不在任何CPU上運(yùn)行 則為全1 這一屬性和cpus allowed屬性結(jié)合 可以迅速判斷該進(jìn)程是否能調(diào)度到某一CPU上運(yùn)行 位 與 24 04 2020 22 Linux的PCB task struct processor本進(jìn)程當(dāng)前 或最近 所在CPU編號thread用于保存進(jìn)程執(zhí)行環(huán)境 各個寄存器的值以及IO操作許可權(quán)映射表 內(nèi)容與TSS相近 因為TSS以CPUid為索引 而Linux無法預(yù)測被替換下來的進(jìn)程下一次將在哪個CPU上運(yùn)行 所以這些信息不能保存在TSS中current核心經(jīng)常需要獲知當(dāng)前在某CPU上運(yùn)行的進(jìn)程的task struct 在Linux中用current指針指向這一描述符 current的實現(xiàn)采用了一個小技巧以獲得高效的訪問速度 這個小技巧與Linux進(jìn)程task struct的存儲方式有關(guān) 24 04 2020 23 Linux的PCB task struct schedule datatask struct是用于描述進(jìn)程的數(shù)據(jù)結(jié)構(gòu) 其中包含了指向所運(yùn)行CPU的屬性 在Linux中 另有一個數(shù)據(jù)結(jié)構(gòu)對應(yīng)于CPU 可以利用它訪問到某CPU上運(yùn)行的進(jìn)程 這個數(shù)據(jù)結(jié)構(gòu)定義為schedule data結(jié)構(gòu) 包含兩個屬性 curr指針 指向當(dāng)前運(yùn)行于該CPU上的進(jìn)程的task struct 通常用cpu curr cpu 宏來訪問 last schedule時間戳 記錄了上一次該CPU上進(jìn)程切換的時間 通常用last schedule cpu 宏來訪問 為了使該數(shù)據(jù)結(jié)構(gòu)的訪問能與CPU的Cacheline大小相一致 schedule data被組織到以SMP CACHE BYTES為單位的aligned data聯(lián)合數(shù)組中 系統(tǒng)中每個CPU對應(yīng)數(shù)組上的一個元素 24 04 2020 24 Linux就緒進(jìn)程選擇算法 Linuxschedule 函數(shù)將遍歷就緒隊列中的所有進(jìn)程 調(diào)用goodness 函數(shù)計算每一個進(jìn)程的權(quán)值weight 從中選擇權(quán)值最大的進(jìn)程投入運(yùn)行 進(jìn)程調(diào)度權(quán)值的計算分為實時進(jìn)程和非實時進(jìn)程兩類 對于非實時進(jìn)程 SCHED OTHER 影響權(quán)值的因素主要有以下四個 進(jìn)程當(dāng)前時間片內(nèi)所剩的tick數(shù) 即task struct的counter值 相當(dāng)于counter越大的進(jìn)程獲得CPU的機(jī)會也越大 因為counter的初值與 nice 相關(guān) 因此這一因素一方面代表了進(jìn)程的優(yōu)先級 另一方面也代表了進(jìn)程的 欠運(yùn)行程度 weight p counter 進(jìn)程上次運(yùn)行的CPU是否就是當(dāng)前CPU 如果是 則權(quán)值增加一個常量 表示優(yōu)先考慮不遷移CPU的調(diào)度 因為此時Cache信息還有效 weight PROC CHANGE PENALTY 此次切換是否需要切換內(nèi)存 如果不需要 或者是同一進(jìn)程的兩個線程間的切換 或者是沒有mm屬性的核心線程 則權(quán)值加1 表示 稍微 優(yōu)先考慮不切換內(nèi)存的進(jìn)程 weight 1 24 04 2020 25 Linux就緒進(jìn)程選擇算法 進(jìn)程的用戶可見的優(yōu)先級nice nice越小則權(quán)值越大 Linux中的nice值在 20到 19之間選擇 缺省值為0 nice 系統(tǒng)調(diào)用可以用來修改優(yōu)先級 weight 20 p nice 對于實時進(jìn)程 SCHED FIFO SCHED RR 權(quán)值大小僅由該進(jìn)程的rt priority值決定 weight 1000 p rt priority 1000的基準(zhǔn)量使得實時進(jìn)程的權(quán)值比所有非實時進(jìn)程都要大 因此只要就緒隊列中存在實時進(jìn)程 調(diào)度器都將優(yōu)先滿足它的運(yùn)行需要 如果權(quán)值相同 則選擇就緒隊列中位于前列的進(jìn)程投入運(yùn)行 除了以上標(biāo)準(zhǔn)值以外 goodness 還可能返回 1 表示該進(jìn)程設(shè)置了SCHED YIELD位 此時 僅當(dāng)不存在其他就緒進(jìn)程時才會選擇它 如果遍歷所有就緒進(jìn)程后 weight值為0 表示當(dāng)前時間片已經(jīng)結(jié)束了 此時將重新計算所有進(jìn)程 不僅僅是就緒進(jìn)程 的counter值 再重新進(jìn)行就緒進(jìn)程選擇 詳見 調(diào)度器工作流程 24 04 2020 26 Linux的調(diào)度器 Linux的調(diào)度器主要實現(xiàn)在schedule 函數(shù)中 調(diào)度器工作流程schedule 函數(shù)的基本流程可以概括為四步 1 清理當(dāng)前運(yùn)行中的進(jìn)程2 選擇下一個投入運(yùn)行的進(jìn)程3 設(shè)置新進(jìn)程的運(yùn)行環(huán)境4 執(zhí)行進(jìn)程上下文切換5 后期整理其中包含了一些鎖操作 就緒隊列鎖runquque lock 全局核心鎖kernel flag 全局中斷鎖global irq lock 進(jìn)程列表鎖tasklist lock 24 04 2020 27 Linux內(nèi)核0 11進(jìn)程的創(chuàng)建 進(jìn)程創(chuàng)建程序fork cfork c是sys fork 在kernel system call s中 系統(tǒng)調(diào)用的輔助處理函數(shù)集sys fork 其中給出了sys fork 系統(tǒng)調(diào)用中使用的兩個C語言函數(shù)find empty process 為新進(jìn)程取得不重復(fù)的進(jìn)程號copy process 用于創(chuàng)建并復(fù)制進(jìn)程的代碼段和數(shù)據(jù)段以及環(huán)境還包括進(jìn)程呢哦存區(qū)域驗證和內(nèi)存分配函數(shù)Verify area 24 04 2020 28 fork c的主要工作 為task struct申請空閑內(nèi)存頁 并填入新進(jìn)程標(biāo)識號和其他內(nèi)容調(diào)用find empty process 尋找空閑的進(jìn)程槽 processstot 為kernel task page申請內(nèi)存空閑頁面復(fù)制父進(jìn)程的LDP復(fù)制父進(jìn)程的mmap建立文件系統(tǒng)有關(guān)信息 包括文件描述符和i節(jié)點等 24 04 2020 29 Linux進(jìn)程的撤銷exit c 24 04 2020 30 設(shè)計Linux系統(tǒng)調(diào)用 用戶接口添加系統(tǒng)調(diào)用添加源代碼 添加到內(nèi)核文中的一個函數(shù)函數(shù)名前綴sys 作為系統(tǒng)調(diào)用的標(biāo)志Asmlinkageintsys yang inti intj j i i returnj 添加代碼到文件 usr src linux kernel sys c鏈接新的系統(tǒng)調(diào)用目的 讓內(nèi)核其它部分知道它的存在打開 usr src linux include asm i386 unistd h該文件包含了系統(tǒng)調(diào)用的清單 用來給每個系統(tǒng)調(diào)用分配一個唯一的編號 24 04 2020 31 Linux系統(tǒng)調(diào)用 續(xù) 系統(tǒng)調(diào)用號的定義 define NR nameNNN其中NNN為定義的號 name為新的系統(tǒng)調(diào)用名稱新的定義添加到unist h文件的最后在 usr src linux arch i386 kernel entry S的最后添加代碼 longSYSMBOL NAME sys yang 重新編譯內(nèi)核以root登錄 進(jìn)入 usr src linux目錄 重建內(nèi)核 makemenuconfig 配置新內(nèi)核 makedep 創(chuàng)建新內(nèi)核 makemodules indtall 加入模塊 makeclean 清除多余創(chuàng)建的文件 makebzImage 生成可執(zhí)行內(nèi)核引導(dǎo)文件 makeinstall 安裝新內(nèi)核重新啟動系統(tǒng)即可 24 04 2020 32 Linux系統(tǒng)調(diào)用 續(xù) 編程 test c 調(diào)用自己的系統(tǒng)調(diào)用 include include syscall1 char yang int ret main intx y x 100 y yang x printf Thisistheresultofnewkernel n printf d n y 24 04 2020 33 Linux系統(tǒng)調(diào)用 續(xù) 編譯程序gcc o I usr src linux 2 4 20 8 includetesttest c運(yùn)行 test 24 04 2020 34 設(shè)計動態(tài)模塊 模塊的組織 include 說明是個內(nèi)核功能 include 說明是個模塊 其他header信息intinit module 聲明是一個模塊 加載時 初始化模塊的編碼 期望實現(xiàn)的其它功能 如read ioctl 等函數(shù)voidcleanup module 卸載時 注銷模塊的編碼 24 04 2020 35 模塊編程 模塊的編譯 gcc O2 g Wall DMODULE D KERNEL cfilename c filename c為自己編寫的模塊程序源代碼文件模塊的加載insmod命令模塊的卸載rmmod命令 24 04 2020 36 模塊編程 一個例子testmodule c defineMODULE include include ifCONFIG MODVERSION 1 defineMODVERSIONS include endifintinit module printk Hello Thisisatestingmodule n return0 voidcleanup module printk Sorry Thetestingmoduleisunloadingnow n 24 04 2020 37 模塊編程 模塊的編譯 加載與卸載編譯 gcc O2 g Wall DMODULE D KERNEL ctestmodule c testmodule c為自己編寫的模塊程序源代碼文件加載 insmod ftestmodule o卸載 rmmodtestmodule 24 04 2020 38 Ext文件系統(tǒng)minix文件系統(tǒng)結(jié)構(gòu)文件名14個字符塊設(shè)備最大容量64M 8 8 1024 1024 1024 1024 EXT2文件系統(tǒng) minix文件系統(tǒng) 24 04 2020 39 EXT2文件系統(tǒng) 磁盤布局 Ext文件系統(tǒng)Minix的第一次擴(kuò)展文件名最大長度255個字符磁盤分區(qū)大小可達(dá)2GBExt2文件系統(tǒng) 第二代擴(kuò)展文件系統(tǒng)磁盤分區(qū)大小可達(dá)4TB磁盤布局采用了組塊 24 04 2020 40 EXT2文件系統(tǒng) 引導(dǎo)塊和超級塊 引導(dǎo)塊BootBlock每個硬盤分區(qū)的開頭1024字節(jié) 即0byte至1023byte是分區(qū)的啟動扇區(qū) 存放由ROMBIOS自動讀入的引導(dǎo)程序和數(shù)據(jù) 但這只對引導(dǎo)設(shè)備有效 而對于非引導(dǎo)設(shè)備 該引導(dǎo)塊不含代碼 這個塊與ext2沒有任何關(guān)系 超級塊SuperBlock分區(qū)剩余的部分被分為若干個組 每個組里均由一個superblock塊和一個GroupDescriptors 組描述符 塊組成 Group0中的superblock被內(nèi)核所用 定義了諸如文件系統(tǒng)的靜態(tài)結(jié)構(gòu) 包括塊的大小 總塊數(shù) 每組內(nèi)inode數(shù) 空閑塊 索引結(jié)點數(shù)等全局信息 其他Group中的SuperBlock則僅是Group0中的SuperBlock的一個拷貝 超級塊的數(shù)據(jù)結(jié)構(gòu)在ext2 fs h定義為structext2 super blockLinux啟動時superblock0的內(nèi)容讀入內(nèi)存 某個組損壞可用來恢復(fù) 24 04 2020 41 EXT2文件系統(tǒng) 超級塊 structext2 super blockTypeField釋意 u32s inodes count 索引結(jié)點的總數(shù) u32s blocks count 文件系統(tǒng)塊的總數(shù) u32s r blocks count 為超級用戶保留的塊數(shù) u32s free blocks count 空閑塊總數(shù) u32s free inodes count 空閑索引節(jié)點總數(shù) u32s first data block 文件系統(tǒng)中第一個數(shù)據(jù)塊 u32s log block size 用于計算邏輯塊的大小 s32s log frag size 用于計算片的大小 u32s blocks per group 每個組的塊個數(shù) u32s frags per group 每個組的片個數(shù) u32s inodes per group 每個組的索引節(jié)點數(shù) u32s mtime 文件系統(tǒng)的安裝時間 u32s wtime 最后一次對超級塊進(jìn)行寫的時間 u16s mnt count 安裝計數(shù) s16s max mnt count 最大可安裝計數(shù) 24 04 2020 42 EXT2文件系統(tǒng) 超級塊 u16s magic 用于確定文件系統(tǒng)版本的標(biāo)志 ext2 0 xEF53 u16s state 文件系統(tǒng)狀態(tài) u16s errors 當(dāng)檢測到錯誤時如何處理 u16s minor rev level 次版本號 u32s lastcheck 最后一次檢測文件系統(tǒng)狀態(tài)的時間 u32s checkinterval 兩次對文件系統(tǒng)狀態(tài)進(jìn)行檢測的最大可能時間間隔 u32s rev level 版本號 以此識別是否支持某些功能 u16s def fesuid 保留塊的默認(rèn)用戶標(biāo)識UID u16s def fesgid 保留塊的默認(rèn)用戶組標(biāo)識GID u32s first ino 第一個非保留的索引節(jié)點號 u16s inode size 索引結(jié)點結(jié)構(gòu)的大小 u16s block group nr 本Superblock所在的塊組號 u32s reserved 230 保留 Paddingtotheendoftheblock 注意文件系統(tǒng)的狀態(tài) 沒錯 defineEXT2 valid fs0 x0001有錯 defineEXT2 ERROR fs0 x0002 24 04 2020 43 EXT2文件系統(tǒng) 組描述符 組描述符GroupDescriptors定義了塊位圖的塊號 索引結(jié)點位圖的塊號 索引結(jié)點表的起始塊號 本組空閑塊的個數(shù)等組內(nèi)信息 文件系統(tǒng)根據(jù)這些信息來查找數(shù)據(jù)塊位圖 索引結(jié)點位圖 索引結(jié)點表的位置 數(shù)據(jù)結(jié)構(gòu)在ext2 fs h中定義 structext2 group desc TypeField釋意 u32bg block bitmap 指向該組中塊位圖所在塊的指針 u32bg inode bitmap 指向該組中塊節(jié)點位圖所在塊的指針 u32bg inode table 指向該組中節(jié)點的首塊的指針 u16bg free blocks count 本組空閑塊的個數(shù) u16bg free inodes count 本組空閑索引節(jié)點的個數(shù) u16bg used dirs count 本組分配給目錄的節(jié)點數(shù) u16bg pad 填充 u32bg reserved 保留 24 04 2020 44 EXT2文件系統(tǒng) 數(shù)據(jù)塊及數(shù)據(jù)塊位圖 數(shù)據(jù)塊位圖DataBlockBitmap這是ext2管理存儲空間的方法 即位圖法 每個位對應(yīng)一個數(shù)據(jù)塊 位值為0表示空閑 1表示已經(jīng)分配 數(shù)據(jù)塊位圖定義為一個塊大小 于是 一個組中的數(shù)據(jù)塊個數(shù)就決定了 假設(shè)塊大小為b字節(jié) 可以區(qū)別的塊數(shù)為b 8個數(shù)據(jù)塊DataBlocks每個組的數(shù)據(jù)最大個數(shù)是在塊大小定義后就確定了的 所以組容量也就確定了 假設(shè)塊大小為b字節(jié) 那么組容量就確定為 b 8 b字節(jié)若1塊 4K 則組塊大小 4K 8 4K 128M 24 04 2020 45 EXT2文件系統(tǒng) 索引節(jié)點位圖及索引節(jié)點 索引結(jié)點位圖InodeBitmap與數(shù)據(jù)塊位圖相似 用來表示索引結(jié)點是否已經(jīng)被使用 假設(shè)塊大小為b字節(jié) 每個索引結(jié)點數(shù)據(jù)結(jié)構(gòu)大小為128字節(jié) 最多可以有b 8個索引結(jié)點 索引結(jié)點表需要占用的存儲空間大小為 b 8 128字節(jié) 即 b 8 128 b 8 128個塊索引結(jié)點Inode索引結(jié)點表由若干個索引結(jié)點數(shù)據(jù)結(jié)構(gòu)組成 需要占用若干個塊 Ext2中的每個索引結(jié)點數(shù)據(jù)結(jié)構(gòu)大小為128字節(jié) 每個索引結(jié)點即對應(yīng)一個文件或是目錄 是對其除文件名 目錄名 以外的所有屬性的描述 例如 文件類型 文件創(chuàng)建時間 訪問時間 修改時間 文件所占數(shù)據(jù)塊的個數(shù) 指向數(shù)據(jù)塊的指針 其中 數(shù)據(jù)塊指針是由15個元組的數(shù)據(jù)組成 24 04 2020 46 EXT2文件系統(tǒng) 索引節(jié)點位圖及索引節(jié)點 前12個元組 0至11 直接指向數(shù)據(jù)塊 第12號元組 12 是一個1級子索引 指向的不是數(shù)據(jù)塊 而是存放數(shù)據(jù)塊指針的塊 類似的 第13號元組 13 是一個2級子索引 第14號元組 14 是一個3級子索引 這種結(jié)構(gòu)可以適應(yīng)大文件的存儲 假設(shè)文件塊大小為b 則當(dāng)文件長度小于b 12時 只要用前12個元組來指向其數(shù)據(jù)塊 當(dāng)文件長度大于b 12時 則用多級索引機(jī)制來指向其數(shù)據(jù)塊 這體現(xiàn)了Ext2的文件的物理結(jié)構(gòu) 即索引文件 使用索引結(jié)點來指向文件的數(shù)據(jù)塊 并且索引結(jié)點本身是聚集在一起的 24 04 2020 47 24 04 2020 48 EXT2文件系統(tǒng) 索引節(jié)點定義 索引節(jié)點定義ext2 fs h中的structext2 inodestructext2 inode TypeField釋意 u16i mode 文件類型及訪問權(quán)限 u16i uid 文件擁有者的標(biāo)識號UID u32i size 文件大小大小 字節(jié) u32i atime 最后一次訪問時間 u32i ctime 創(chuàng)建時間 u32i mtime 該文件內(nèi)容最后修改時間 u32i dtime 文件刪除時間 u16i gid 文件的用戶組的組號 u16i links count 文件的鏈接計數(shù) u32i blocks 文件的數(shù)據(jù)塊個數(shù) 以512字節(jié)計 u32i flags 打開文件的方式 u32 i block EXT2 N BLOCKS 指向數(shù)據(jù)塊的指針數(shù)組 u32i generation 文件的版本號 用于NFS u32i file acl 文件訪問控制表 ACL已不再使用 u32i dir acl 目錄訪問控制表 ACL已不再使用 u8l i frag 每塊中的片數(shù) u8l i fsize 片的大小 u32l i reserved 保留 24 04 2020 49 EXT2文件系統(tǒng) 目錄與文件 目錄與文件不是所有的文件都需要數(shù)據(jù)塊 有些文件只需要索引結(jié)點即可 Ext2中 目錄是一種特殊的文件 其數(shù)據(jù)塊中的內(nèi)容即目錄表 所包含的文件 當(dāng)然也包括子目錄 的文件名 指向文件的索引節(jié)點號 文件類型 ext2 fs h中數(shù)據(jù)結(jié)構(gòu)的定義 structext2 dir entry 2 u32inode 索引節(jié)點號 u16rec len 目錄項長度 u8name len 文件名長度 u8file type 文件類型 1 普通文件 2 目錄 char name EXT2 NAME LEN 文件名 其中MAX NAME LEN定義為255 即文件名最大長度為255個字符 字節(jié) 同時 目錄項取為4的整數(shù) 故 目錄項的長度范圍是12至264字節(jié) 24 04 2020 50 EXT2文件系統(tǒng) 目錄與文件 目錄文件的數(shù)據(jù)塊實例其中 inode指向0的那一行 表示此文件已經(jīng)被刪除 同時 上一行的目錄項長度擴(kuò)展為兩者之和 12 16 24 04 2020 51 EXT2文件系統(tǒng) 文件的類型 文件類型Ext2中文件類型有以下幾種 文件類型號描述0未知1普通文件2目錄3字符設(shè)備4塊設(shè)備5管道 Pipe 6套接字7符號指針 24 04 2020 52 EXT2文件系統(tǒng)的操作 兩個概念文件系統(tǒng)的設(shè)計目標(biāo)在于 一方面 從用戶的角度看 實現(xiàn) 按名取存 文件系統(tǒng)的用戶只要知道所需文件的文件名 就可存取文件中的信息 而無需知道這些文件究竟存放在什么地方 另一方面 從系統(tǒng)角度看 文件系統(tǒng)對文件存儲器的存儲空間進(jìn)行組織 分配和回收 負(fù)責(zé)文件的存儲 檢索 共享和保護(hù) 用戶角度的文件系統(tǒng)被稱為VFS 虛擬文件系統(tǒng) 定義在這個層次上的操作 對于用戶來說是文件系統(tǒng)所呈現(xiàn)所有屬性 比如 列目錄 建立目錄 建立文件 打開文件 讀寫文件 重命名文件等 與每個操作相對應(yīng)的是實際文件系統(tǒng)中的一系列底層操作 24 04 2020 53 EXT2文件系統(tǒng)的操作 索引結(jié)點操作 24 04 2020 54 EXT2文件系統(tǒng)的操作 文件操作 24 04 2020 55 EXT2硬盤空間管理 存儲空間的分配回收需要考慮兩個因素避免文件碎片時效Ext2中新建立的文件并不是馬上就分配數(shù)據(jù)塊 而是分配索引結(jié)點 當(dāng)有數(shù)據(jù)存入時 再分配數(shù)據(jù)塊 故存儲空間的分配與回收也分成兩個部分索引結(jié)點的創(chuàng)建與刪除數(shù)據(jù)塊的分配與回收 24 04 2020 56 EXT2硬盤空間管理 創(chuàng)建索引結(jié)點 創(chuàng)建索引結(jié)點Ext2使用ext2 new inode 來創(chuàng)建一個新的索引結(jié)點 創(chuàng)建成功則返回索引結(jié)點號 否則返回NULL 這個函數(shù)包括了以下幾個步驟 get empty inode 返回一個空結(jié)點 lock super 互斥操作 即對superblock的P 操作 如果索引結(jié)點是目錄 則將其分配到空閑塊最多的組中 如果索引結(jié)點不是目錄 則從頭開始 順序查找 一個空結(jié)點分配給該文件 順序查找 的算法是 24 04 2020 57 EXT2硬盤空間管理 創(chuàng)建索引結(jié)點 load inode bitmap 載入選中的組的索引結(jié)點位圖塊 找到選擇首個空閑索引結(jié)點 分配之 并將對應(yīng)位圖位填成1 將組描述符中的空閑索引結(jié)點個數(shù)減1 將SuperBlock中的空閑索引結(jié)點個數(shù)減1 填充剛剛分配的索引結(jié)點的數(shù)據(jù)結(jié)構(gòu) 比如 文件屬性 創(chuàng)建時間 訪問時間等等 將新的索引結(jié)點插入索引結(jié)點hash表 加速查詢 mark indoe dirty 將索引結(jié)點號填入superblock的dirtyinodelist中 unlock super 互斥操作完畢 解鎖 即 對superblock的V 操作 返回新分配的索引結(jié)點號 24 04 2020 58 EXT2硬盤空間管理 索引結(jié)點的刪除 索引結(jié)點的刪除Ext2使用ext2 free inode 來刪除一個索引結(jié)點 在此之前 內(nèi)核必須已經(jīng)事先完成了一系列的操作 刪除文件占用的數(shù)據(jù)塊 索引結(jié)點已經(jīng)從hash表中刪除 包含該索引結(jié)點的目錄中索引結(jié)點號置0 前一個目錄項長度重新計算等 此函數(shù)包含以下步驟 lock super 互斥操作 對superblock加鎖 根據(jù)索引結(jié)點號以及索引結(jié)點總數(shù)來計算該索引結(jié)點所在的組號 load inode bitmap 從所在的組中調(diào)入索引結(jié)點位圖 將對應(yīng)位置0 clear inode 釋放該索引結(jié)點所占用的cache空間 將組描述符中的空閑索引結(jié)點個數(shù)增1 將SuperBlock中的空閑索引結(jié)點個數(shù)增1 從SuperBlock的dirtyinodelist中清除該索引結(jié)點 uplock super 互斥操作完畢 對superblock解鎖 24 04 2020 59 EXT2硬盤空間管理 數(shù)據(jù)塊尋址 數(shù)據(jù)塊尋址ext2的單個文件所占有的數(shù)據(jù)塊組織方式 在 硬盤數(shù)據(jù)結(jié)構(gòu) 部分中已經(jīng)分析過了 即15個元組長度的數(shù)據(jù) 前12個直接指向數(shù)據(jù)塊 后3個分別采用1級 2級 3級索引方法 最大可支持的文件大小為2TB 塊大小 文件大小上限與索引級數(shù)的關(guān)系如下圖 24 04 2020 60 EXT2硬盤空間管理 分配數(shù)據(jù)塊 分配數(shù)據(jù)塊內(nèi)核使用ext2 getblk 函數(shù)給需要數(shù)據(jù)空間的文件分配數(shù)據(jù)塊 多個塊與文件間的組織形式即前面所述的數(shù)據(jù)塊尋址方式 多級索引 為了在ext2分區(qū)中找到空閑的數(shù)據(jù)塊 ext2使用ext2 alloc block 函數(shù) 為了減少文件的碎片 Ext2文件系統(tǒng)盡量從已經(jīng)分配給該文件的最后一個數(shù)據(jù)塊開始尋找空閑塊 Ext2采用了預(yù)先分配數(shù)據(jù)塊的方法 文件不僅僅得到其所申請的數(shù)據(jù)塊 還得被預(yù)先 額外 分配了最多達(dá)8個的連續(xù)數(shù)據(jù)塊 Ext2 inode info數(shù)據(jù)結(jié)構(gòu)中 i prealloc count域保存了預(yù)先分配給文件而沒有被使用的數(shù)據(jù)塊 而I prealloc block域則保存著下一個將被預(yù)分配的塊號 24 04 2020 61 EXT2硬盤空間管理 分配數(shù)據(jù)塊 Ext2 alloc block 及Ext2 getblk 的工作細(xì)節(jié) Ext2 alloc block 函數(shù)得到一個指向索引結(jié)點和goal的指針 Goal 是一個代表下一個將被分配的最優(yōu)新塊的邏輯塊號 Ext2 getblk 根據(jù)以下規(guī)則來設(shè)置goal參數(shù) 即判斷最優(yōu)的原則 如果已經(jīng)被分配以及預(yù)先被分配給文件的塊 是連續(xù)的塊的話 goal即預(yù)先分配的數(shù)據(jù)塊的邏輯塊號加1 如果上述規(guī)則不滿足 并且至少一個塊已經(jīng)被預(yù)先分配 則goal即這些預(yù)先分配的數(shù)據(jù)塊中的某個塊的邏輯塊號 如果上述規(guī)則不滿足 則goal即為文件的索引結(jié)點所在的組的第一個數(shù)據(jù)塊的邏輯塊號 Ext2 alloc block 函數(shù)檢查goal是否指向一個預(yù)先分配給該文件的一個塊 是 則返回該塊的邏輯塊號 否則 忽略所有已經(jīng)預(yù)分配的塊 調(diào)用ext2 new block 函數(shù) 查找新的空閑數(shù)據(jù)塊 24 04 2020 62 EXT2硬盤空間管理 分配數(shù)據(jù)塊 ext2 new block 函數(shù)查找空閑塊的策略如果傳遞給ext2 alloc block 函數(shù)的預(yù)分配塊 goal 空閑 則分配之否則 檢查緊跟預(yù)分配塊之后的64個塊是否有空閑如果這64個塊中沒有空閑的塊 則考慮所有的組 從包含goal的組開始過搜索對于每一個組 查找連續(xù)的8個空閑塊 如果沒有 則查找單個空閑塊 一旦空閑塊找到 搜索即停止 firstmatch算法 結(jié)束分配之前 ext2 new block 仍然試圖預(yù)分配8個連接的空閑塊 24 04 2020 63 EXT2硬盤空間管理 釋放數(shù)據(jù)塊 釋放數(shù)據(jù)塊當(dāng)一個進(jìn)程刪除文件或是將文件長度置0的時候 所有分配給該文件的數(shù)據(jù)塊將被回收 此時調(diào)用的函數(shù)是ext2 truncate 該函數(shù)調(diào)用的參數(shù)是文件的索引結(jié)點地址 此函數(shù)將掃描索引結(jié)點中i block數(shù)組 得到分配給該文件的數(shù)據(jù)塊的塊號信息 所有這些數(shù)據(jù)塊 將由ext2 free blocks 函數(shù)負(fù)責(zé)回收 Ext2 free blocks 函數(shù)調(diào)用的參數(shù)有 文件的索引結(jié)點 要被釋放的數(shù)據(jù)塊的首地址 塊號 要被連續(xù)釋放的塊數(shù) 此函數(shù)首先調(diào)用lock super 給superblock上鎖 然后進(jìn)行如下操作 得到數(shù)據(jù)塊位圖 將要被釋放的數(shù)據(jù)塊所對應(yīng)的位圖中的位置0 將組描述符中的 空閑塊數(shù) 域 bg free blocks count 增1 將superblock中的 空閑塊數(shù) 域 s free blocks count 增1 最后 再調(diào)用uplock super 給superblock解鎖 24 04 2020 64 Ext2的普通文件讀寫實現(xiàn) 虛擬文件系統(tǒng) VFS 上對文件的讀寫是通過系統(tǒng)調(diào)用read 或write 來實現(xiàn)的 從文件系統(tǒng)的層次看 這些系統(tǒng)調(diào)用對應(yīng)著一系列的 底層 操作 下面分析Ext2文件系統(tǒng)的寫操作過程 Ext2的寫操作函數(shù)是ext2 file write 它有4個參數(shù) fd文件描述符 buf寫入數(shù)據(jù)的緩沖區(qū)地址 count寫入的字節(jié)大小 ppos指向保存文件地址指針上述寫函數(shù)的工作過程如下步驟 剔除對該文件擁有特權(quán)的特權(quán)用戶 將寫入地址移動到文件需要寫入的地方 計算文件內(nèi)的地址與文件系統(tǒng)中塊的地址的對應(yīng)關(guān)系 寫操作前準(zhǔn)備 24 04 2020 65 Ext2的普通文件讀寫實現(xiàn) 寫操作前準(zhǔn)備 a 調(diào)用ext2 getblk 得到空閑數(shù)據(jù)塊b 等待可能存在的讀操作完成c 將寫緩沖區(qū)的數(shù)據(jù)復(fù)制到數(shù)據(jù)塊d 調(diào)用update vm cache 將cache中的數(shù)據(jù)同步 更新文件索引結(jié)點中的i size域 設(shè)置索引結(jié)點中與時間相關(guān)域 比如 文件訪問時間 修改時間 更新ppos指針 返回已經(jīng)寫入文件的字節(jié)數(shù) 24 04 2020 66 類Ext2文件系統(tǒng) 結(jié)構(gòu)設(shè)計 Ext2文件系統(tǒng)是一個實際可用的文件系統(tǒng) 實在是太龐大了 為了進(jìn)行簡單的模擬 基于Ext2的思想和算法 設(shè)計一個類Ext2的文件系統(tǒng) 實現(xiàn)Ext2文件系統(tǒng)的一個功能子集 并且用現(xiàn)有操作系統(tǒng)上的文件來代替硬盤進(jìn)行硬件模擬 設(shè)計文件系統(tǒng)應(yīng)該考慮的幾個層次介質(zhì)的物理結(jié)構(gòu)物理操作 設(shè)備驅(qū)動程序完成文件系統(tǒng)的組織結(jié)構(gòu) 邏輯組織結(jié)構(gòu) 對組織結(jié)構(gòu)其上的操作為用戶使用文件系統(tǒng)提供的接口類ext2文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)塊的定義為簡單起見 邏輯塊大小與物理塊大小均定義為512字節(jié) 由于位圖只占用一個塊 因此 每個組的數(shù)據(jù)塊個數(shù)以及索引結(jié)點的個數(shù)均確定為512 8 4096 進(jìn)一步 每組的數(shù)據(jù)容量確定為4096 512B 2MB 另外 模擬系統(tǒng)中 假設(shè)只有一個用戶 故可以省略去文件的所有者ID的域 組描述符為簡單起見 只定義一個組 因此 組描述符只占用一個塊 同時 superblock塊省略 其功能由組描述符塊代替 即組描述符塊中需要增加文件系統(tǒng)大小 索引結(jié)點的大小 卷名等原屬于superblock的域 由此可得組描述符的數(shù)據(jù)結(jié)構(gòu)如下 見下頁 24 04 2020 67 類Ext2文件系統(tǒng) 組描述符 structext2 group desc 類型bytes域釋意char 16bg volume name 16 卷名 u162bg block bitmap 保存塊位圖的塊號 u162bg inode bitmap 保存索引結(jié)點位圖的塊號 u162bg inode table 索引結(jié)點表的起始塊號 u162bg free blocks count 本組空閑塊的個數(shù) u162bg free inodes count 本組空閑索引結(jié)點的個數(shù) u162bg used dirs count 本組目錄的個數(shù)char 4bg pad 4 填充 0 xff 合計32個字節(jié) 由于只有一個組 且占用一個塊 故需要填充剩下的512 32 480字節(jié) 24 04 2020 68 類Ext2文件系統(tǒng) 索引結(jié)點 索引結(jié)點數(shù)據(jù)結(jié)構(gòu)由于容量已經(jīng)確定 文件最大即為2MB 需要4096個數(shù)據(jù)塊 索引結(jié)點的數(shù)據(jù)結(jié)構(gòu)中 仍然采用多級索引機(jī)制 由于文件系統(tǒng)總塊數(shù)必然小于4096 2 所以只需要13個二進(jìn)制位即可對塊進(jìn)行全局計數(shù) 實際實現(xiàn)用unsignedint16位變量 即2字節(jié)表示1個塊號 在一級子索引中 如果一個數(shù)據(jù)塊都用來存放塊號 則可以存放512 2 256個 因此 只使用一級子索引可以容納最大的文件為256 512 128KB 需要使用二級子索引 只使用二級子索引時 索引結(jié)點中的一個指針可以指向256 256個塊 即256 256 512 8MB 已經(jīng)可以滿足要求了 為了盡量 像 ext2 也為了簡單起見 索引結(jié)點的直接索引定義6個 一級子索引定義1個 二級子索引定義1個 總計8個指針 24 04 2020 69 類Ext2文件系統(tǒng) 索引結(jié)點 索引結(jié)點的數(shù)據(jù)結(jié)構(gòu)定義structext2 inode 類型字節(jié)長度域釋意 u162i mode 文件類型及訪問權(quán)限 u162i blocks 文件的數(shù)據(jù)塊個數(shù) u324i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 心理資本與學(xué)習(xí)動力企業(yè)培訓(xùn)的新視角
- 教育技術(shù)在遠(yuǎn)程辦公中的實踐與思考
- 教育品牌在數(shù)字時代的品牌塑造與傳播
- 培養(yǎng)孩子學(xué)習(xí)興趣從心理學(xué)角度出發(fā)的教育方法探討
- 教育行業(yè)未來趨勢與學(xué)習(xí)路勁規(guī)劃
- 智慧教育與學(xué)生學(xué)習(xí)動力的關(guān)系研究
- 從數(shù)據(jù)泄露看教育技術(shù)的倫理困境
- 教育心理學(xué)與教師決策實踐與探索
- 中職思政課課件
- 2025屆安徽省池州一中物理高一下期末教學(xué)質(zhì)量檢測試題含解析
- 高中歷史《第一次工業(yè)革命》說課課件
- 預(yù)計財務(wù)報表編制及分析課件
- 學(xué)生集體外出活動備案表
- Q∕SY 1347-2010 石油化工蒸汽透平式壓縮機(jī)組節(jié)能監(jiān)測方法
- 基于Qt的俄羅斯方塊的設(shè)計(共25頁)
- 西門子順序功能圖語言S7-Graph的應(yīng)用
- 中醫(yī)治療室工作制度管理辦法
- 提花裝造工藝技術(shù)培訓(xùn)課程
- 食堂投訴處理方案
- 北京市昌平區(qū)2021-2022學(xué)年八年級上學(xué)期期末考試語文試卷(word版含答案)
- 直播傳媒公司簡介PPT課件(參考)
評論
0/150
提交評論