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