2015-03-13 167 views
0

我已經看了四周,似乎無法找到我的問題的答案。我一直試圖圍繞信號量和實際實現它們的地方。我知道信號量是一種操作系統功能,但也可以用於應用程序級別的程序。我的問題是,當操作系統(我認爲)應該處理訪問問題時,爲什麼需要在應用程序中使用信號量?操作系統信號量

回答

0

應用程序是一組進程,全部執行不同的代碼。

假設有2個進程 - 應用程序中的A和B. A和B想要以另一種方式訪問​​特定文件 - 「play.txt」。我的意思是A先訪問然後B然後A等等。

操作系統不知道這個執行順序。 OS只知道內核進程,這就是爲什麼必須由用戶來實現的原因。用戶將在他的程序中使用信號量,操作系統將讀取這些信號以瞭解有關這兩個進程的所有信息。

2

信號量是一個變量或抽象數據類型,用於控制多進程訪問併發系統(如多進程程序操作系統)中的公共資源。

思考信號量的一種有用方法是記錄特定資源的可用單元數量,以及安全操作(即,沒有race conditions),因爲單元需要或變得自由時調整該記錄,以及如有必要,請等到資源的某個單元可用。信號量是預防競爭條件的有用工具;

Courtesy

0

旗語是通過其用於處理同步的OS提供的數據類型。
信號量有兩個原子操作(原子意味着要麼完全執行,要麼根本不執行)wait和signal.during這兩個操作上下文切換不會發生,因爲它們是原子的。
程序員必須執行這些操作,以便OS在某些重要操作期間不會切換上下文。 舉例讀寫器問題。

注:操作系統非常複雜,操作系統的概念讓我們對操作系統的工作有了一個想法。但是目前的系統工作可能與每十年一樣,操作系統和硬件方面的計算機系統升級.OS實現各種概念以保持運行並提供更好的CPU利用率。

0

sempahore用於保護對兩個獨立運行的線程或進程之間共享的數據結構的訪問。您可能會遇到信號量描述中使用的短語「關鍵區域」;忽略它。你不用信號保護代碼,你保護共享的數據結構。

假設你有這些變量:

int savings; 
int house_payment; 

,你想從儲蓄桶還可以將一些資金投入到house_payment桶。在發生這種情況時,另一個流程需要知道您的銀行餘額和貸款餘額。

流程A採取付款,從儲蓄減去價值。 過程A然後將該值添加到house_payment存儲桶。

現在假設流程B需要檢查負載平衡和您的儲蓄餘額。由於流程並未同步,因此流程B會在流程A從您的儲蓄中清除資金時查看這些值,但是流程A可以將付款添加到您的house_payment之前。

就流程B而言,儲蓄桶的資金太少,而house_payment桶的資源不足。您的房屋付款資金在途中丟失。如果過程B再次看起來,神奇的是,失蹤的錢出現在house_payment桶中。

爲了防止該窗口,使用信號量。流程A在轉移資金的同時佔用信號量,並在資金被置入house_payment存儲桶後釋放信號量。

進程B在訪問存儲和house_payment存儲區之前獲取信號量,並在完成時釋放信號量。

通過信號量守護訪問共享數據,兩個進程都不會看到由於在傳輸過程中檢查桶而導致的不一致狀態。

現在,操作系統不知道何時應用信號量守衛。這是應用程序必須管理的內容。

0

是的,操作系統應該考慮訪問問題和信號量只是幫助它做到這一點。 嘗試以這種方式瞭解它: 有一個鐵路,有4列火車(說,火車A,B,C,D)等待訪問鐵路。現在,條件是,在給定的情況下,只有一列火車可以訪問它。所以,車站大師所做的是給列車的每個司機一個燈泡。如果火車的燈泡(比如A列)開着,那就意味着列車A有權使用鐵路。當A正在使用道路時,列車B,C,D將等待(在等待隊列中)並關閉其燈泡。 協議是,一旦列車A使用道路完成,它關閉它的燈泡,並在隊列中的下一列火車(比如說火車B),打開燈泡並使用道路。這一直持續到隊列中的所有列車都有機會。

燈泡是在這種情況下,信號量,所述火車的過程/工作 s,並且鐵路是臨界段(共享資源)。