1.程序模型:乙個程序就是乙個正在執行程式的例項,包括程式計數器、暫存器和當前變數的值。乙個程序是某種型別的乙個活動,它有程式、輸入、輸出以及狀態
2.程序的建立
四種主要事件會導致程序的建立:
程序建立之後,父程序和子程序有各自不同的位址空間
3.程序的終止
程序的終止通常由下列條件引起:
4.程序的層次結構
在unix中,程序和它的所有子程序以及後裔共同組成乙個程序組,所有的程序都屬於以init為根的一棵樹
5.程序的狀態
6.程序的實現
作業系統維護著一張**,即程序表。每個程序占用乙個程序表項。
該表項包含了程序狀態的重要資訊,包括程式計數器、堆疊指標、記憶體分配狀況、所開啟檔案的狀態、賬號和排程資訊,以及其他在程序由執行態轉換為就緒態或阻塞態時必須儲存的資訊
執行緒
1.執行緒的使用
2.經典的執行緒模型
程序:用某種方法把相關的資源集中在了一起。程序有存放程式正文和資料以及其他資源的位址空間。這些資源中包括開啟的檔案、子程序、即將發生的計時器、訊號處理程式、賬號資訊等。把它們都放到程序中可以更容易管理。
執行緒:有乙個程式計數器,用來記錄要執行哪一條指令。暫存器,用來儲存執行緒當前的工作變數。堆疊,用來記錄執行歷史,其中每一幀儲存了乙個以呼叫的但是沒有從中返回的過程。
程序用於把資源集中到一起,執行緒則是在cpu上被排程執行的實體
執行緒概念試圖實現的是,共享一組資源的多個執行緒的執行能力,以便這些執行緒可以為完成某一任務而共同工作
3.posix執行緒
執行緒呼叫
描述pthread_create
建立乙個新執行緒
pthread_exit
結束呼叫的執行緒
pthread_join
等待乙個特定的執行緒退出
pthread_yield
釋放cpu來執行另乙個執行緒
4.在使用者空間中實現執行緒
優點:
使用者級執行緒包可以在不支援執行緒的作業系統上實現
在使用者空間管理執行緒時,每個程序需要有其專用的執行緒表,用來跟蹤該程序中的執行緒
進行執行緒切換比陷入核心要快乙個數量級以上,這是使用使用者級執行緒包的極大的優點
不需要陷入核心,不需要上下文切換,也不需要對記憶體快取記憶體進行重新整理,使得執行緒排程非常快捷
允許每個程序有自己定製的排程演算法
缺點:
如何阻塞系統呼叫
如果乙個執行緒開始執行,那麼在該程序中的其他執行緒就不能執行,除非第乙個執行緒自動放棄cpu
5.在核心中實現執行緒
核心中有用來記錄系統中所有執行緒的執行緒表
核心的執行緒表中儲存了每個執行緒的暫存器、狀態和其他資訊
6.混合實現
使用核心級執行緒,然後將使用者級執行緒與某些或者全部核心執行緒多路復用起來
每個核心級執行緒有乙個可以輪流使用的使用者級執行緒集合
7.排程程式啟用機制
目標是模擬核心執行緒的功能,但是為執行緒包提供通常在使用者空間中才能實現的更好的效能和更大的靈活性
當核心了解到乙個執行緒被阻塞後,核心通知該程序的執行時系統,並且在堆疊中以引數形式傳遞有問題的執行緒編號和所發生事件的乙個描述
把當前執行緒標記為阻塞,從就緒表中取出另乙個執行緒,設定其暫存器,然後再啟動之。
8.彈出式執行緒
乙個訊息的到達導致系統建立乙個處理該訊息的執行緒
9.使單執行緒**多執行緒化
1.競爭條件
即兩個或多個程序讀寫某些共享資料,而最後的結果取決於程序執行的精確時序,稱為競爭條件
2.臨界區
互斥:以某種手段確保當乙個程序在使用乙個共享變數或檔案時,其他程序不能做同樣的操作
把對共享記憶體進行訪問的程式片段稱作臨界區域或臨界區
滿足的條件:
3.忙等待的互斥
(1)遮蔽中斷 :在單處理器系統中,最簡單的辦法是使每個程序在剛剛進入臨界區後立即遮蔽所有中斷,並在就要離開之前在開啟中斷。遮蔽中斷對於作業系統本身而言是一項很有用的技術,但對於其他使用者程序則不是一種合適的通用互斥機制
(2)鎖變數:軟體方式,通過設定乙個共享變數來檢測是否有程序訪問臨界區
(3)嚴格輪換法:利用忙等待的鎖(自旋鎖)實現
(4)peterson解法
(5)tsl:硬體解法(測試並加鎖),執行tsl指令的cpu將鎖住記憶體匯流排,以禁止其他cpu在本指令結束之前訪問記憶體。為了使用tsl指令,要使用乙個共享變數lock來協調對共享記憶體的訪問。乙個可替代tsl的指令時xchg,它原子性地交換了兩個位置的內容
4.睡眠與喚醒
通過sleep和wakeup原語:使得程序在無法進入臨界區時阻塞而不是忙等待
5.訊號量
它使用乙個整型變數來累計喚醒次數,乙個訊號量的取值可以為0(表示沒有儲存下來的喚醒操作)或者為正數(表示有乙個或多個喚醒操作)
設立兩種操作down和up
對一訊號量執行down操作,則是檢查其值是否大於0,若該值大於0,則將其值減1並繼續;若該值為0,則程序將睡眠,而且此時down操作並未結束
up操作對訊號量的值增1。如果乙個或多個程序在該訊號量上睡眠,無法完成乙個先前的操作down,則由系統選擇乙個並允許該程序完成它的down操作
6.互斥量
訊號量的簡化版本,僅僅適用於管理共享資源或者一小段**
7.管程
乙個管程是乙個由過程、變數及資料結構等組成的乙個集合,它們組成乙個特殊的模組或軟體包
管程有乙個很重要的特性,即任意時刻管程中只能有乙個活躍程序,這一特性使程序能有效的完成互斥
阻塞問題通過條件變數wait和signal解決
8.訊息傳遞
使用send和receive原語進行程序間通訊
為了防止資訊丟失,傳送方和接收方達成如下協議:一旦接收到訊息,接收方馬上回送一條特殊的確認訊息;如果傳送方在一段時間間隔內未收到確認,則重發訊息。通過設定序列號避免重複接收訊息
9.屏障
用於程序組的同步機制
10.避免鎖:讀—複製—更新
1.排程簡介:
某些程序花費了絕大多數時間在計算上,稱為計算密集型;某些程序在等待i/o上花費了絕大多數時間,稱為i/o密集型
排程演算法的目標
所有系統
公平——給每個程序公平的cpu份額
策略強制執行——保證規定的策略被執行
平衡——保持系統的所有部分都忙碌
批處理系統
吞吐量——每小時最大作業數
周轉時間——從提交到終止間的最小時間
cpu利用率——保持cpu始終忙碌
互動式系統
響應時間——快速響應請求
均衡性——滿足使用者的期望
實時系統
滿足截止時間——避免丟失資料
可**性——在多**系統中避免品質降低
2.批處理系統中的排程
(1)先來先服務:程序按照它們請求cpu的順序使用cpu。乙個單鏈表記錄了所有的就緒程序
(2)最短作業優先:適用於執行時間可以預知的另乙個非搶占式的批處理排程演算法
(3)最短剩餘時間優先:最短作業優先的搶占式版本,排程程式總是選擇剩餘執行時間最短的那個程序執行
3.互動式系統中的排程
(1)輪轉排程:每個程序被分配乙個時間段,稱為時間片,即允許該程序在該時間段執行;時間段設定的太短會導致過多的程序切換降低了cpu效率;設定太長又可能引起對短的互動請求的響應時間變長
(2)優先順序排程:每個程序被賦予乙個優先順序,允許優先順序最高的可執行程序先執行;為了防止高優先順序程序無休止的執行,可以通過每個時鐘中斷降低當前程序的優先順序或者為每個程序賦予乙個允許執行的最大時間片
(3)多級佇列:屬於最高優先順序類的程序執行乙個時間片,屬於次高階優先類的程序執行2個時間片,再次一級的程序執行4個時間片,以此類推
(4)最短程序優先
(5)保證排程:向使用者作出明確的效能保證並實現,系統必須跟蹤各個程序自建立以來使用了多少cpu時間
(6)彩票排程:基本思想是為程序提供各種系統資源的彩票,一旦需要做出一項排程決策時,就隨機抽出一張彩票,擁有該彩票的程序獲得該資源
(7)公平分享排程:考慮程序擁有者這一因素,根據使用者分配cpu時間
4.實時系統中的排程
硬實時:必須滿足絕對的截止時間
軟實時:雖然不希望偶爾錯失截止時間,但是可以容忍
5.策略和機制
排程機制位於核心,排程策略由使用者程序決定
6.執行緒排程
使用者級執行緒:核心不知道執行緒的存在,所以只是把時間片分給程序使用;當執行緒用完了該程序被分配的時間片之後,核心會選擇另乙個程序執行。一般使用輪轉演算法或者優先順序演算法
核心級執行緒:核心選擇乙個特定的執行緒執行
兩者的差別在於效能:使用者級執行緒的執行緒切換只需要少量的機器指令,核心級執行緒需要完整的上下文切換,修改記憶體映像,使快取記憶體失效,這導致若干數量級的延遲;使用者級執行緒可以使用專為應用程式定製的執行緒排程程式
哲學家就餐問題
讀—寫問題
現代作業系統
只有認為等待時間非常短的情形下,才使用忙等待。用於忙等待的鎖,稱為自旋鎖 spin lock 在互斥時間很短而掛起等待的時間開銷很大時,可以採用活鎖 livelock,沒有出現死鎖,但現象上看好像死鎖發生了 輪詢 忙等待 可用於進入臨界區或訪問資源。接收者發起的分布式啟發演算法。分布式系統新增在其底...
現代作業系統 死鎖
前言 現代作業系統 死鎖這一部分也是非常的重要,在這裡詳細介紹了死鎖出現的條件已經避免死鎖的方法。我的github 死鎖 概述 一 資源定義 1.我們把需要排他性使用的物件叫做資源。2.資源分成可搶占和不可搶占型 二 死鎖定義 如果乙個程序集合中的每個程序都在等待只能由該程序合集中的其他程序才能引發...
《現代作業系統》筆記
特色 1.講述了作業系統演變的過程 2.沒有空洞講述概念,用圖表和c 講了作業系統的具體實現 什麼是作業系統 自頂向下看,作業系統是擴充套件機器,向使用者提供抽象。自底向上看,作業系統是資源管理者,給程序提供資源。設計思想 1.利用cpu高速和人類及i o裝置之間的低速的差距,多個程序共享cpu,虛...