當前位置:首頁 » 文件傳輸 » 互斥訪問
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

互斥訪問

發布時間: 2022-03-03 19:56:43

① 互斥訪問的硬體有哪些

有很多啊,例如列印機、掃描儀、讀者與寫者共享的數據區等等。

② 進程的互斥與進程互斥的訪問臨界區的區別

請參閱:
1、不論是硬體臨界資源,還是軟體臨界資源,多個進程必須互斥地對它進行訪問。每個進程中訪問臨界資源的那段代碼稱為臨界區(Critical Section)。
每個進程中訪問臨界資源的那段程序稱為臨界區(Critical Section)(臨界資源是一次僅允許一個進程使用的共享資源)。每次只准許一個進程進入臨界區,進入後不允許其他進程進入。不論是硬體臨界資源,還是軟體臨界資源,多個進程必須互斥地對它進行訪問。
多個進程中涉及到同一個臨界資源的臨界區稱為相關臨界區。
進程進入臨界區的調度原則是: ①如果有若干進程要求進入空閑的臨界區,一次僅允許一個進程進入。②任何時候,處於臨界區內的進程不可多於一個。如已有進程進入自己的臨界區,則其它所有試圖進入臨界區的進程必須等待。③進入臨界區的進程要在有限時間內退出,以便其它進程能及時進入自己的臨界區。④如果進程不能進入自己的臨界區,則應讓出CPU,避免進程出現「忙等」現象。
如果有多個線程試圖同時訪問臨界區,那麼在有一個線程進入後其他所有試圖訪問此臨界區的線程將被掛起,並一直持續到進入臨界區的線程離開。臨界區在被釋放後,其他線程可以繼續搶占,並以此達到用原子方式操作共享資源的目的。
臨界區在使用時以CRITICAL_SECTION結構對象保護共享資源,並分別用EnterCriticalSection()和LeaveCriticalSection()函數去標識和釋放一個臨界區。所用到的CRITICAL_SECTION結構對象必須經過InitializeCriticalSection()的初始化後才能使用,而且必須確保所有線程中的任何試圖訪問此共享資源的代碼都處在此臨界區的保護之下。否則臨界區將不會起到應有的作用,共享資源依然有被破壞的可能。

③ 為什麼多個進程臨界資源的訪問必須互斥

互斥就是以某種手段保證只有一個進程訪問共享資源。就是說要保證兩個或以上進程不會同時處於臨界區。
互斥方案四要求:
1.不應該對CPU數目,速度作任何假設;
2.臨界區外的進程不得阻塞其他進程進入臨界區;
3.只能一個進程進入臨界區;
4.申請進入臨界區的進程不能無限等待。

http://ke..com/view/281245.htm 這里可以參考下

④ 什麼叫C++的互斥訪問越詳細越好!謝謝!

對象的互斥訪問,C#有lock關鍵字,Java有synchronized關鍵字,Windows下的C++就只有通過CriticalSection API自己編程實現了。下面是小雞射手的Mutex類:
class Mutex {
public:
Mutex() {InitializeCriticalSection(&m_cs);}
virtual ~Mutex() {DeleteCriticalSection(&m_cs);}
void Lock() {EnterCriticalSection(&m_cs);}
void UnLock() {LeaveCriticalSection(&m_cs);}
private:
CRITICAL_SECTION m_cs;
};

Mutex的Lock和UnLock一般都是成對使用,為了避免死鎖,臨界區操作完後必須立即Unlock。為了確保Unlock的執行,可以在try...catch...finally的finally中Unlock,還有一種方法就是定義MutexGuard類:
class MutexGurad {
public:
explicit MutexGuard(Mutex& mutex) : m_mutex(mutex) {mutex.Lock();}
virtual ~MutexGurad() {mutex.UnLock(); }
private:
Mutex& m_mutex;
};
MutexGuard的使用也非常簡單,假設對象內定義了成員變數Mutex m_mutex,在臨界區代碼中如下使用:
{
MutexGurad guard(m_mutex);
// 臨界區處理代碼
}
局部變數guard似乎根本沒有用,實際上是利用了它的生命期:創建guard時Lock,釋放guard時UnLock。注意{},它界定了Unlock的時機。和try...finally效果一樣,即使處理代碼發生了exception,Unlock也確保能執行。
小雞射手挺喜歡用MutexGuard方法,因為實在是方便呀;使用者甚至不必了解Mutex是Lock/UnLock,還是Enter/Leave。

⑤ Linux系統中對臨界資源進行互斥訪問的手段是

自旋鎖(Spin Lock)是一種典型的對臨界資源進行互斥訪問的手段,其名稱來源於它的工作方式。為了獲得一個自旋鎖,在某CPU上運行的代碼需先執行一個原子操作,該操作測試並設置(Test-AndSet)某個內存變數。由於它是原子操作,所以在該操作完成之前其他執行單元不可能訪問這個內存變數。如果測試結果表明鎖已經空閑,則程序獲得這個自旋鎖並繼續執行;如果測試結果表明鎖仍被佔用,程序將在一個小的循環內重復這個「測試並設置」操作,即進行所謂的「自旋」,通俗地說就是「在原地打轉」。當自旋鎖的持有者通過重置該變數釋放這個自旋鎖後,某個等待的「測試並設置」操作向其調用者報告鎖已釋放。理解自旋鎖最簡單的方法是把它作為一個變數看待,該變數把一個臨界區標記為「我當前在運行,請稍等一會」或者標記為「我當前不在運行,可以被使用。如果A執行單元首先進入常式,它將持有自旋鎖;當B執行單元試圖進入同一個常式時,將獲知自旋鎖已被持有,需等到A執行單元釋放後才能進入。在ARM體系結構下,自旋鎖的實現借用了ldrex指令、strex指令、ARM處理器內存屏障指令dmb和dsb、wfe指令和sev指令,這類似於代碼清單7.1的邏輯。可以說既要保證排他性,也要處理好內存屏障。

自旋鎖主要針對SMP或單CPU但內核可搶占的情況,對於單CPU和內核不支持搶占的系統,自旋鎖退化為空操作。在單CPU和內核可搶占的系統中,自旋鎖持有期間中內核的搶占將被禁止。由於內核可搶占的單CPU系統的行為實際上很類似於SMP系統,因此,在這樣的單CPU系統中使用自旋鎖仍十分必要。另外,在多核SMP的情況下,任何一個核拿到了自旋鎖,該核上的搶占調度也暫時禁止了,但是沒有禁止另外一個核的搶占調度。盡管用了自旋鎖可以保證臨界區不受別的CPU和本CPU內的搶占進程打擾,但是得到鎖的代碼路徑在執行臨界區的時候,還可能受到中斷和底半部的影響。為了防止這種影響,就需要用到自旋鎖的衍生。

⑥ 同步和互斥有什麼聯系和區別

區別:

互斥:是指三部在不同進程之間的若干程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段後才可以運行。

同步:是指散步在不同進程之間的若干程序片斷,它們的運行必須嚴格按照規定的 某種先後次序來運行,這種先後次序依賴於要完成的特定的任務。

聯系:

同步是一種更為復雜的互斥,而互斥是一種特殊的同步。也就是說互斥是兩個線程之間不可以同時運行,他們會相互排斥,必須等待一個線程運行完畢,另一個才能運行,而同步也是不能同時運行,但他是必須要安照某種次序來運行相應的線程(也是一種互斥)。

⑦ 如何讓不同進程互斥訪問共享文件

為該文件加一個mutex,訪問文件前用pthread_mutex_lock()上鎖,訪問後用pthread_mutex_unlock()解鎖……就這樣。此外,自己注意同一個進程不要兩次訪問該文件,以免造成死鎖。

⑧ 為了防止兩個進程同時訪問共享內存空間,如何進行互斥訪問

C語言中常用的互斥訪問方法:
1.關中斷
2.通過測試標志來訪問互斥資源
3.使用信號量

⑨ 多個程序同時訪問一個文件的互斥怎麼做

這個必須要在操作系統的編程過程中,對信號量(sem)實行P、V操作來進行控制。