本文爲閱讀操作系統原理及網上博客的筆記及自己的總結,以備查閱回顧
操作系統中,進程是佔有資源的最小單位(線程可以訪問其所在進程內的所有資源,但線程本身並不佔有資源或僅僅佔有一點必須資源)。
互斥:多個進程不能同時使用同一個資源;競爭使用臨界資源;導致死鎖(兩進程臨界資源相互依賴卻同時被佔用),飢餓(有些進程永遠執行不到)
同步:一個進程的執行受其他進程的影響,需要其他進程的某些內容作爲繼續執行的依據;
異步:兩進程執行完全不相互影響;
通信:多個進程間交換信息;比如互斥的信息,同步的信息;
臨界(互斥)資源:一次只允許一個進程使用的資源
臨界區:進程中訪問臨界資源的代碼段
進入區:檢查臨界資源,設置標誌
退出區:恢復訪問標識
剩餘區:上述三區之外
互斥和同步並不對立,互斥也是一種同步;
實現進程互斥的同步機制準則:空閒讓進,忙則等待,有限等待,讓權等待
互斥實現的硬件方法:
1. 禁止中斷,代價高,多CPU中對其他CPU不起作用
2. 專用機器指令
TS指令(Testand Set),類似酒店房間門口需打掃標誌,有的,纔可以進去打掃
描述函數:int ts(int lock)
{
Int ts =lock;
Lock=1;
Return ts;
}
Swap指令
增加了一個管理員老大爺,保管者唯一的鑰匙,取到鑰匙纔可以進去(),用完退回老大爺
硬件方法的優點:適用範圍廣,簡單,支持多臨界區
缺點:會死等,有可能飢餓死鎖
軟件方法:
簡單的設置一個標識是不妥當的,有可能同時進入需增加額外的標識,麻煩,且面對多進程時表述困難
信號量(信號燈 semaphore)引入:Dijkstra提出,(熟悉不,想想著名的Dijkstra算法)
是一個結構體,包含信號量的值與指向等待該信號的隊列的指針
其由操作系統維護,用戶只能初始化,與使用兩原語(前面介紹過原語)
P原語:執行信號量減一,小於0,進程阻塞,插入等待隊列
V原語:信號量加一,小於等於0,喚醒等待隊列進程
注意,信號量不止表示資源的佔用情況,還可以表示等待隊列中進程的數目(信號量小於0時,其絕對值表示)
管程:
PV操作分散在多個進程中,管理不便,使用有可能不當
引入新的進程同步工具-----管程
其定義了一個包含資源的數據結構,和一組操作,能同步進程,改變數據(挺像C++的類的)
管程內部數據只由內部函數訪問,函數分內外;外部函數(entry)是對外接口
管程每次只允許一個進程進入;故管程入口處有一入口等待隊列
管程內部的喚醒,出現多個等待進程,組成緊急等待隊列,優先級高於入口隊列,且最新喚醒的先執行
管程的互斥訪問由編譯程序在編譯時自動添加。是一個語言成分,是操作系統的固有成分
管程內部不同等待原因的變量c可以進行操作
cwaitn(c)操作:緊急等待隊列有進程,調出執行第一個,否則釋放管程互斥權,本進程進入c變量等待隊列
csignal(c)操作:C非空,喚醒第一個等待進程,本進程進入緊急等待隊列尾部