清华大学 操作系统
文章目錄
- 1 introduction
- 2 啟動(dòng)、中斷、異常和系統(tǒng)調(diào)用
- 2.1 啟動(dòng)
- 2.2 中斷、異常、系統(tǒng)調(diào)用
- 3 內(nèi)存管理
- 3.1 連續(xù)內(nèi)存分配
- 3.2 非連續(xù)內(nèi)存分配
- 3.3 虛擬內(nèi)存
- 3.4 頁面置換算法
- 3.4.1 局部置換算法
- 3.4.2 全局置換算法:
- 3.4.2 抖動(dòng)和負(fù)載控制:
- 4 進(jìn)程控制
- 4.1 線程
- 4.2 進(jìn)程控制
- 4.2.1 進(jìn)程創(chuàng)建
- 4.2.2 進(jìn)程切換
- 4.3 處理器調(diào)度
- 4.4 同步互斥
- 4.5 信號(hào)量和管程
- 4.5.1 生產(chǎn)者-消費(fèi)者問題
- 4.5.2 哲學(xué)家就餐問題
- 4.5.3 讀者-寫者問題
- 4.6 死鎖
- 4.7 進(jìn)程通信
- 5 文件管理
- 5.1 文件緩存
- 5.2 文件分配:分配一個(gè)文件數(shù)據(jù)塊的位置和順序
- 5.3 空閑空間組織和冗余磁盤陣列
- 6 I/O管理
1 introduction
**教學(xué)內(nèi)容:**操作系統(tǒng)結(jié)構(gòu)、中斷及系統(tǒng)調(diào)用、內(nèi)存管理、進(jìn)程線程,處理器調(diào)度、同步互斥、文件系統(tǒng)、I/O子系統(tǒng)
操作系統(tǒng)的定義:
- 一個(gè)控制程序
- 一個(gè)資源管理器
操作系統(tǒng)的組成:
- shell
- gui
- kernel
操作系統(tǒng)內(nèi)核特征:
- 并發(fā)
- 共享:同時(shí)訪問/互斥天
- 虛擬:多道程序設(shè)計(jì)
- 異步:走走停停
操作系統(tǒng)的演變:
單用戶系統(tǒng)->批處理系統(tǒng)、多程序系統(tǒng)->分時(shí)系統(tǒng)->個(gè)人計(jì)算機(jī)、分布式計(jì)算機(jī)
操作系統(tǒng)結(jié)構(gòu):
簡(jiǎn)單系統(tǒng):不同機(jī)器都操作系統(tǒng)不一樣,可移植性差
分層結(jié)構(gòu):提高了可移植性:unix
微內(nèi)核結(jié)構(gòu)(microkernel):更靈活,但性能更差
現(xiàn)在的操作系統(tǒng)基本是微內(nèi)核結(jié)構(gòu)和分層結(jié)構(gòu)的混合體
2 啟動(dòng)、中斷、異常和系統(tǒng)調(diào)用
2.1 啟動(dòng)
BIOS:Basic Input Output System,是一組固化到ROM上的程序,是個(gè)人電腦啟動(dòng)時(shí)加載的第一個(gè)軟件
BIOS啟動(dòng)固件作用:
- 基本輸入輸出程序
- 系統(tǒng)設(shè)置信息
- 開機(jī)后自檢程序
- 系統(tǒng)自啟動(dòng)程序:將記載程序從磁盤都引導(dǎo)扇區(qū)(512字節(jié))加載到0x7c00,之后跳轉(zhuǎn)到0x7c00,將操作系統(tǒng)的代碼和數(shù)據(jù)從硬盤加載到內(nèi)存中,跳轉(zhuǎn)到操作系統(tǒng)都起始地址
**系統(tǒng)啟動(dòng)出始化,從0xFFFF0讀第一條指令,CS:IP=0xF000:FFF0,第一條指令啥跳轉(zhuǎn)指令 - BIOS初始化
-
- 硬件自檢
-
- 顯卡等設(shè)備都初始化
-
- 執(zhí)行系統(tǒng)BIOS
-
- 按制定啟動(dòng)順序從軟盤、硬盤或光驅(qū)啟動(dòng)
-
- 主引導(dǎo)記錄MBR:有硬盤分區(qū)表描述分區(qū)狀態(tài)和位置,加載并跳轉(zhuǎn)到磁盤上都引導(dǎo)程序
- 跳到活動(dòng)分區(qū)的引導(dǎo)分區(qū),再跳轉(zhuǎn)到加載程序
- 加載程序(bootloader)從文件系統(tǒng)中讀取啟動(dòng)配置信息,根據(jù)配置去加載內(nèi)核
UEFI:統(tǒng)一的可擴(kuò)展固件接口(Unified Extensible Firmware Interface)再所有平臺(tái)上一致都操作系統(tǒng)啟動(dòng)服務(wù),對(duì)引導(dǎo)記錄都可行性進(jìn)行檢查
2.2 中斷、異常、系統(tǒng)調(diào)用
異常:非法指令導(dǎo)致當(dāng)前指令失敗后都處理請(qǐng)求
中斷:來在硬件設(shè)備都處理請(qǐng)求
系統(tǒng)調(diào)用:應(yīng)用程序主動(dòng)向操作系統(tǒng)發(fā)出都服務(wù)請(qǐng)求
程序訪問通常啥通過高層次API接口而不是直接進(jìn)行系統(tǒng)調(diào)用
三種最常用都應(yīng)用程序編程接口(API):
- win32 API for windows
- POSIX API for Unix, Linux, Mac OSX
- Java API for JVM
系統(tǒng)調(diào)用和函數(shù)調(diào)用都不同 - INT和IRET用于系統(tǒng)調(diào)用,涉及到堆棧切換和特權(quán)級(jí)都轉(zhuǎn)換
- CALL和RET用于函數(shù)調(diào)用,不需要堆棧切換
- 因?yàn)閮?nèi)核態(tài)和用戶態(tài)的切換,系統(tǒng)調(diào)用都開銷是大于函數(shù)調(diào)用都
3 內(nèi)存管理
內(nèi)存管理的目標(biāo)
抽象:邏輯地址空間
保護(hù):獨(dú)立地址空間
共享:訪問相同內(nèi)存
虛擬化:更大都地址空間
內(nèi)存管理方式:
重定向relocation
分段segmentation
分頁paging
虛擬存儲(chǔ)virtual memory
3.1 連續(xù)內(nèi)存分配
連續(xù)內(nèi)存分配:給進(jìn)程分配一塊不小于指定大小都連續(xù)都物理內(nèi)存區(qū)域
內(nèi)存碎片:不能被利用都空閑內(nèi)存,內(nèi)部碎片和外部碎片
動(dòng)態(tài)內(nèi)存分配:當(dāng)程序被加載執(zhí)行時(shí),分配一個(gè)進(jìn)程指定大小可變分區(qū):
動(dòng)態(tài)分區(qū)的分配測(cè)略:
- 最先匹配:簡(jiǎn)單,會(huì)有外部碎片,分配大空間內(nèi)存時(shí)速度慢
- 最佳匹配:避免大都空閑分區(qū)被拆分,但釋放分區(qū)較復(fù)雜
- 最差匹配:中等大小都分配較多時(shí),效果最好,避免出現(xiàn)太多小碎片,釋放分區(qū)較復(fù)雜
碎片整理: - 緊湊:調(diào)整進(jìn)程占用都分區(qū)位置來減少或避免分區(qū)碎片,需要保證所有應(yīng)用程序啥可動(dòng)態(tài)重定位
- 分區(qū)對(duì)換:搶占并回收處于等待狀態(tài)進(jìn)程都分區(qū),以增大可用內(nèi)存空間
伙伴系統(tǒng)buddy system:
初始狀態(tài)只有一個(gè)大小為2u2^u2u的空閑塊,從小到大在空閑塊數(shù)組中找最小的可用空閑塊,如果空閑塊過大,對(duì)空閑塊進(jìn)行二等分,直到大小合適都可用空閑塊
空閑塊合并條件:大小相同,地址相鄰,起始地址較小都?jí)K都起始地址是2(i+1)2^(i+1)2(i+1)
3.2 非連續(xù)內(nèi)存分配
連續(xù)分配的缺點(diǎn):物理內(nèi)存必須連續(xù),存在外碎片和內(nèi)碎片,內(nèi)存利用率低
非連續(xù)分配:允許共享代碼和數(shù)據(jù),支持動(dòng)態(tài)加載和動(dòng)態(tài)鏈接
段式存儲(chǔ)管理segmentation:
將進(jìn)程空間由多個(gè)段組成:數(shù)據(jù)、代碼、堆棧,粒度比較大
段號(hào)去段表找基址,加上偏移就是物理地址
頁式存儲(chǔ)管理
將物理地址空間劃分成相同大小的基本分配單元
幀frame:物理內(nèi)存被劃分成大小相等的幀
頁page:邏輯地址空間被劃分成大小相同的頁
頁表:邏輯地址到物理地址之間都映射關(guān)系
頁表基址寄存器PTBR:page table basse register
如何減少頁表大小?
- 快表TLB:translation look-aside buffer:緩存近期訪問的頁表項(xiàng)
- 多級(jí)頁表:通過間接引用建立頁表樹
- 頁寄存器:讓頁表與物理地址相對(duì)應(yīng),根據(jù)物理幀號(hào)尋找邏輯頁號(hào):邏輯地址進(jìn)行hash變換->快表中找頁表項(xiàng)
- 反置頁表:類似頁寄存器,把進(jìn)程id也考慮進(jìn)來:邏輯地址+pid進(jìn)行hash變換->反置頁表中找頁表項(xiàng)
段頁式存儲(chǔ)管理需求
段式存儲(chǔ)在內(nèi)存保護(hù)方面有優(yōu)勢(shì),頁式存儲(chǔ)再內(nèi)存利用效率和優(yōu)化轉(zhuǎn)移到后備存儲(chǔ)方法有優(yōu)勢(shì)
在段式存儲(chǔ)管理都基礎(chǔ)上,給每一個(gè)段加一級(jí)頁表
邏輯地址->段表->頁表->物理地址
段頁式存儲(chǔ)管理中都內(nèi)存共享:不同進(jìn)程的段表中的共享段,指向相同的頁表項(xiàng)
3.3 虛擬內(nèi)存
覆蓋overlay:程序員給出模塊間邏輯覆蓋結(jié)構(gòu),發(fā)生再運(yùn)行程序都內(nèi)部模塊間
交換swap:以進(jìn)程為單位交換,發(fā)生在內(nèi)存進(jìn)程間
虛擬存儲(chǔ)技術(shù)都目標(biāo):只把部分程序放到內(nèi)存中,從而運(yùn)行比物理內(nèi)存大的程序
實(shí)現(xiàn)進(jìn)程在內(nèi)存和外存之間的交換,從而獲得更多的空閑內(nèi)存空間
分支局部性:一條跳轉(zhuǎn)指令的兩次執(zhí)行,很可能跳到相同的內(nèi)存位置
缺頁異常->查找在外存中都頁面->頁面置換
3.4 頁面置換算法
置換算法:當(dāng)出現(xiàn)缺頁異常時(shí),調(diào)入新頁面且內(nèi)存已滿時(shí),置換算法選擇被置換的物理頁面
頁面鎖定:描述必須常駐內(nèi)存的邏輯頁面,是操作系統(tǒng)的關(guān)鍵部分,或者是要求相應(yīng)速度的代碼和數(shù)據(jù)
局部頁面置換算法:置換頁面的選擇范圍僅限于當(dāng)前進(jìn)程占用的物理頁面內(nèi)
全局頁面置換算法:置換頁面的選擇范圍是所有可換出的物理頁面
3.4.1 局部置換算法
- 最優(yōu)置換算法optimal:置換未來最長(zhǎng)時(shí)間不訪問的頁面,是理想情況,實(shí)際系統(tǒng)中無法實(shí)現(xiàn)
- 先進(jìn)先出算法FIFO:鏈表元素按駐留內(nèi)存的時(shí)間排序,鏈?zhǔn)鬃铋L(zhǎng),鏈尾最短
- 最近最久未使用算法LRU:選擇最長(zhǎng)時(shí)間沒有被引用的頁面進(jìn)行置換,是最優(yōu)置換算法的一個(gè)近似
可以通過頁面鏈表來實(shí)現(xiàn),維護(hù)一個(gè)按最近訪問時(shí)間排序的頁面鏈表,或者是活動(dòng)頁面棧 - 時(shí)鐘置換算法:在LRU和FIFO的折中,設(shè)一個(gè)訪問位,訪問頁面的時(shí)候,訪問位置1,缺頁的時(shí)候指針順序檢查環(huán)形鏈表,就像時(shí)鐘一樣
- 改進(jìn)的時(shí)鐘置換算法:如果,一個(gè)頁面有修改,則修改位為1,缺頁時(shí)跳過有修改的頁面,有修改的頁面可以在其他時(shí)候?qū)懙酵獯嬷?/li>
- 最不常用算法LFU:每個(gè)頁面設(shè)置一個(gè)訪問計(jì)數(shù),訪問頁面時(shí)訪問計(jì)數(shù)加1,缺頁時(shí)置換計(jì)數(shù)最小的頁面
belady現(xiàn)象:采用FIFO算法,可能出現(xiàn)分配物理頁面數(shù)增加時(shí),缺頁率反而增加
這是因?yàn)镕IFO記錄信息少,而LRU算法因?yàn)橛涗浶畔⒏?#xff0c;沒有belady現(xiàn)象,但是開銷也更大
3.4.2 全局置換算法:
因?yàn)檫M(jìn)程在不同階段的內(nèi)存需求是變化的,所有全局置換算法需要確定分配給進(jìn)程的物理頁面數(shù)
CPU利用率和并發(fā)進(jìn)程數(shù)存在相互促進(jìn)和制約的關(guān)系:
并發(fā)進(jìn)程導(dǎo)致內(nèi)存訪問增加,并發(fā)進(jìn)程的內(nèi)存訪問會(huì)降低訪存的局部性特征
工作集W(t,Δ)W(t,\Delta)W(t,Δ)指當(dāng)前時(shí)刻t前的Δ\DeltaΔ時(shí)間窗口中的所有訪問頁面所組成的集合
工作集置換算法:換出不在工作集中的頁面,有點(diǎn)類似LRU
缺頁率=缺頁平均時(shí)間間隔的倒數(shù)
缺頁率算法:如果進(jìn)程缺頁率過高,則增加常駐集以分配更多的物理頁
3.4.2 抖動(dòng)和負(fù)載控制:
**抖動(dòng)thrashing:**進(jìn)程物理頁面太少,不能包含工作集,頻繁置換
所以說操作系統(tǒng)要在并發(fā)和缺頁率之間達(dá)到一個(gè)平衡,調(diào)節(jié)并發(fā)進(jìn)程數(shù)MPL進(jìn)行系統(tǒng)負(fù)載控制
最好是∑wi=\sum{w_i}=∑wi?=內(nèi)存的大小
或者是平均缺頁間隔時(shí)間(MTBF)=缺頁異常處理時(shí)間(PFST)的點(diǎn),這時(shí)候我們認(rèn)為缺頁的時(shí)候缺頁異常來得及處理
4 進(jìn)程控制
進(jìn)程控制塊PCB:porcess control block:操作系統(tǒng)管理控制進(jìn)程運(yùn)行所用的信息集合
- 進(jìn)程標(biāo)識(shí)信息
- 處理機(jī)現(xiàn)場(chǎng)保存:PC, SP
- 進(jìn)程控制信息:進(jìn)程間通信和存儲(chǔ)信息
三狀態(tài)進(jìn)程模型:運(yùn)行、就緒、等待,此外還有創(chuàng)建和退出這兩個(gè)狀態(tài)
進(jìn)程掛起:處于掛起的進(jìn)程映像放在外存中 - 就緒到就緒掛起:高優(yōu)先級(jí)進(jìn)程等待,低優(yōu)先級(jí)進(jìn)程就緒,為了釋放空間
- 等待掛起:就緒進(jìn)程需要更多的內(nèi)存空間
- 運(yùn)行到就緒掛起:在搶先式分時(shí)操作系統(tǒng)中,高優(yōu)先級(jí)進(jìn)程就緒
激活:把一個(gè)進(jìn)程從外存轉(zhuǎn)到內(nèi)存
4.1 線程
單進(jìn)程多線程系統(tǒng):對(duì)并發(fā)執(zhí)行要求高、對(duì)信息共享要求高,對(duì)安全隔離要求低
線程能減少并發(fā)執(zhí)行的時(shí)間和空間開銷:
線程的創(chuàng)建時(shí)間、終止時(shí)間、切換時(shí)間比進(jìn)程短,共享內(nèi)存和文件資源
用戶線程:用一組用戶級(jí)的線程庫函數(shù)來完成線程的創(chuàng)建終止同步和調(diào)度,可以自己寫調(diào)度算法,不需要和內(nèi)核態(tài)切換,
缺點(diǎn)是線程發(fā)起系統(tǒng)調(diào)用而阻塞時(shí),整個(gè)進(jìn)程進(jìn)入等待,線程只能按進(jìn)程分配CPU時(shí)間,多個(gè)線程進(jìn)程中,每個(gè)線程的時(shí)間片就少
內(nèi)核線程:由內(nèi)核維護(hù)PCB和TCB,使得進(jìn)程是資源分配的單位,線程是處理器調(diào)度單位
**結(jié)論:**用戶線程和內(nèi)核線程一對(duì)一最好
4.2 進(jìn)程控制
4.2.1 進(jìn)程創(chuàng)建
windows進(jìn)程創(chuàng)建api:CreateProcess(filename)
unix進(jìn)程創(chuàng)建系統(tǒng)調(diào)用api:fork/exec
fork()父進(jìn)程返回子進(jìn)程pid,子進(jìn)程返回0
exec()加載新程序取代當(dāng)前運(yùn)行進(jìn)程pid不變
4.2.2 進(jìn)程切換
進(jìn)程生命周期的信息:寄存器、CPU狀態(tài)、內(nèi)存地址空間
為了提高效率,采用匯編代碼保存寄存器狀態(tài)
wait()系統(tǒng)調(diào)用:
子進(jìn)程結(jié)束時(shí)通過exit()向父進(jìn)程返回一個(gè)值
父進(jìn)程通過wait()接受病處理返回值
4.3 處理器調(diào)度
處理器調(diào)度:從就緒隊(duì)列中挑選下一個(gè)占用CPU運(yùn)行的進(jìn)程
比較調(diào)度算法的準(zhǔn)則:
- CPU使用率:CPU處于忙狀態(tài)的時(shí)間百分比
- 吞吐量:單位時(shí)間內(nèi)完成的進(jìn)程數(shù)量
- 周轉(zhuǎn)時(shí)間:進(jìn)程從初始化到結(jié)束的總時(shí)間
- 等待時(shí)間:進(jìn)程在就緒隊(duì)列中的總時(shí)間
- 響應(yīng)時(shí)間:從提交請(qǐng)求到產(chǎn)生響應(yīng)所花費(fèi)的總時(shí)間
調(diào)度算法:
- 先來先服務(wù)算法FCFS:簡(jiǎn)單,但是當(dāng)短進(jìn)程排在長(zhǎng)進(jìn)程之后時(shí),等待時(shí)間變長(zhǎng)長(zhǎng)
- 短進(jìn)程優(yōu)先算法:有最優(yōu)平均周轉(zhuǎn)時(shí)間,需要預(yù)估CPU執(zhí)行時(shí)間,可以用歷史執(zhí)行時(shí)間來預(yù)測(cè)未來,可能導(dǎo)致長(zhǎng)進(jìn)程一直在隊(duì)列中等待,不合理
一個(gè)變種是短剩余時(shí)間優(yōu)先算法,這樣就可以搶占正在執(zhí)行的進(jìn)程 - 最高響應(yīng)比優(yōu)先算法:每次選擇響應(yīng)比R最高的進(jìn)程,你等的時(shí)間越長(zhǎng),你的優(yōu)先級(jí)越高
R=(Twaiting+Tservice)/TserviceR=(T_waiting+T_service)/T_serviceR=(Tw?aiting+Ts?ervice)/Ts?ervice
其中TwaitingT_waitingTw?aiting是等待時(shí)間,TserviceT_serviceTs?ervice是執(zhí)行時(shí)間 - 時(shí)間片輪轉(zhuǎn)算法:時(shí)間片結(jié)束時(shí),按FCFS算法切換到下一個(gè)就緒進(jìn)程,
有額外的上下文切換
時(shí)間片太大,退化成FCFS;時(shí)間片太小,上下文切換太多,一般按經(jīng)驗(yàn)選擇10ms
公平,但是等待時(shí)間較差 - 多級(jí)隊(duì)列調(diào)度算法MQ:就緒隊(duì)列被劃分成多個(gè)獨(dú)立子隊(duì)列,每個(gè)隊(duì)列有自己的調(diào)度算法,隊(duì)列間可以按照時(shí)間片或者優(yōu)先級(jí)調(diào)度
- 多級(jí)反饋隊(duì)列算法MLFQ:進(jìn)程可以在不同隊(duì)列間移動(dòng)
- 公平共享調(diào)度FSS:保證不重要的組無法壟斷資源
實(shí)時(shí)調(diào)度:要指定時(shí)間內(nèi)完成
硬時(shí)限:錯(cuò)過任務(wù)時(shí)限會(huì)有災(zāi)難性后果
軟時(shí)限:有時(shí)不能滿足,則降低要求
- 速率單調(diào)調(diào)度算法:周期越短,優(yōu)先級(jí)越高
- 最早截止時(shí)間優(yōu)先算法
對(duì)稱多處理器調(diào)度SMP:每個(gè)處理器運(yùn)行自己的調(diào)度程序,調(diào)度程序?qū)蚕碣Y源的訪問需要同步
靜態(tài)進(jìn)程分配:進(jìn)程從開始到結(jié)束都被分配到一個(gè)固定的處理器,這樣調(diào)度的開銷小
動(dòng)態(tài)進(jìn)程分配:所有處理器共享一個(gè)公共的就緒隊(duì)列,這樣調(diào)度的時(shí)候需要各處理器同步
優(yōu)先級(jí)反置:高優(yōu)先級(jí)進(jìn)程長(zhǎng)時(shí)間等待低優(yōu)先級(jí)進(jìn)程占用資源的現(xiàn)象
基于優(yōu)先級(jí)的可搶占調(diào)度算法存在優(yōu)先級(jí)反置
解決方法:
4.4 同步互斥
程序并發(fā)執(zhí)行的好處:共享資源、加速、程序模塊化
原子操作atomic operation:不會(huì)出現(xiàn)部分執(zhí)行的狀態(tài)
臨界區(qū):進(jìn)程中訪問臨界資源的一段需要互斥執(zhí)行的代碼
臨界區(qū)的訪問規(guī)則:
空閑則入,忙則等待、有限等待
臨界區(qū)的實(shí)現(xiàn)方法:
- 禁用中斷:沒有中斷,沒有上下文切換,因此沒有并發(fā),禁用中斷后進(jìn)程無法停止
- 軟件方法:通過共享變量,需要忙等待,浪費(fèi)CPU時(shí)間
如果是多個(gè)線程:
- 操作系統(tǒng)的抽象方法
硬件提供一些原子操作,比如
利用test-and-set指令可以實(shí)現(xiàn)自旋鎖spinlock和無忙等待鎖,但是可能出現(xiàn)死鎖
4.5 信號(hào)量和管程
信號(hào)量semaphore是操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問的方法,用信號(hào)量表示系統(tǒng)資源的數(shù)量
是一種抽象的數(shù)據(jù)結(jié)構(gòu),由一個(gè)整形變量和兩個(gè)原子操作組成,可以實(shí)現(xiàn)訪問互斥和條件同步
管程moniter:多線程互斥訪問共享資源的程序結(jié)構(gòu),正在管程的線程可以臨時(shí)放棄管程
等待操作wait():將自己阻塞在等待隊(duì)列中,喚醒一個(gè)等待者
釋放操作signal():將等待對(duì)類中的一個(gè)線程喚醒
4.5.1 生產(chǎn)者-消費(fèi)者問題
任何時(shí)刻只能有一個(gè)線程操作緩沖區(qū)(互斥訪問)
緩沖區(qū)為空時(shí),消費(fèi)者必須等待生產(chǎn)者(條件同步)
緩沖區(qū)滿時(shí),生產(chǎn)者必須等待消費(fèi)者(條件同步)
4.5.2 哲學(xué)家就餐問題
5個(gè)哲學(xué)家圍著一個(gè)圓桌,桌子放著5支叉子,哲學(xué)家思考或者就餐,就餐就要同時(shí)拿起左右兩邊的叉子
4.5.3 讀者-寫者問題
讀者:只讀數(shù)據(jù)不改,允許多個(gè)讀者同時(shí)讀
寫者:讀取和修改數(shù)據(jù),讀-寫互斥,寫-寫互斥
用管程實(shí)現(xiàn)
4.6 死鎖
出現(xiàn)死鎖的必要條件:
- 互斥
- 持有并等待
- 非搶占:資源只能在進(jìn)程使用后自愿釋放
- 循環(huán)等待:進(jìn)程0等進(jìn)程1,進(jìn)程1等進(jìn)程2……
通常操作系統(tǒng)忽略死鎖,由應(yīng)用程序處理死鎖
死鎖處理方法: - 死鎖預(yù)防:限制對(duì)資源的請(qǐng)求,使得任何情況都不滿足死鎖的條件
- 死鎖避免:利用額外的先驗(yàn)信息,動(dòng)態(tài)檢查資源分配狀態(tài),確保不會(huì)出現(xiàn)死鎖,如銀行家算法
銀行家算法:客戶貸款數(shù)量不超過銀行擁有的最大值時(shí),銀行家應(yīng)盡量滿足客戶需要 - 死鎖檢測(cè):允許系統(tǒng)進(jìn)入死鎖,定期調(diào)用死鎖檢測(cè)算法來檢測(cè)是否出現(xiàn)死鎖
- 死鎖恢復(fù):一次終止一個(gè)進(jìn)程直至死鎖消除,按照進(jìn)程的優(yōu)先級(jí)、已運(yùn)行時(shí)間等順序終止
4.7 進(jìn)程通信
通信方式:
- 間接通信:通過操作系統(tǒng),利用消息隊(duì)列,一個(gè)消息隊(duì)列可以和多個(gè)進(jìn)程共享
- 直接通信:兩個(gè)進(jìn)程之間建立共享通道
- 阻塞通信:一方在等待,只是接收/發(fā)送了信息
- 非阻塞通信
四種通信機(jī)制: - 信號(hào)
- 管道
- 消息隊(duì)列
- 共享內(nèi)存
管道:進(jìn)程間通過內(nèi)存文件的通信機(jī)制
共享內(nèi)存:把同一個(gè)物理內(nèi)存區(qū)域同時(shí)映射到多個(gè)進(jìn)程的內(nèi)存地址空間的通信機(jī)制
不同進(jìn)程需要顯式設(shè)置共享內(nèi)存段,不過需要同步機(jī)制來協(xié)調(diào)數(shù)據(jù)訪問
5 文件管理
文件:具有符號(hào)名,由字節(jié)序列構(gòu)成的數(shù)據(jù)項(xiàng)集合
文件頭:文件系統(tǒng)元數(shù)據(jù)中的文件信息,包括文件屬性和文件存儲(chǔ)位置和順序
文件描述符:操作系統(tǒng)在打開文件表中維護(hù)的打開文件狀態(tài)和信息
- 包括文件指針:每個(gè)進(jìn)程最后一次讀寫位置
- 文件打開計(jì)數(shù)、
- 文件的磁盤位置:緩存數(shù)據(jù)訪問信息
文件系統(tǒng)的基本操作單位是數(shù)據(jù)塊
進(jìn)程訪問文件的模式:順序訪問、隨機(jī)訪問、索引訪問
多進(jìn)程如何同時(shí)訪問共享文件??讓應(yīng)用程序自己解決
操作系統(tǒng)只允許內(nèi)核修改目錄,應(yīng)用程序通過系統(tǒng)調(diào)用來訪問目錄。文件系統(tǒng)需要掛載才能被訪問
**文件別名:**兩個(gè)或多個(gè)文件名關(guān)聯(lián)同一個(gè)文件
- 硬連接:多個(gè)文件項(xiàng)指向一個(gè)文件
- 軟連接:快捷方式的形式,這樣刪除別名和刪除其他文件是一樣的
文件系統(tǒng)種類:
- 磁盤文件系統(tǒng):如FAT、NTFS、ext2/3
- 數(shù)據(jù)庫文件系統(tǒng):如WinFS
- 日志文件系統(tǒng):記錄文件系統(tǒng)的修改/時(shí)間
- 網(wǎng)絡(luò)/分布式文件系統(tǒng),如:NFS
虛擬文件系統(tǒng):不同的文件系統(tǒng)對(duì)上層的應(yīng)用程序有相同的API接口
文件系統(tǒng)基本數(shù)據(jù)結(jié)構(gòu)
- 文件卷控制塊:每個(gè)文件系統(tǒng)一個(gè):文件系統(tǒng)詳細(xì)信息,如塊大小,空余塊
當(dāng)文件系統(tǒng)掛載時(shí)進(jìn)入內(nèi)存 - 文件控制塊:每個(gè)文件一個(gè):文件詳細(xì)信息,如訪問權(quán)限,大小,擁有者
當(dāng)文件被訪問時(shí)進(jìn)入內(nèi)存 - 目錄項(xiàng):每個(gè)目錄項(xiàng)一個(gè):指向文件控制塊,父目錄,子目錄
遍歷到這個(gè)目錄時(shí)進(jìn)入內(nèi)存 - 打開文件表:每個(gè)進(jìn)程有一個(gè)打開文件表,系統(tǒng)有一個(gè)總的打開文件表
5.1 文件緩存
數(shù)據(jù)塊使用后被緩存,兩種數(shù)據(jù)塊緩存方式:數(shù)據(jù)塊緩存和頁緩存
頁緩存:在虛擬內(nèi)存中文件數(shù)據(jù)塊被映射成頁,文件的讀寫操作被轉(zhuǎn)換成對(duì)內(nèi)存的訪問
5.2 文件分配:分配一個(gè)文件數(shù)據(jù)塊的位置和順序
分配方式:
- 連續(xù)分配:文件讀取表現(xiàn)好,但是會(huì)有碎片,數(shù)據(jù)增加會(huì)有問題
- 鏈?zhǔn)椒峙?#xff1a;用數(shù)據(jù)塊鏈表存儲(chǔ):沒有碎片,無法實(shí)現(xiàn)隨機(jī)訪問,可靠性差,破壞一個(gè)鏈,后面的都沒有了
- 索引分配:給每個(gè)文件創(chuàng)建索引數(shù)據(jù)塊:沒有碎片,當(dāng)文件很小,存儲(chǔ)索引開銷不可忽略
- UFS多級(jí)索引分配:前面10個(gè)直接索引,超過10個(gè)再加1級(jí)間接索引塊,再超過就再加2級(jí)簡(jiǎn)介索引塊
5.3 空閑空間組織和冗余磁盤陣列
用位圖代表空閑數(shù)據(jù)塊列表,Di=0D_i=0Di?=0表示第i個(gè)數(shù)據(jù)塊空閑,但是這樣空閑數(shù)據(jù)塊鏈表太大
而鏈表的開銷較大,不如用鏈?zhǔn)剿饕?br />
磁盤分區(qū):磁盤上一組柱面的集合,一個(gè)分區(qū)內(nèi)可以減少尋道時(shí)間
文件卷:一個(gè)擁有完整文件系統(tǒng)實(shí)例的外存空間,通常常駐在磁盤的單個(gè)分區(qū)上
6 I/O管理
常見設(shè)備接口類型:
- 字符設(shè)備:鍵盤/鼠標(biāo)、串口
- 塊設(shè)備:以塊為單位,如磁盤驅(qū)動(dòng)器、光驅(qū)
- 網(wǎng)絡(luò)設(shè)備:以太網(wǎng)、無線
CPU北橋連高速設(shè)備,南橋連I/O設(shè)備
CPU與設(shè)備的通信方式:輪詢、中斷或DMA
I/O地址
- 內(nèi)存地址:MMU設(shè)置映射,將設(shè)備的寄存器/存儲(chǔ)映射到內(nèi)存地址空間
- 端口號(hào):通過CPU的I/O指令訪問I/O端口號(hào)
**磁盤調(diào)度算法:**通過優(yōu)化磁盤訪問請(qǐng)求順序來提高磁盤訪問性能
- FIFO算法
- 最短服務(wù)時(shí)間算法SSTF
- 掃描算法SCAN:磁盤在一個(gè)方向上移動(dòng),訪問所有未完成的請(qǐng)求,知道磁壁到達(dá)該方向上最后的磁道
磁盤緩存:磁盤扇區(qū)在內(nèi)存中的緩存
總結(jié)
- 上一篇: 基于AD的数字钟的设计和multisim
- 下一篇: BIT2022年春软件需求工程和UML建