1. 程式人生 > >訊號量是什麼?可以這樣簡單的理解

訊號量是什麼?可以這樣簡單的理解

老羊快跑微信公眾號  內有老羊的《200分鐘PCB設計傻瓜教程》,免費觀看

大家都知道,計算機有了作業系統後效能大幅度提升,其根本原因就在於實現了程序的併發執行。多個併發的程序彼此之間圍繞著緊俏的資源產生了兩種關係,同步或互斥。而訊號量正式解決資源競爭的最有效途徑。

比如記錄資源的數量,等待資源的程序數,等待資源的程序阻塞佇列在哪,當然最重要的是訊號量還代表這個資源是互斥的。比如訊號量S=3代表資源目前還有3個,沒有程序阻塞;S=-2代表資源已經都被佔用,且阻塞佇列中等待資源的程序有2個。

訊號量是作業系統提供給使用者使用的一種機制,幫助使用者程序協調使用資源,使用者程式設計的時候可以直接呼叫,不必自己設計。

計算機對訊號量只能執行 waitsignal這兩種原子操作,即申請和釋放訊號量時無法被打斷。下面看一個例題:

例:若有一售票廳只能容納300人,當少於300人時,可以進入;否則,需在外等候。若將每一個購票者作為一個程序,請用Pwait)、Vsignal)操作程式設計,並寫出訊號量的初值。(強調:只有一個購票視窗,每次只能為一位購票者服務)

分析:題中有兩類資源,售票廳和售票視窗,售票廳可以容納300人,視窗只能服務1個人。使用者到達後要想買到票,首先要進入售票廳,然後申請到窗口才行。因此使用者需要獲得兩類資源才能成功購票。好了,我們定義兩個訊號量一個是S1,代表售票廳還能容納的人數,一個是S2,代表視窗,它們的初始值一個是

300,一個是1。程式如下:

解:semophore S1=330S2=1

使用者程序Pi {

                    WaitS1

進入大廳

                    WaitS2

視窗購票

                   退出購票視窗

                    SignalS2

退出大廳

                    SignalS1

}

       注意,申請的時候能不能把S1,S2的順序調換呢?答案是不能的,因為如果某程序申請到了視窗(被叫號了),卻無法進入大廳,那麼其他人就無法購票,也就無法退出大廳,他也就一直進不去了。另外在釋放過程中,能不能把siganl(S2)放在程式的最後呢,答案是可以的,但是多程序併發時,資源釋放的太晚是不是會影響計算機的效率呢。

老羊快跑:一個關注作業系統教學、嵌入式開發、科技資訊的公眾號