linux進程管理_第1頁
linux進程管理_第2頁
linux進程管理_第3頁
linux進程管理_第4頁
linux進程管理_第5頁
已閱讀5頁,還剩80頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux進程管理 24 04 2020 2 Linux操作系統(tǒng) Linux是一個多用戶 多任務的操作系統(tǒng) 這就意味著多個用戶可以同時使用一個操作系統(tǒng) 而每個用戶又可以同時運行多個命令 在這樣的系統(tǒng)中 各種計算機資源 如文件 內存 CPU等 的分配和管理都以進程為單位 為了協(xié)調多個進程對這些共享資源的訪問 操作系統(tǒng)要跟蹤所有進程的活動 以及它們對系統(tǒng)資源的使用情況 實施對進程和資源的動態(tài)管理 24 04 2020 3 Linux的進程及其狀態(tài) 在Linux系統(tǒng)中 進程 Process 和任務 Task 是同一個意思 所以 在內核的代碼中 這兩個名詞常?;煊?Linux進程狀態(tài)在Linux系統(tǒng)中 進程有以下幾個狀態(tài) 運行態(tài) TASK RUNNING 0 此時 進程正在運行 即系統(tǒng)的當前進程 或者準備運行 即就緒態(tài) 等待態(tài)此時進程在等待一個事件的發(fā)生或某種系統(tǒng)資源 Linux系統(tǒng)分為兩種等待進程 可中斷的 TASK INTERRUPTIBLE 1 和不可中斷的 TASK UNINTERRUPTIBLE 2 可中斷的等待進程可以被某一信號 Signal 中斷 而不可中斷的等待進程不受信號的打擾 將一直等待硬件狀態(tài)的改變停止態(tài) TASK STOPPED 4 進程被停止 通常是通過接收一個信號 正在被調試的進程可能處于停止狀態(tài)僵死態(tài) TASK ZOMBIE 3 由于某些原因被終止的進程 但是該進程的控制結構task struct仍然保留著 24 04 2020 4 Linux進程狀態(tài)轉換 停止態(tài)TASK STOPPED 正在運行態(tài)擁有cpu 就緒態(tài)Task runing 僵死態(tài)TASK ZOMBIE 不可中斷等待態(tài)TASK UNINTERRUPTIBLE 可中斷等待態(tài)TASK INTERRUPTIBLE 進程終止do exit 時間片到 進程調度schedule 進程跟蹤系統(tǒng)調用執(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 進程的模式和類型 在Linux系統(tǒng)中 進程的執(zhí)行模式劃分為用戶模式和內核模式 如果當前運行的是用戶程序 應用程序或者內核之外的系統(tǒng)程序 那么對應進程就在用戶模式下運行 如果在用戶程序執(zhí)行過程中出現(xiàn)系統(tǒng)調用或者發(fā)生中斷事件 就要運行操作系統(tǒng) 即核心 程序 進程模式就變成內核模式 在內核模式下運行的進程可以執(zhí)行機器的特權指令 而且 此時該進程的運行不受用戶的干預 即使是root用戶也不能干預內核模式下進程的運行 按照進程的功能和運行的程序分類 進程可劃分為兩大類 一類是系統(tǒng)進程 只運行在內核模式 執(zhí)行操作系統(tǒng)代碼 完成一些管理性的工作 例如內存分配和進程切換 另外一類是用戶進程 通常在用戶模式中執(zhí)行 并通過系統(tǒng)調用或在出現(xiàn)中斷 異常時進入內核模式 24 04 2020 6 有關進程管理的命令 ps命令ps命令是查看進程狀態(tài)的最常用的命令 它可以提供關于進程的許多信息 根據顯示的信息可以確定哪個進程正在運行 哪個進程被掛起 遇到了哪些困難 進程已運行了多久 進程正在使用的資源 進程的相對優(yōu)先級 以及進程的標識號 PID 所有這些信息對用戶都很有用 對于系統(tǒng)管理員來說更為重要 24 04 2020 7 Linux的ps命令格式 ps命令的一般格式是 ps 選項 以下是ps命令常用的選項及其含義 a顯示系統(tǒng)中與tty相關的所有進程的信息 e顯示所有進程的信息 f顯示進程的所有信息 l以長格式顯示進程信息 r只顯示正在運行的進程 u顯示面向用戶的格式 包括用戶名 CPU及內存使用情況等信息 x顯示所有非控制終端上的進程信息 pid顯示由進程ID指定的進程的信息 tty顯示指定終端上的進程的信息 24 04 2020 8 Linux的命令ps顯示的信息項 UID進程屬主的用戶ID號PID進程ID號PPID父進程的ID號C進程最近使用CPU的估算 STIME進程開始時間 以 小時 分 秒 的形式給出TTY該進程建立時所對應的終端 表示該進程不占用終端TIME報告進程累計使用的CPU時間 注意 盡管覺得有些命令 如sh 已經運轉了很長時間 但是它們真正使用CPU的時間往往很短 所以 該字段的值往往是0 00CMD是command 命令 的縮寫 往往表示進程所對應的命令名 24 04 2020 9 Linux的命令ps顯示的信息項 命令ps auxUSER啟動進程的用戶 CPU運行該進程占用CPU的時間與該進程總的運行時間的比例 MEM該進程占用內存和總內存的比例VSZ虛擬內存的大小 以KB為單位RSS占用實際內存的大小 以KB為單位STAT表示進程的運行狀態(tài) 包括以下幾種代碼 D不可中斷的睡眠 R就緒 在可運行隊列中 S睡眠 T被跟蹤或停止 Z終止 僵死 的進程 24 04 2020 10 Linux的kill命令 通常終止一個前臺進程可以使用 Ctrl C 組合鍵 但是 對于一個后臺進程就須用kill命令來終止 kill命令是通過向進程發(fā)送指定的信號來結束相應進程 默認情況下 采用編號為15的TERM信號 TERM信號將終止所有不能捕獲該信號的進程 對于那些可以捕獲該信號的進程就要用編號為9的KILL信號 強行殺掉該進程 24 04 2020 11 Linuxkill命令的格式 kill s信號 p a 進程號 kill l 信號 其中選項各選項的含義如下 s指定需要發(fā)送的信號 既可以是信號名 如KILL 也可以是對應信號的號碼 如9 p指定kill命令只是顯示進程的pid 進程標識號 并不真正發(fā)出結束信號 l顯示信號名稱列表 這也可以在 usr include linux signal h文件中找到 24 04 2020 12 使用kill命令時應注意 1 kill命令可以帶信號號碼選項 也可以不帶 如果沒有信號號碼 kill命令就會發(fā)出終止信號 TERM 這個信號可以殺掉沒有捕獲到該信號的進程 也可以用kill向進程發(fā)送特定的信號 例如 kill 21234它的效果等同于在前臺運行PID為1234的進程的時候 按下 Ctrl C 但是普通用戶只能使用不帶signal參數(shù)的kill命令 或者最多使用 9信號 2 kill可以帶有進程ID號作為參數(shù) 當用kill向這些進程發(fā)送信號時 必須是這些進程的主人 如果試圖撤銷一個沒有權限撤銷的進程 或者撤銷一個不存在的進程 就會得到一個錯誤信息 24 04 2020 13 使用kill命令時應注意 3 可以向多個進程發(fā)信號 或者終止它們 4 當kill成功地發(fā)送了信號 Shell會在屏幕上顯示出進程的終止信息 有時這個信息不會馬上顯示 只有當按下回車鍵使Shell的命令提示符再次出現(xiàn)時才會顯示出來 5 信號使進程強行終止常會帶來一些副作用 比如數(shù)據丟失或終端無法恢復到正常狀態(tài) 發(fā)送信號時必須小心 只有在萬不得已時才用kill信號 9 因為進程不能首先捕獲它 要撤銷所有的后臺作業(yè) 可以鍵入 kill0 因為有些在后臺運行的命令會啟動多個進程 跟蹤并找到所有要殺掉的進程的PID是件很麻煩的事 這時 使用 kill0 來終止所有由當前Shell啟動的進程是個有效的方法 24 04 2020 14 Linux的sleep命令 sleep命令的功能是使進程暫停執(zhí)行一段時間 其一般格式是 sleep時間值其中 時間值 參數(shù)以秒為單位 即使進程暫停由時間值所指定的秒數(shù) 此命令大多用于Shell程序設計中 使兩條命令執(zhí)行之間停頓指定的時間 24 04 2020 15 Linux進程的數(shù)據結構 在Linux中 進程用task struct表示 所有進程被組織到以init task為表頭的雙向鏈表中 見 include linux sched h SET LINKS 宏 該鏈表是全系統(tǒng)唯一的 系統(tǒng)維護一個名為task的數(shù)組 task包含指向系統(tǒng)所有進程的task struct結構的指針 task數(shù)組默認值為512 Linux從系統(tǒng)內存分配一個task struct結構并將其加入task數(shù)組 當前運行進程的結構用current指針指示 24 04 2020 16 Linux內核0 11task struct 進程控制塊是task struct結構 在include linux sched h中定義task struct結構體中各數(shù)據項含義 24 04 2020 17 Linux內核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的信息分類 進程的狀態(tài)信息進程調度信息進程標識信息進程通信信息進程的鏈接信息進程的時間和定時器信息有關文件系統(tǒng)的信息虛擬內存信息進程上下文信息其它信息 24 04 2020 19 Linux的PCB task struct stateLinux的進程狀態(tài)主要分為三類 可運行的 TASK RUNNING 相當于運行態(tài)和就緒態(tài) 被掛起的 TASK INTERRUPTIBLE TASK UNINTERRUPTIBLE和TASK STOPPED 不可運行的 TASK ZOMBIE 調度器主要處理的是可運行和被掛起兩種狀態(tài)下的進程 其中TASK STOPPED又專門用于SIGSTP等IPC信號的響應 而TASK ZOMBIE指的是已退出而暫時沒有被父進程收回資源的 僵尸 進程 need resched布爾值 在調度器中用于表示該進程需要申請調度 24 04 2020 20 Linux的PCB task struct policy在Linux2 4中 進程的調度策略可以有三種選擇 SCHED FIFO 先進先出式調度 除非有更高優(yōu)先級進程申請運行 否則該進程將保持運行至退出才讓出CPU SCHED RR 輪轉式調度 該進程被調度下來后將被置于運行隊列的末尾 以保證其他實時進程有機會運行 SCHED OTHER 常規(guī)的分時調度策略 另外 policy中還包含了一個SCHED YIELD位 置位時表示主動放棄CPU rt priority用于表征實時進程的優(yōu)先級 從1 99取值 非實時進程該項應該為0 這一屬性將用于調度時的權值計算 詳見 就緒進程選擇算法 counter該屬性記錄的是當前時間片內該進程還允許運行的時間 以CPU時鐘tick值為單位 每個進程的counter初值與nice值有關 nice越小則counter越大 即優(yōu)先級越高的進程所允許獲得的CPU時間也相對越多 并參與 就緒進程選擇算法 在Linux2 4中 每個 非SCHED FIFO實時 進程都不允許運行大于某一時間片的時間 一旦超時 調度器將強制選擇另一進程運行 詳見 調度器工作流程 24 04 2020 21 Linux的PCB task struct nice用戶可支配的進程優(yōu)先級 將參與 就緒進程選擇算法 同時該值也決定了該進程的時間片長度cpus allowed以位向量的形式表示可用于該進程運行的CPU 見 調度器工作流程 cpus runnable以位向量的形式表示當前運行該進程的CPU 相應位為1 如果不在任何CPU上運行 則為全1 這一屬性和cpus allowed屬性結合 可以迅速判斷該進程是否能調度到某一CPU上運行 位 與 24 04 2020 22 Linux的PCB task struct processor本進程當前 或最近 所在CPU編號thread用于保存進程執(zhí)行環(huán)境 各個寄存器的值以及IO操作許可權映射表 內容與TSS相近 因為TSS以CPUid為索引 而Linux無法預測被替換下來的進程下一次將在哪個CPU上運行 所以這些信息不能保存在TSS中current核心經常需要獲知當前在某CPU上運行的進程的task struct 在Linux中用current指針指向這一描述符 current的實現(xiàn)采用了一個小技巧以獲得高效的訪問速度 這個小技巧與Linux進程task struct的存儲方式有關 24 04 2020 23 Linux的PCB task struct schedule datatask struct是用于描述進程的數(shù)據結構 其中包含了指向所運行CPU的屬性 在Linux中 另有一個數(shù)據結構對應于CPU 可以利用它訪問到某CPU上運行的進程 這個數(shù)據結構定義為schedule data結構 包含兩個屬性 curr指針 指向當前運行于該CPU上的進程的task struct 通常用cpu curr cpu 宏來訪問 last schedule時間戳 記錄了上一次該CPU上進程切換的時間 通常用last schedule cpu 宏來訪問 為了使該數(shù)據結構的訪問能與CPU的Cacheline大小相一致 schedule data被組織到以SMP CACHE BYTES為單位的aligned data聯(lián)合數(shù)組中 系統(tǒng)中每個CPU對應數(shù)組上的一個元素 24 04 2020 24 Linux就緒進程選擇算法 Linuxschedule 函數(shù)將遍歷就緒隊列中的所有進程 調用goodness 函數(shù)計算每一個進程的權值weight 從中選擇權值最大的進程投入運行 進程調度權值的計算分為實時進程和非實時進程兩類 對于非實時進程 SCHED OTHER 影響權值的因素主要有以下四個 進程當前時間片內所剩的tick數(shù) 即task struct的counter值 相當于counter越大的進程獲得CPU的機會也越大 因為counter的初值與 nice 相關 因此這一因素一方面代表了進程的優(yōu)先級 另一方面也代表了進程的 欠運行程度 weight p counter 進程上次運行的CPU是否就是當前CPU 如果是 則權值增加一個常量 表示優(yōu)先考慮不遷移CPU的調度 因為此時Cache信息還有效 weight PROC CHANGE PENALTY 此次切換是否需要切換內存 如果不需要 或者是同一進程的兩個線程間的切換 或者是沒有mm屬性的核心線程 則權值加1 表示 稍微 優(yōu)先考慮不切換內存的進程 weight 1 24 04 2020 25 Linux就緒進程選擇算法 進程的用戶可見的優(yōu)先級nice nice越小則權值越大 Linux中的nice值在 20到 19之間選擇 缺省值為0 nice 系統(tǒng)調用可以用來修改優(yōu)先級 weight 20 p nice 對于實時進程 SCHED FIFO SCHED RR 權值大小僅由該進程的rt priority值決定 weight 1000 p rt priority 1000的基準量使得實時進程的權值比所有非實時進程都要大 因此只要就緒隊列中存在實時進程 調度器都將優(yōu)先滿足它的運行需要 如果權值相同 則選擇就緒隊列中位于前列的進程投入運行 除了以上標準值以外 goodness 還可能返回 1 表示該進程設置了SCHED YIELD位 此時 僅當不存在其他就緒進程時才會選擇它 如果遍歷所有就緒進程后 weight值為0 表示當前時間片已經結束了 此時將重新計算所有進程 不僅僅是就緒進程 的counter值 再重新進行就緒進程選擇 詳見 調度器工作流程 24 04 2020 26 Linux的調度器 Linux的調度器主要實現(xiàn)在schedule 函數(shù)中 調度器工作流程schedule 函數(shù)的基本流程可以概括為四步 1 清理當前運行中的進程2 選擇下一個投入運行的進程3 設置新進程的運行環(huán)境4 執(zhí)行進程上下文切換5 后期整理其中包含了一些鎖操作 就緒隊列鎖runquque lock 全局核心鎖kernel flag 全局中斷鎖global irq lock 進程列表鎖tasklist lock 24 04 2020 27 Linux內核0 11進程的創(chuàng)建 進程創(chuàng)建程序fork cfork c是sys fork 在kernel system call s中 系統(tǒng)調用的輔助處理函數(shù)集sys fork 其中給出了sys fork 系統(tǒng)調用中使用的兩個C語言函數(shù)find empty process 為新進程取得不重復的進程號copy process 用于創(chuàng)建并復制進程的代碼段和數(shù)據段以及環(huán)境還包括進程呢哦存區(qū)域驗證和內存分配函數(shù)Verify area 24 04 2020 28 fork c的主要工作 為task struct申請空閑內存頁 并填入新進程標識號和其他內容調用find empty process 尋找空閑的進程槽 processstot 為kernel task page申請內存空閑頁面復制父進程的LDP復制父進程的mmap建立文件系統(tǒng)有關信息 包括文件描述符和i節(jié)點等 24 04 2020 29 Linux進程的撤銷exit c 24 04 2020 30 設計Linux系統(tǒng)調用 用戶接口添加系統(tǒng)調用添加源代碼 添加到內核文中的一個函數(shù)函數(shù)名前綴sys 作為系統(tǒng)調用的標志Asmlinkageintsys yang inti intj j i i returnj 添加代碼到文件 usr src linux kernel sys c鏈接新的系統(tǒng)調用目的 讓內核其它部分知道它的存在打開 usr src linux include asm i386 unistd h該文件包含了系統(tǒng)調用的清單 用來給每個系統(tǒng)調用分配一個唯一的編號 24 04 2020 31 Linux系統(tǒng)調用 續(xù) 系統(tǒng)調用號的定義 define NR nameNNN其中NNN為定義的號 name為新的系統(tǒng)調用名稱新的定義添加到unist h文件的最后在 usr src linux arch i386 kernel entry S的最后添加代碼 longSYSMBOL NAME sys yang 重新編譯內核以root登錄 進入 usr src linux目錄 重建內核 makemenuconfig 配置新內核 makedep 創(chuàng)建新內核 makemodules indtall 加入模塊 makeclean 清除多余創(chuàng)建的文件 makebzImage 生成可執(zhí)行內核引導文件 makeinstall 安裝新內核重新啟動系統(tǒng)即可 24 04 2020 32 Linux系統(tǒng)調用 續(xù) 編程 test c 調用自己的系統(tǒng)調用 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)調用 續(xù) 編譯程序gcc o I usr src linux 2 4 20 8 includetesttest c運行 test 24 04 2020 34 設計動態(tài)模塊 模塊的組織 include 說明是個內核功能 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)結構文件名14個字符塊設備最大容量64M 8 8 1024 1024 1024 1024 EXT2文件系統(tǒng) minix文件系統(tǒng) 24 04 2020 39 EXT2文件系統(tǒng) 磁盤布局 Ext文件系統(tǒng)Minix的第一次擴展文件名最大長度255個字符磁盤分區(qū)大小可達2GBExt2文件系統(tǒng) 第二代擴展文件系統(tǒng)磁盤分區(qū)大小可達4TB磁盤布局采用了組塊 24 04 2020 40 EXT2文件系統(tǒng) 引導塊和超級塊 引導塊BootBlock每個硬盤分區(qū)的開頭1024字節(jié) 即0byte至1023byte是分區(qū)的啟動扇區(qū) 存放由ROMBIOS自動讀入的引導程序和數(shù)據 但這只對引導設備有效 而對于非引導設備 該引導塊不含代碼 這個塊與ext2沒有任何關系 超級塊SuperBlock分區(qū)剩余的部分被分為若干個組 每個組里均由一個superblock塊和一個GroupDescriptors 組描述符 塊組成 Group0中的superblock被內核所用 定義了諸如文件系統(tǒng)的靜態(tài)結構 包括塊的大小 總塊數(shù) 每組內inode數(shù) 空閑塊 索引結點數(shù)等全局信息 其他Group中的SuperBlock則僅是Group0中的SuperBlock的一個拷貝 超級塊的數(shù)據結構在ext2 fs h定義為structext2 super blockLinux啟動時superblock0的內容讀入內存 某個組損壞可用來恢復 24 04 2020 41 EXT2文件系統(tǒng) 超級塊 structext2 super blockTypeField釋意 u32s inodes count 索引結點的總數(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ù)據塊 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 最后一次對超級塊進行寫的時間 u16s mnt count 安裝計數(shù) s16s max mnt count 最大可安裝計數(shù) 24 04 2020 42 EXT2文件系統(tǒng) 超級塊 u16s magic 用于確定文件系統(tǒng)版本的標志 ext2 0 xEF53 u16s state 文件系統(tǒng)狀態(tài) u16s errors 當檢測到錯誤時如何處理 u16s minor rev level 次版本號 u32s lastcheck 最后一次檢測文件系統(tǒng)狀態(tài)的時間 u32s checkinterval 兩次對文件系統(tǒng)狀態(tài)進行檢測的最大可能時間間隔 u32s rev level 版本號 以此識別是否支持某些功能 u16s def fesuid 保留塊的默認用戶標識UID u16s def fesgid 保留塊的默認用戶組標識GID u32s first ino 第一個非保留的索引節(jié)點號 u16s inode size 索引結點結構的大小 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定義了塊位圖的塊號 索引結點位圖的塊號 索引結點表的起始塊號 本組空閑塊的個數(shù)等組內信息 文件系統(tǒng)根據這些信息來查找數(shù)據塊位圖 索引結點位圖 索引結點表的位置 數(shù)據結構在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ù)據塊及數(shù)據塊位圖 數(shù)據塊位圖DataBlockBitmap這是ext2管理存儲空間的方法 即位圖法 每個位對應一個數(shù)據塊 位值為0表示空閑 1表示已經分配 數(shù)據塊位圖定義為一個塊大小 于是 一個組中的數(shù)據塊個數(shù)就決定了 假設塊大小為b字節(jié) 可以區(qū)別的塊數(shù)為b 8個數(shù)據塊DataBlocks每個組的數(shù)據最大個數(shù)是在塊大小定義后就確定了的 所以組容量也就確定了 假設塊大小為b字節(jié) 那么組容量就確定為 b 8 b字節(jié)若1塊 4K 則組塊大小 4K 8 4K 128M 24 04 2020 45 EXT2文件系統(tǒng) 索引節(jié)點位圖及索引節(jié)點 索引結點位圖InodeBitmap與數(shù)據塊位圖相似 用來表示索引結點是否已經被使用 假設塊大小為b字節(jié) 每個索引結點數(shù)據結構大小為128字節(jié) 最多可以有b 8個索引結點 索引結點表需要占用的存儲空間大小為 b 8 128字節(jié) 即 b 8 128 b 8 128個塊索引結點Inode索引結點表由若干個索引結點數(shù)據結構組成 需要占用若干個塊 Ext2中的每個索引結點數(shù)據結構大小為128字節(jié) 每個索引結點即對應一個文件或是目錄 是對其除文件名 目錄名 以外的所有屬性的描述 例如 文件類型 文件創(chuàng)建時間 訪問時間 修改時間 文件所占數(shù)據塊的個數(shù) 指向數(shù)據塊的指針 其中 數(shù)據塊指針是由15個元組的數(shù)據組成 24 04 2020 46 EXT2文件系統(tǒng) 索引節(jié)點位圖及索引節(jié)點 前12個元組 0至11 直接指向數(shù)據塊 第12號元組 12 是一個1級子索引 指向的不是數(shù)據塊 而是存放數(shù)據塊指針的塊 類似的 第13號元組 13 是一個2級子索引 第14號元組 14 是一個3級子索引 這種結構可以適應大文件的存儲 假設文件塊大小為b 則當文件長度小于b 12時 只要用前12個元組來指向其數(shù)據塊 當文件長度大于b 12時 則用多級索引機制來指向其數(shù)據塊 這體現(xiàn)了Ext2的文件的物理結構 即索引文件 使用索引結點來指向文件的數(shù)據塊 并且索引結點本身是聚集在一起的 24 04 2020 47 24 04 2020 48 EXT2文件系統(tǒng) 索引節(jié)點定義 索引節(jié)點定義ext2 fs h中的structext2 inodestructext2 inode TypeField釋意 u16i mode 文件類型及訪問權限 u16i uid 文件擁有者的標識號UID u32i size 文件大小大小 字節(jié) u32i atime 最后一次訪問時間 u32i ctime 創(chuàng)建時間 u32i mtime 該文件內容最后修改時間 u32i dtime 文件刪除時間 u16i gid 文件的用戶組的組號 u16i links count 文件的鏈接計數(shù) u32i blocks 文件的數(shù)據塊個數(shù) 以512字節(jié)計 u32i flags 打開文件的方式 u32 i block EXT2 N BLOCKS 指向數(shù)據塊的指針數(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ù)據塊 有些文件只需要索引結點即可 Ext2中 目錄是一種特殊的文件 其數(shù)據塊中的內容即目錄表 所包含的文件 當然也包括子目錄 的文件名 指向文件的索引節(jié)點號 文件類型 ext2 fs h中數(shù)據結構的定義 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ù)據塊實例其中 inode指向0的那一行 表示此文件已經被刪除 同時 上一行的目錄項長度擴展為兩者之和 12 16 24 04 2020 51 EXT2文件系統(tǒng) 文件的類型 文件類型Ext2中文件類型有以下幾種 文件類型號描述0未知1普通文件2目錄3字符設備4塊設備5管道 Pipe 6套接字7符號指針 24 04 2020 52 EXT2文件系統(tǒng)的操作 兩個概念文件系統(tǒng)的設計目標在于 一方面 從用戶的角度看 實現(xiàn) 按名取存 文件系統(tǒng)的用戶只要知道所需文件的文件名 就可存取文件中的信息 而無需知道這些文件究竟存放在什么地方 另一方面 從系統(tǒng)角度看 文件系統(tǒng)對文件存儲器的存儲空間進行組織 分配和回收 負責文件的存儲 檢索 共享和保護 用戶角度的文件系統(tǒng)被稱為VFS 虛擬文件系統(tǒng) 定義在這個層次上的操作 對于用戶來說是文件系統(tǒng)所呈現(xiàn)所有屬性 比如 列目錄 建立目錄 建立文件 打開文件 讀寫文件 重命名文件等 與每個操作相對應的是實際文件系統(tǒng)中的一系列底層操作 24 04 2020 53 EXT2文件系統(tǒng)的操作 索引結點操作 24 04 2020 54 EXT2文件系統(tǒng)的操作 文件操作 24 04 2020 55 EXT2硬盤空間管理 存儲空間的分配回收需要考慮兩個因素避免文件碎片時效Ext2中新建立的文件并不是馬上就分配數(shù)據塊 而是分配索引結點 當有數(shù)據存入時 再分配數(shù)據塊 故存儲空間的分配與回收也分成兩個部分索引結點的創(chuàng)建與刪除數(shù)據塊的分配與回收 24 04 2020 56 EXT2硬盤空間管理 創(chuàng)建索引結點 創(chuàng)建索引結點Ext2使用ext2 new inode 來創(chuàng)建一個新的索引結點 創(chuàng)建成功則返回索引結點號 否則返回NULL 這個函數(shù)包括了以下幾個步驟 get empty inode 返回一個空結點 lock super 互斥操作 即對superblock的P 操作 如果索引結點是目錄 則將其分配到空閑塊最多的組中 如果索引結點不是目錄 則從頭開始 順序查找 一個空結點分配給該文件 順序查找 的算法是 24 04 2020 57 EXT2硬盤空間管理 創(chuàng)建索引結點 load inode bitmap 載入選中的組的索引結點位圖塊 找到選擇首個空閑索引結點 分配之 并將對應位圖位填成1 將組描述符中的空閑索引結點個數(shù)減1 將SuperBlock中的空閑索引結點個數(shù)減1 填充剛剛分配的索引結點的數(shù)據結構 比如 文件屬性 創(chuàng)建時間 訪問時間等等 將新的索引結點插入索引結點hash表 加速查詢 mark indoe dirty 將索引結點號填入superblock的dirtyinodelist中 unlock super 互斥操作完畢 解鎖 即 對superblock的V 操作 返回新分配的索引結點號 24 04 2020 58 EXT2硬盤空間管理 索引結點的刪除 索引結點的刪除Ext2使用ext2 free inode 來刪除一個索引結點 在此之前 內核必須已經事先完成了一系列的操作 刪除文件占用的數(shù)據塊 索引結點已經從hash表中刪除 包含該索引結點的目錄中索引結點號置0 前一個目錄項長度重新計算等 此函數(shù)包含以下步驟 lock super 互斥操作 對superblock加鎖 根據索引結點號以及索引結點總數(shù)來計算該索引結點所在的組號 load inode bitmap 從所在的組中調入索引結點位圖 將對應位置0 clear inode 釋放該索引結點所占用的cache空間 將組描述符中的空閑索引結點個數(shù)增1 將SuperBlock中的空閑索引結點個數(shù)增1 從SuperBlock的dirtyinodelist中清除該索引結點 uplock super 互斥操作完畢 對superblock解鎖 24 04 2020 59 EXT2硬盤空間管理 數(shù)據塊尋址 數(shù)據塊尋址ext2的單個文件所占有的數(shù)據塊組織方式 在 硬盤數(shù)據結構 部分中已經分析過了 即15個元組長度的數(shù)據 前12個直接指向數(shù)據塊 后3個分別采用1級 2級 3級索引方法 最大可支持的文件大小為2TB 塊大小 文件大小上限與索引級數(shù)的關系如下圖 24 04 2020 60 EXT2硬盤空間管理 分配數(shù)據塊 分配數(shù)據塊內核使用ext2 getblk 函數(shù)給需要數(shù)據空間的文件分配數(shù)據塊 多個塊與文件間的組織形式即前面所述的數(shù)據塊尋址方式 多級索引 為了在ext2分區(qū)中找到空閑的數(shù)據塊 ext2使用ext2 alloc block 函數(shù) 為了減少文件的碎片 Ext2文件系統(tǒng)盡量從已經分配給該文件的最后一個數(shù)據塊開始尋找空閑塊 Ext2采用了預先分配數(shù)據塊的方法 文件不僅僅得到其所申請的數(shù)據塊 還得被預先 額外 分配了最多達8個的連續(xù)數(shù)據塊 Ext2 inode info數(shù)據結構中 i prealloc count域保存了預先分配給文件而沒有被使用的數(shù)據塊 而I prealloc block域則保存著下一個將被預分配的塊號 24 04 2020 61 EXT2硬盤空間管理 分配數(shù)據塊 Ext2 alloc block 及Ext2 getblk 的工作細節(jié) Ext2 alloc block 函數(shù)得到一個指向索引結點和goal的指針 Goal 是一個代表下一個將被分配的最優(yōu)新塊的邏輯塊號 Ext2 getblk 根據以下規(guī)則來設置goal參數(shù) 即判斷最優(yōu)的原則 如果已經被分配以及預先被分配給文件的塊 是連續(xù)的塊的話 goal即預先分配的數(shù)據塊的邏輯塊號加1 如果上述規(guī)則不滿足 并且至少一個塊已經被預先分配 則goal即這些預先分配的數(shù)據塊中的某個塊的邏輯塊號 如果上述規(guī)則不滿足 則goal即為文件的索引結點所在的組的第一個數(shù)據塊的邏輯塊號 Ext2 alloc block 函數(shù)檢查goal是否指向一個預先分配給該文件的一個塊 是 則返回該塊的邏輯塊號 否則 忽略所有已經預分配的塊 調用ext2 new block 函數(shù) 查找新的空閑數(shù)據塊 24 04 2020 62 EXT2硬盤空間管理 分配數(shù)據塊 ext2 new block 函數(shù)查找空閑塊的策略如果傳遞給ext2 alloc block 函數(shù)的預分配塊 goal 空閑 則分配之否則 檢查緊跟預分配塊之后的64個塊是否有空閑如果這64個塊中沒有空閑的塊 則考慮所有的組 從包含goal的組開始過搜索對于每一個組 查找連續(xù)的8個空閑塊 如果沒有 則查找單個空閑塊 一旦空閑塊找到 搜索即停止 firstmatch算法 結束分配之前 ext2 new block 仍然試圖預分配8個連接的空閑塊 24 04 2020 63 EXT2硬盤空間管理 釋放數(shù)據塊 釋放數(shù)據塊當一個進程刪除文件或是將文件長度置0的時候 所有分配給該文件的數(shù)據塊將被回收 此時調用的函數(shù)是ext2 truncate 該函數(shù)調用的參數(shù)是文件的索引結點地址 此函數(shù)將掃描索引結點中i block數(shù)組 得到分配給該文件的數(shù)據塊的塊號信息 所有這些數(shù)據塊 將由ext2 free blocks 函數(shù)負責回收 Ext2 free blocks 函數(shù)調用的參數(shù)有 文件的索引結點 要被釋放的數(shù)據塊的首地址 塊號 要被連續(xù)釋放的塊數(shù) 此函數(shù)首先調用lock super 給superblock上鎖 然后進行如下操作 得到數(shù)據塊位圖 將要被釋放的數(shù)據塊所對應的位圖中的位置0 將組描述符中的 空閑塊數(shù) 域 bg free blocks count 增1 將superblock中的 空閑塊數(shù) 域 s free blocks count 增1 最后 再調用uplock super 給superblock解鎖 24 04 2020 64 Ext2的普通文件讀寫實現(xiàn) 虛擬文件系統(tǒng) VFS 上對文件的讀寫是通過系統(tǒng)調用read 或write 來實現(xiàn)的 從文件系統(tǒng)的層次看 這些系統(tǒng)調用對應著一系列的 底層 操作 下面分析Ext2文件系統(tǒng)的寫操作過程 Ext2的寫操作函數(shù)是ext2 file write 它有4個參數(shù) fd文件描述符 buf寫入數(shù)據的緩沖區(qū)地址 count寫入的字節(jié)大小 ppos指向保存文件地址指針上述寫函數(shù)的工作過程如下步驟 剔除對該文件擁有特權的特權用戶 將寫入地址移動到文件需要寫入的地方 計算文件內的地址與文件系統(tǒng)中塊的地址的對應關系 寫操作前準備 24 04 2020 65 Ext2的普通文件讀寫實現(xiàn) 寫操作前準備 a 調用ext2 getblk 得到空閑數(shù)據塊b 等待可能存在的讀操作完成c 將寫緩沖區(qū)的數(shù)據復制到數(shù)據塊d 調用update vm cache 將cache中的數(shù)據同步 更新文件索引結點中的i size域 設置索引結點中與時間相關域 比如 文件訪問時間 修改時間 更新ppos指針 返回已經寫入文件的字節(jié)數(shù) 24 04 2020 66 類Ext2文件系統(tǒng) 結構設計 Ext2文件系統(tǒng)是一個實際可用的文件系統(tǒng) 實在是太龐大了 為了進行簡單的模擬 基于Ext2的思想和算法 設計一個類Ext2的文件系統(tǒng) 實現(xiàn)Ext2文件系統(tǒng)的一個功能子集 并且用現(xiàn)有操作系統(tǒng)上的文件來代替硬盤進行硬件模擬 設計文件系統(tǒng)應該考慮的幾個層次介質的物理結構物理操作 設備驅動程序完成文件系統(tǒng)的組織結構 邏輯組織結構 對組織結構其上的操作為用戶使用文件系統(tǒng)提供的接口類ext2文件系統(tǒng)的數(shù)據結構塊的定義為簡單起見 邏輯塊大小與物理塊大小均定義為512字節(jié) 由于位圖只占用一個塊 因此 每個組的數(shù)據塊個數(shù)以及索引結點的個數(shù)均確定為512 8 4096 進一步 每組的數(shù)據容量確定為4096 512B 2MB 另外 模擬系統(tǒng)中 假設只有一個用戶 故可以省略去文件的所有者ID的域 組描述符為簡單起見 只定義一個組 因此 組描述符只占用一個塊 同時 superblock塊省略 其功能由組描述符塊代替 即組描述符塊中需要增加文件系統(tǒng)大小 索引結點的大小 卷名等原屬于superblock的域 由此可得組描述符的數(shù)據結構如下 見下頁 24 04 2020 67 類Ext2文件系統(tǒng) 組描述符 structext2 group desc 類型bytes域釋意char 16bg volume name 16 卷名 u162bg block bitmap 保存塊位圖的塊號 u162bg inode bitmap 保存索引結點位圖的塊號 u162bg inode table 索引結點表的起始塊號 u162bg free blocks count 本組空閑塊的個數(shù) u162bg free inodes count 本組空閑索引結點的個數(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) 索引結點 索引結點數(shù)據結構由于容量已經確定 文件最大即為2MB 需要4096個數(shù)據塊 索引結點的數(shù)據結構中 仍然采用多級索引機制 由于文件系統(tǒng)總塊數(shù)必然小于4096 2 所以只需要13個二進制位即可對塊進行全局計數(shù) 實際實現(xiàn)用unsignedint16位變量 即2字節(jié)表示1個塊號 在一級子索引中 如果一個數(shù)據塊都用來存放塊號 則可以存放512 2 256個 因此 只使用一級子索引可以容納最大的文件為256 512 128KB 需要使用二級子索引 只使用二級子索引時 索引結點中的一個指針可以指向256 256個塊 即256 256 512 8MB 已經可以滿足要求了 為了盡量 像 ext2 也為了簡單起見 索引結點的直接索引定義6個 一級子索引定義1個 二級子索引定義1個 總計8個指針 24 04 2020 69 類Ext2文件系統(tǒng) 索引結點 索引結點的數(shù)據結構定義structext2 inode 類型字節(jié)長度域釋意 u162i mode 文件類型及訪問權限 u162i blocks 文件的數(shù)據塊個數(shù) u324i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論