1. 程式人生 > 其它 >作業系統——程序和執行緒

作業系統——程序和執行緒

程序五個狀態:建立、就緒、阻塞、執行、結束(阻塞掛起狀態、就緒掛起狀態)

PCB(儲存程序切換時的相關資訊,以便程序重新執行從斷點處執行)

程序和執行緒的區別:

(1)常見的說法。程序是資源分配的最小單位,執行緒是資源排程的最小單位。

(2)從資源角度。程序擁有一個完整的資源平臺,執行緒只獨享必不可少的資源,如暫存器和棧。

(3)從狀態角度。執行緒同樣有就緒、阻塞、執行三種基本狀態,同樣有狀態轉換。

(4)從時間和空間開銷角度。執行緒能減少開銷。執行緒建立時不涉及資源管理資訊,而是共享他們。釋放時釋放的資源比較少。切換時不切換頁表。通訊時共享資源,無需經過核心耗時。

程序切換有非搶佔式排程和搶佔式排程。

程序通訊問題如下。

(1)管道。匿名int pipe(int fd[2])只存在記憶體,不在檔案系統中,只能在相關程序如父子間通訊,只有單向通訊,雙向就要兩個管道。父程序fork子程序才有兩個f[0]和兩個f[1]。有名mkfifo,可以在不相關通訊。

效率低,不適合程序間資料頻繁交換。

(2)訊息佇列:考慮使用者態和核心態之間的資料拷貝耗時。

(3)共享記憶體:虛擬記憶體的一塊,不用拷貝,但是帶來資料混亂問題。

(4)訊號量:解決資料混亂問題,整型計數器表示資源個數(PV操作),實現互斥1和同步0,不用於快取通訊之間的資料。

(5)訊號:異常工作通知,SIG。

(6)socket:TCP位元組流SOCK_STREAM,UDP資料包SOCK_DGRAM,本地socket。

執行緒同步問題如下。

互斥用鎖或訊號量,同步用訊號量。

生產者消費者問題。需要互斥:任何時候只能有一個執行緒操作緩衝區,說明緩衝區時臨界程式碼。需要同步:緩衝區為空的時候,消費者必須等待生產者生產資料;緩衝區滿的時候,生產者必須等待消費者取出資料。使用互斥訊號量實現。

哲學家就餐問題。方案一:使用訊號量PV,有可能五位哲學家同時拿起叉子,死鎖。方案二:一個哲學家進入臨界區準確拿起筷子,另一些不能動,可以,但是不能兩人同時進行。方案三:採用奇偶分支結構,偶數編號的哲學家先拿左邊的叉子再拿右邊的,奇數編號的哲學家先拿右邊的叉子再拿左邊的。

讀者寫者問題。讀優先、寫優先、公平讀寫策略。

死鎖:互斥條件、佔有並等待條件、不可剝奪條件、迴圈並等待條件(避免:資源有序分配)。

互斥鎖、自旋鎖:申請鎖失敗後的處理方式不同。互斥鎖要上使用者和核心之間下文切換,自旋鎖適用於執行時間較短的。

讀寫鎖:寫鎖是獨佔式的,類似互斥鎖和自旋鎖。讀鎖是共享式的。

上述都是悲觀鎖。悲觀和樂觀的區別在於多執行緒同時修改共享資源的概率不同。

樂觀鎖是無鎖程式設計,多人線上文件編輯、SVN、git,通過版本號。

加鎖時注意:加鎖粒度小、執行速度快、加合適的鎖。