互斥,同步,信號量,管程概述

本文爲閱讀操作系統原理及網上博客的筆記及自己的總結,以備查閱回顧

操作系統中,進程是佔有資源的最小單位(線程可以訪問其所在進程內的所有資源,但線程本身並不佔有資源或僅僅佔有一點必須資源)。


互斥:多個進程不能同時使用同一個資源;競爭使用臨界資源;導致死鎖(兩進程臨界資源相互依賴卻同時被佔用),飢餓(有些進程永遠執行不到)

同步:一個進程的執行受其他進程的影響,需要其他進程的某些內容作爲繼續執行的依據;

異步:兩進程執行完全不相互影響;

通信:多個進程間交換信息;比如互斥的信息,同步的信息;


臨界(互斥)資源:一次只允許一個進程使用的資源

臨界區:進程中訪問臨界資源的代碼段

進入區:檢查臨界資源,設置標誌

退出區:恢復訪問標識

剩餘區:上述三區之外


互斥和同步並不對立,互斥也是一種同步;

實現進程互斥的同步機制準則:空閒讓進,忙則等待,有限等待,讓權等待

 

互斥實現的硬件方法:

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可以進行操作

cwaitnc)操作:緊急等待隊列有進程,調出執行第一個,否則釋放管程互斥權,本進程進入c變量等待隊列

csignalc)操作:C非空,喚醒第一個等待進程,本進程進入緊急等待隊列尾部


發佈了48 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章