UNIX作業系統中加鎖和解鎖

2021-07-13 21:22:06 字數 955 閱讀 8700

unix作業系統加鎖和解鎖的基本思想是,當某個程序進入臨界區,它將持有乙個某種型別的鎖(unix裡一般來說是semaphore,linux裡一般是訊號量和原子量或者spinlock)。當其他程序在該程序沒有釋放該鎖時試圖進入臨界區(加鎖),它將會被設定成睡眠狀態,然後被置入等待該鎖的程序佇列(某個優先順序的)。

當unix作業系統該鎖被釋放時,也就是解鎖事件發生時,核心將從等待該鎖的程序優先順序佇列中尋找乙個程序並將其置為就緒態,等待排程(schedule)。

在system v中,等待某一事件被稱為sleep(sleep on an event),因此下文將統一使用睡眠(sleep)。unix作業系統等待某事件也可以成為等待某個鎖。(注:本文中的sleep與sleep()系統呼叫不同)

unix作業系統的實現將一組事件對映到一組核心虛擬位址(鎖);而且事件不區別對待到底有多少程序在等待。這就意味著兩個不規則的事情:

一、當某個事件發生時,unix作業系統等待該事件的一組程序均被喚醒(而不是僅僅喚醒乙個程序),並且狀態均被設定成就緒(ready-to-run)。

這時候由核心選擇(schedule)乙個程序來執行,由於system v核心不是可搶占的(linux核心可搶占),因此其他的程序將一直在就緒狀態等待排程,或者再次進入睡眠(因為該鎖有可能被執行程序持有,而執行程序因為等待其他事件的發生而睡眠),或者等其他程序在使用者態被搶占。

二、多個事件對映到同乙個位址(鎖)。假設事件e1和e2都對映到同乙個位址(鎖)addr,有一組程序在等待e1,一組程序在等待e2,它們等待的事件不同,但是unix作業系統對應的鎖相同。

假如e2發生了,所有等待e2的程序都被喚醒進入就緒狀態,而由於e1沒有發生,鎖addr沒有被釋放,所有被喚醒的程序又回到睡眠狀態。

unix作業系統貌似乙個事件對應乙個位址會提高效率,但實際上由於system v是非搶占式核心,而且這種多對一對映非常少,再加上執行態程序很快就會釋放資源(在其他程序被排程之前),因此這種對映不會導致效能的顯著降低。

REDIS中加鎖和解鎖問題

在電商活動中,經常會有 秒殺 的搶購活動,這種場景,伺服器通常面臨高併發的請求處理。也就是說,在同一時間,會有大量併發的使用者同時去購買某個商品,這時候,就需要保證不會出現過度 的情況 使用者最終購買的商品數量超過實際的商品數量 這裡就需要應用到redis中加鎖和解鎖的特性來保證每次的購物操作只有乙...

作業系統 死鎖的產生 條件 和解鎖

deadlocks 死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的程序稱為死鎖程序.由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下...

登入 Unix 作業系統

上一節我們了解 unix 作業系統發展歷史,這一節我們來了解 unix 的啟動,如何優雅的登入和退出 unix。系統啟動 系統是指系統從關機狀態開始直到系統變為使用者可用狀態。首先引導程式查詢有哪些裝置 硬碟,光碟,優盤等 是可以引導的,然後選擇可以引導的裝置。接著引導程式將控制權轉移給核心,核心呼...