當前位置:首頁 » 存儲配置 » 共享存儲區通信

共享存儲區通信

發布時間: 2022-12-06 05:01:08

Ⅰ 操作系統——進程通信、線程

進程通信是指進程之間的信息交換。進程的互斥和同步是一種低級的進程通信機制,效率低、所能夠傳遞的信息非常有限。

通過共享數據結構或者共享存儲區進行進程之間的通信。

(a)通過共享數據結構。

    比如生產者-消費者問題中的有界的緩沖區。由於數據結構的設置以及同步的處理都是人工的,強度大,是一種比較低級的通信機制。

(b)通過共享存儲區。

    在處理器中劃分一塊共享的存儲區域,所有共享該區域的進程通過對共享區域的數據進行讀寫來進行通信,是一種能夠傳輸較大數量的通行方式。

各需要通信的進程通過格式化的消息進行信息交換。這是最重要的一種進程通信方式。

(a)直接通信方式。

利用操作系統的原語進行通信,發送方直接指定消息的接收方;消息接收方也指定消息的來源。

(b)間接通信方式。

需要藉助作為共享數據結構的實體進行通信。該實體一般被稱為信箱。

消息傳遞系統中的主要問題:通信鏈路、消息格式、進程同步方式。通信鏈路的建立可以利用系統的「建立鏈接」原語建立通信鏈路並顯式拆除,也可以利用系統的「發送原語」由系統自動建立通信鏈路。對於單機系統消息格式則是簡單固定,而對於復雜系統的進程通信(比如網路)則可能要將消息分為消息頭和消息正文等。進程同步方式主要有3種:發送進程和接受進程都阻塞(兩者之間無緩沖區)、發送進程不阻塞接受進程   阻塞(列印進程一直阻塞直到有列印請求)、發送進程和接受進程都不阻塞(兩者之間帶有緩沖區)。

    管道通信主要藉助於管道文件。管道文件是用來連接一個輸入進程和輸出進程並實現他們輸入的一個共享文件。利用管道進行通信時需要注意管道文件的互斥、對管道文件操作的同步以及輸入和輸出進程必須同時存在。

    發送進程利用OS所提供的發送命令(原語),直接把消息發送給目標進程。此時,發送進程和接收進程都以顯式方式提供對方的標識符。通常利用系統通信命令(原語):
 Send(Receiver, message);
 Receive(Sender, message);

    基於共享數據結構的實體用來暫存發送給目標進程的消息;接收進程則從該實體中,取出對方發送給自己的消息。通常把這種實體稱為信箱。
    消息在信箱中可以安全地保存,只允許核準的目標用戶隨時讀取。既可實時通信,又可非實時通信。

①通信鏈路的建立
②消息格式
③同步方式

美國Hansan提出,在RC4 4000系統上實現。
1.不需要管理鏈路
2.定義簡單數據結構(消息格式)
3.實現發送和接收的操作原語

    多道程序管理:追求效率的目的下實現「並發」
    並發性與效率的討論(利用進程實現的多道程序中):
    進程是一個可擁有資源的獨立單位;是一個可獨立調度和分配資源的基本單位

    多線程OS中,一個進程包括多個線程,每個線程都是利用CPU的基本單位。
    輕型實體:只需一點必不可少的、能保證獨立運行的資源。(TCB)
    獨立調度和分派的基本單位:調度切換迅速且開銷小。
    可並發執行
    共享進程資源:同進程中的線程可共享相同的進程地址空間、已打開文件、信號量機構等。

    tcb管理的信息:標識符、運行狀態、優先順序、寄存器狀態、堆棧、專有存儲器、信號屏蔽等

1.互斥鎖
    適用於高頻度使用的關鍵共享數據和程序段(unlock和lock兩個鎖操作原語)

2.條件變數
    與互斥鎖一起使用,鎖能保證互斥進入臨界區,利用條件變數使線程阻塞
    注意不滿足條件時,wait條件變數:
    釋放互斥鎖,進程阻塞在條件變數指向隊列中,被喚醒後要重新再設互斥鎖

3.信號量
    私用信號量:用於同進程的線程同步
    公用信號量:用於不同進程間

Ⅱ 進程與線程

經典定義:
1.進程是可以並發執行的計算部分



進程的五個特性
1.動態性:創建時產生,由調度而執行,得不到資源而暫停執行,有撤銷而消亡
2.並發性:多個進程實體同存於主存中
(引入進程的目的,程序是不能並發執行的)
3.獨立性:進程實體是一個能獨立運行的基本單位,也是系統中獲得資源和獨立調度的基本單位
4.非同步性:進程按各自獨立的,不可預知的速度向前推進(導致程序執行的不可再現性)
5.結構特徵:進程實體是由程序段、數據段、進程式控制制塊三部分構成,又稱進程映像/進程上下文(context)


進程的基本狀態

有些還存在兩個額外狀態:新狀態和終止狀態

進程式控制制塊PCB
1.概念:是操作系統用於記錄和刻畫進程狀態及有關信息的 數據結構 ,也是操作系統控制和管理進程的主要依據。

原語:一組系統命令
要麼全部執行,要麼不執行,不存在中間狀態

$$進程創建
egin{cases}
& ext{系統生成時,會創建一些系統進程(用來分配系統資源和管理工作)}
& ext{用戶作業,由操作系統的作業調度程序為之創建相應的進程}
end{cases}$$

1.既可撤銷具有指定標識符的過程,又可撤銷一個優先順序中的所有進程
2.一個進程被撤銷時,必須從系統隊列中移出,釋放並歸還所有系統資源,同時也有審查是否有子孫進程,如果有子孫進程也有一起予以撤銷

1.當一個進程出現等待事件時,該進程調用阻塞原語將自己阻塞

1.必要性:解決多個進程爭奪少數CPU資源的問題
2.功能:
(1)記錄系統中所有進程的執行情況
(2)選擇佔有CPU的進程
(3)CPU分配給進程,即進行進程上下文切換
(4)回收CPU
3.進程調度演算法
先來先服務/FCFS
按照進程進入就緒隊列的先後次序選擇佔用處理器的進程

優先數調度演算法
為每個進程確定一個優先數,進程調度總是讓具有最高優先數的進程先使用處理器(若優先數相同則採用FCFS)

時間片輪轉調度演算法
CPU處理時間分成固定大小的時間片,輪流來,如果時間片用完進程還未結束,也得重新排到就緒隊列的末尾等待再次調度

時間片q的選擇:
q=R/N(R是系統對響應時間的要求;N是進程數)

多級反饋隊列調度演算法/MLFQ
設置多個就緒隊列
各個隊列的優先權不同(第一個隊列的優先權最高,逐個降低)
各個隊列的時間片大小不同(優先權越高的隊列時間片越小)
當前隊列的某個進程在時間片內沒有完成就進入下一個隊列的末尾
當某個隊列為空時才會調度下一個隊列
處理機在第i隊為謀進程服務時,如果有新進程進入優先權較高的隊列(i之前),則處理機就去處理i之前的那個新進程了,正在運行的進程被放到i隊伍的末尾(可憐哈哈哈哈)

4.調度演算法的選擇
(1)處理器利用率(盡量讓CPU處於忙碌狀態)
(2)吞吐量
(3)等待時間(盡可能減少)
(4)響應時間(盡可能減少)

1.進程互斥:若干個進程要使用一個共享資源,任何時刻只允許一個進程去使用,其他要使用的進程必須等待,直到那個進程使用完後釋放資源
2.進程互斥的管理辦法: PV操作 管程

1.進程同步:並發進程之間存在一種制約關系,一個進程的執行依賴另一個進程的消息,當一個進程沒有得到另一個進程的消息時應等待,直到消息到達時才被喚醒

3.時間上的同步問題

$$進程通信
egin{cases}
低級& ext{PV操作}
高級 egin{cases} 共享存儲器系統 消息傳遞系統 管道通信系統 end{cases}
end{cases}$$

1.基於共享數據結構的通信方式
在這種通信方式中,要求諸進程公用某些數據結構,進程通過它們交換信息。這種通信方式是低效的,只適於傳遞少量數據。
2.基於共享存儲區的通信方式
為了傳輸大量數據,在存儲器中劃出了一塊共享存儲區,諸進程可通過對共享存儲區中的數據進行讀或寫來實現通信。這種通信方式屬於高級通信。

消息傳遞系統中,進程間的數據交換以消息為單位

1.管道,是指用於連接一個讀進程和一個寫進程,以實現它們之間通信的共享文件,又稱為pipe文件
2.為了協調雙方的通信,管道通信機制必須提供以下三方面的協調能力:(1)互斥;(2)同步;(3)對方是否存在。

1.需要線程的目的:保持系統的並發性
2.為了減少額外開銷,系統把進程的資源申請與調度執行分開,線程是調度的基本單位,進程是資源申請與擁有的基本單位
3.概念:線程(Thread)是進程中的一個實體,是可獨立參與調度的基本單位
4.屬性:
並發
一個線程可以創建另一個
動態性(生命周期)
TCB(進程是PCB)
同一進程內的線程共享同一地址空間
一個進程的線程對另外一個進程是不可見的
線程的通信是基於全局變數進行的
5.狀態(與進程類似)

時間片輪轉演算法
優先權演算法

1.進程作為資源的申請與擁有單位,線程作為調度的基本單位
2.線程在調度和切換上所花費的開銷比進程小得多
3.進程是獨立擁有資源的的一個基本單位,線程只擁有一點點運行中必要的資源
4.進程作為獨立擁有資源的基本單位,線程是獨立參與調度的基本單位

1.概念:死鎖是多個進程因競爭資源而造成的一種僵局,若無外力作用,這些進程都將永遠不能再向前推進
2$$產生原因egin{cases} 競爭資源 進程推進順序非法(請求與釋放資源順序不當) end{cases}$$

3.$$產生死鎖必要條件 egin{cases} 互斥條件(進程互斥使用資源) 佔有且等待條件(得不到需要的資源就不釋放佔有的資源) 不剝奪條件(進程不能從另一進程搶奪資源) 循環等待條件(每個進程都在等待另一個進程所持有的資源) end{cases}$$


4.對策:預防 避免 檢測 解除
預防
(1)靜態分配策略//破壞第二個必要條件
所謂靜態分配是指一個進程必須在執行前就申請它所要的全部資源,並且直到它所要的資源都得到滿足後才開始執行
(2)層次分配策略//破壞第四個必要條件
當一個進程獲得了某一層的一個資源後,它想再申請該層中的另一個資源,必須先釋放該層中的已佔用資源。

避免

檢測
操作系統中的每一時刻的系統狀態都可以用進程—資源分配圖來表示,進程—資源分配圖是描述進程和資源間申請及分配關系的一種有向圖,可用以檢測系統是否處於死鎖狀態。

Ⅲ 操作系統用共享存儲區通信怎樣生成一個512位元組的文本文件

1。多道程序系統
2。A
3。個進程中訪問一次僅允許一個進程使用的共享資源的那段代碼
4。基於共享存儲區的通訊方式
5。內存管理方法
6。I/O設備
7。BIOS

二:
1。空閑讓進;忙則等待;讓權等待;有限等待
2。互斥使用(資源獨占)、不可強占(不可剝奪) 、請求和保持(部分分配,佔有申請) 、循環等待
3。。。。
不想寫了,自己看看書吧還是。

Ⅳ 消息通信,共享存儲區,管道通信各有什麼特點

隊列通信中的消息有明顯的生命周期,消息有傳遞的過程,有通知的過程,消息有失效性,有先後關系。
而共享內存沒有上面這些特點。共享內存在使用時要解決互斥的問題。

Ⅳ Android跨進程通信-共享內存

還是先看共享內存的使用方法,我主要介紹兩個函數:

通過 shmget() 函數申請共享內存,它的入參如下

通過 shmat() 函數將我們申請到的共享內存映射到自己的用戶空間,映射成功會返回地址,有了這個地址,我們就可以隨意的讀寫數據了,我們繼續看一下這個函數的入參

共享內存的原理是在內存中單獨開辟的一段內存空間,這段內存空間其實就是一個tempfs(臨時虛擬文件),tempfs是VFS的一種文件系統,掛載在/dev/shm上,前面提到的管道pipefs也是VFS的一種文件系統。

由於共享的內存空間對使用和接收進程來講,完全無感知,就像是在自己的內存上讀寫數據一樣,所以也是 效率最高 的一種IPC方式。

上面提到的IPC的方式都是 在內核空間中開辟內存來存儲數據 ,寫數據時,需要將數據從用戶空間拷貝到內核空間,讀數據時,需要從內核空間拷貝到自己的用戶空間,
共享內存就只需要一次拷貝 ,而且共享內存不是在內核開辟空間,所以可以 傳輸的數據量大

但是 共享內存最大的缺點就是沒有並發的控制,我們一般通過信號量配合共享內存使用,進行同步和並發的控制

共享內存在Android系統中主要的使用場景是 用來傳輸大數據 ,並且 Android並沒有直接使用Linux原生的共享內存方式,而是設計了Ashmem匿名共享內存

之前說到有名管道和匿名管道的區別在於有名管道可以在vfs目錄樹中查看到這個管道的文件,但是匿名管道不行, 所以匿名共享內存同樣也是無法在vfs目錄中查看到 的, Android之所以要設計匿名共享內存 ,我覺得主要是為了安全性的考慮吧。

我們來看看共享內存的一個使用場景,在Android中,如果我們想要將當前的界面顯示出來,需要將當前界面的圖元數據傳遞Surfaceflinger去做圖層混合,圖層混合之後的數據會直接送入幀緩存,送入幀緩存後,顯卡就會直接取出幀緩存里的圖元數據顯示了。

那麼我們如何將應用的Activity的圖元數據傳遞給SurfaceFlinger呢?想要將圖像數據這樣比較大的數據跨進程傳輸,靠binder是不行的,所以這兒便用到匿名共享內存。

從谷歌官方提供的架構圖可以看到,圖元數據是通過BufferQueue傳遞到SurfaceFlinger去的,當我們想要繪制圖像的時候, 需要從BufferQueue中申請一個Buffer,Buffer會調用Gralloc模塊來分配共享內存 當作圖元緩沖區存放我們的圖元數據。

可以看到Android的匿名共享內存是通過 ashmem_create_region() 函數來申請共享內存的,它會在/dev/ashmem下創建一個虛擬文件,Linux原生共享內存是通過shmget()函數,並會在/dev/shm下創建虛擬文件。

匿名共享內存是通過 mmap() 函數將申請到的內存映射到自己的進程空間,而Linux是通過*shmat()函數。

雖然函數不一樣,但是Android的匿名共享內存和Linux的共享內存在本質上是大同小異的。

要使用一塊共享內存

Ⅵ 共享存儲區通信有哪些優點使用上有哪些限制

共享存儲區通信的優點有:常用的集中式多處理機使用的通信機制兼容。

限制有:是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

共享存儲是指兩個或多個處理機共用一個主存儲器的並行體系結構。每一個處理機都可以把信息存入主存儲器,或從中取出信息。處理機之間的通信通過訪問共享存儲器來實現。

系統結構

1、無高速緩沖存儲器的集中式

這種結構的處理機沒有高速緩沖存儲器,多個處理機通過交叉開關或多級互聯網路等直接訪問共享存儲器。由於任一存儲單元在系統中只有一個備份,這類系統不存在高速緩沖存儲器一致性問題,系統的可伸縮性受限於交叉開關或多級互聯網路的帶寬。

2、基於高速緩沖存儲器的集中式

在這種結構的系統中,每個處理機都有高速緩沖存儲器,多個處理機一般通過匯流排與存儲器相連。每個處理機的高速緩沖存儲器通過偵聽匯流排來維持數據一致性。

3、具有高速緩沖存儲器一致性的分布式

這種結構稱為高速緩沖存儲器一致的非均勻存儲訪問結構。這類系統的共享存儲器分布於符結點之間。結點之間通過可伸縮性好的互聯網路相連,每個處理機都能緩存共享單元,高速緩沖存儲器一致性的維護是這類系統的關鍵,決定著系統的可伸縮性。

4、唯高速緩沖存儲器的分布式

在這種結構中,每個結點的存儲器相當於一個大容量的高速緩沖存儲器,數據一致性也在這一級維護。這種系統的共享存儲器的地址是活動的。存儲單元與物理地址分離,數據可以根據訪存模式動態地在各結點的存儲器間移動和復制。

5、無高速緩沖存儲器一致性的分布式

這種結構稱為無高速緩沖存儲器一致性的非均勻存儲訪問結構。它的特點是雖然每個處理機都有高速緩沖存儲器,但硬體不負責維護高速緩沖存儲器一致性,而由編譯器或程序員來維護。

Ⅶ 進程間和線程間的協作區別在哪為什麼需要內核實現通信與同步

進程間和線程間的協作區別:
進程互斥、同步的概念

進程互斥、同步的概念是並發進程下存在的概念,有了並發進程,就產生了資源的競爭與協作,從而就要通過進程的互斥、同步、通信來解決資源的競爭與協作問題。
下面是根據《操作系統教程》3.1.4 中的介紹,整理的進程互斥、同步的概念。
在多道程序設計系統中,同一時刻可能有許多進程,這些進程之間存在兩種基本關系:競爭關系和協作關系。
進程的互斥、同步、通信都是基於這兩種基本關系而存在的,為了解決進程間競爭關系(間接制約關系)而引入進程互斥;為了解決進程間鬆散的協作關系( 直接制約關系)而引入進程同步;為了解決進程間緊密的協作關系而引入進程通信。
第一種是競爭關系
系統中的多個進程之間彼此無關,它們並不知道其他進程的存在,並且也不受其他進程執行的影響。例如,批處理系統中建立的多個用戶進程, 分時系統中建立的多個終端進程。由於這些進程共用了一套計算機系統資源,因而, 必然要出現多個進程競爭資源的問題。當多個進程競爭共享硬設備、存儲器、處理器 和文件等資源時,操作系統必須協調好進程對資源的爭用。
資源競爭出現了兩個控制問題:一個是死鎖 (deadlock )問題,一組進程如果都獲得了部分資源,還想要得到其他進程所佔有的資源,最終所有的進程將陷入死鎖。另一個是飢餓(starvation )問題,這是指這樣一種情況:一個進程由於其他進程總是優先於它而被無限期拖延。
操作系統需要保證諸進程能互斥地訪問臨界資源,既要解決飢餓問題,又要解決死鎖問題。
進程的互斥(mutual exclusion )是解決進程間競爭關系( 間接制約關系) 的手段。 進程互斥指若干個進程要使用同一共享資源時,任何時刻最多允許一個進程去使用,其他要使用該資源的進程必須等待,直到佔有資源的進程釋放該資源。
第二種是協作關系
某些進程為完成同一任務需要分工協作,由於合作的每一個進程都是獨立地以不可預知的速度推進,這就需要相互協作的進程在某些協調點上協 調各自的工作。當合作進程中的一個到達協調點後,在尚未得到其夥伴進程發來的消息或信號之前應阻塞自己,直到其他合作進程發來協調信號或消息後方被喚醒並繼續執行。這種協作進程之間相互等待對方消息或信號的協調關系稱為進程同步。
進程間的協作可以是雙方不知道對方名字的間接協作,例如,通過共享訪問一個緩沖區進行鬆散式協作;也可以是雙方知道對方名字,直接通過通信機制進行緊密協作。允許進程協同工作有利於共享信息、有利於加快計算速度、有利於實現模塊化程序設計。
進程的同步(Synchronization)是解決進程間協作關系( 直接制約關系) 的手段。進程同步指兩個以上進程基於某個條件來協調它們的活動。一個進程的執行依賴於另一
個協作進程的消息或信號,當一個進程沒有得到來自於另一個進程的消息或信號時則需等待,直到消息或信號到達才被喚醒。
不難看出,進程互斥關系是一種特殊的進程同步關系,即逐次使用互斥共享資源,也是對進程使用資源次序上的一種協調。
進程通信的概念
下面是根據《操作系統教程》3.5 中的介紹,整理的進程通信的概念。
並發進程之間的交互必須滿足兩個基本要求:同步和通信。
進程競爭資源時要實施互斥,互斥是一種特殊的同步,實質上需要解決好進程同步問題,進程同步是一種進程通信,通過修改信號量,進程之間可建立起聯系,相互協調運行和協同工作。但是信號量與PV操作只能傳遞信號,沒有傳遞數據的能力。有些情況下進程之間交換的信息量雖很少,例如,僅僅交換某個狀態信息,但很多情況下進程之間需要交換大批數據,例如,傳送一批信息或整個文件,這可以通過一種新的通信機制來完成,進程之間互相交換信息的工作稱之為進程通信IPC (InterProcess Communication)(主要是指大量數據的交換)。進程間通信的方式很多,包括:
信號(signal )通信機制;
信號量及其原語操作(PV、讀寫鎖、管程)控制的共享存儲區(shared memory )通信機制;
管道(pipeline)提供的共享文件(shared file)通信機制;
信箱和發信/ 收信原語的消息傳遞(message passing )通信機制。
其中前兩種通信方式由於交換的信息量少且效率低下,故稱為低級通信機制,相應地可把發信號/ 收信號及PV之類操作稱為低級通信原語,僅適用於集中式操作系統。消息傳遞機制屬於高級通信機制,共享文件通信機制是消息傳遞機制的變種,這兩種通信機制,既適用於集中式操作系統,又適用於分布式操作系統。
進程同步的方法
前面提到,進程互斥關系是一種特殊的進程同步關系,下面給出常見的進程同步的方法,實際上也可用於進程的互斥(個人理解)。
在何炎祥的《計算機操作系統》 3.2 節,將進程同步的機制與解決進程互斥方法看做是一樣的,的明確指出互斥的軟體解決方法為Dekker演算法與Peterson演算法,互斥的硬體解決方法為中斷方法、以及使用機器指令的方法,後面又給出了信號量、管程、消息傳遞三種方法。
實際應用中,不同的系統有不同的進程同步方法,CSDN帖子http://bbs.csdn.net/topics/80156687中有一些討論,Linux 與Windows的主要同步、通信機制如下:
Linux 下:
Linux 下常見的進程同步方法有:SysVIPC 的 sem(信號量)、file locking / record locking(通過 fcntl 設定的文件鎖、記錄鎖)、futex(基於共享內存的快速用戶態互斥鎖)。針對線程(pthread)的還有 pthread_mutex 和 pthread_cond(條件變數)。

Linux 下常見的進程通信的方法有 :pipe(管道),FIFO(命名管道),socket(套接字),SysVIPC 的 shm(共享內存)、msg queue(消息隊列),mmap(文件映射)。以前還有 STREAM,不過現在比較少見了(好像)。
Windows下:
在Windwos中,進程同步主要有以下幾種:互斥量、信號量、事件、可等計時器等幾種技術。
在Windows下,進程通信主要有以下幾種:內存映射、管道、消息等,但是內存映射是最基礎的,因為,其他的進程通信手段在內部都是考內存映射來完成的。
線程的同步/通信與進程的同步/通信有區別嗎?
對於該問題,教材上沒有明確的回答,教材上給出的一般是進程而非線程的同步、通信方式。但網路上很多說法將兩者混為一談。根據教材,以及網上的說法,個人的理解為:
同步機制:
信號量、管程、互斥是進程的同步機制,而信號量、互斥也可用於線程的同步,但管程只在進程同步中被用到;
線程的同步除了信號量、互斥外,還有臨界區、事件,沒有看到教材上將這兩種方式作為進程的同步方式;
通信機制:
管道、FIFO、消息隊列、信號量、共享內存是進程的同步機制,教材上沒有線程的通信機制這樣的說法,但可以肯定這幾種方法是進程的通信方式,且其中的信號量既可用於進程的同步,又可用於進程的通信,在網路上還有說可以用於線程同步的。
管道與管程是不同的,管程是進程同步的方式,而管道則是進程通信的方式。
進程的同步/通信
下面是常見的線程之間的同步方式的詳細介紹。
(註:下面轉自網路,下面的同步、通信方式對於進程與線程分的不是很清楚,關於進程還是線程的解釋見上面——線程的同步/通信與進程的同步/通信有區別嗎?)
一、進程/線程間同步機制。
臨界區、互斥區、事件、信號量四種方式
臨界區(Critical Section)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區別
1、臨界區:通過對多線程的串列化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。
在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那麼在有一個線程進入後,其他試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放後,其他線程才可以搶占。
2、互斥量:採用互斥對象機制。
只有擁有互斥對象的線程才有訪問公共資源的許可權,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享 .互斥量比臨界區復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。
3、信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目 .
信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中的PV操作相同。它指出了同時訪問共享資源的線程最大數目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。
PV操作及信號量的概念都是由荷蘭科學家E.W.Dijkstra提出的。信號量S是一個整數,S大於等於零時代表可供並發進程使用的資源實體數,但S小於零時則表示正在等待使用共享資源的進程數。
P操作申請資源:
(1)S減1;
(2)若S減1後仍大於等於零,則進程繼續執行;
(3)若S減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉入進程調度。

V操作 釋放資源:
(1)S加1;
(2)若相加結果大於零,則進程繼續執行;
(3)若相加結果小於等於零,則從該信號的等待隊列中喚醒一個等待進程,然後再返回原進程繼續執行或轉入進程調度。
4、事 件: 通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先順序比較的操作 .
總結:
1. 互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創建互斥量需要的資源更多,所以如果只為了在進程內部是用的話使用臨界區會帶來速度上的優勢並能夠減少資源佔用量。因為互斥量是跨進程的互斥量一旦被創建,就可以通過名字打開它。
2. 互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進程使用來進行同步數據操作,而其他的對象與數據同步操作無關,但對於進程和線程來講,如果進程和線程在運行狀態則為無信號狀態,在退出後為有信號狀態。所以可以使用WaitForSingleObject來等待進程和線程退出。
3. 通過互斥量可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現在一位用戶購買了一份三個並發訪問許可的資料庫系統,可以根據用戶購買的訪問許可數量來決定有多少個線程/進程能同時進行資料庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計數器。
二、進程間通信方式
由於比較容易混淆,我們把進程間通信方法也列在這里做比較。
進程通信也就是所謂的IPC問題,主要是指進程間交換數據的方式。進程通信包括高級通信與低級通信,其中進程同步與互斥屬於低級通信,主要用於插U農地控制信號;高級通信包括三種:共享存儲系統(有的地方稱作共享內存區)、消息傳遞系統(有的地方稱作消息隊列)、管道。
信號量是進程同步與互斥的常用方法,也可以作為低級的進程通信方法,用於傳遞控制信號。
簡而言之,進程間通信方式主要包括管道、FIFO、消息隊列、信號量、共享內存。
1.管道,還有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用於父子進程通訊,命名管道可用於非父子進程,命名管道就是FIFO,管道是先進先出的通訊方式
2.消息隊列,是用於兩個進程之間的通訊,首先在一個進程中創建一個消息隊列,然後再往消息隊列中寫數據,而另一個進程則從那個消息隊列中取數據。需要注意的是,消息隊列是用創建文件的方式建立的,如果一個進程向某個消息隊列中寫入了數據之後,另一個進程並沒有取出數據,即使向消息隊列中寫數據的進程已經結束,保存在消息隊列中的數據並沒有消失,也就是說下次再從這個消息隊列讀數據的時候,就是上次的數據!!!!
3.信號量,它與WINDOWS下的信號量是一樣的,所以就不用多說了
4.共享內存,類似於WINDOWS下的DLL中的共享變數,但LINUX下的共享內存區不需要像DLL這樣的東西,只要首先創建一個共享內存區,其它進程按照一定的步驟就能訪問到這個共享內存區中的數據,當然可讀可寫
以上幾種方式的比較:
1.管道:速度慢,容量有限,只有父子進程能通訊
2.FIFO:任何進程間都能通訊,但速度慢
3.消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題
4.信號量:不能傳遞復雜消息,只能用來同步
5.共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存
本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。一般說來,為了獲得共享資源,進程需要執行下列操作:
(1)測試控制該資源的信號量;
(2)若此信號量的值為正,則允許進行使用該資源,進程將進號量減1;
(3)若此信號量為0,則該資源目前不可用,進程進入睡眠狀態,直至信號量值大於0,進程被喚醒,轉入步驟(1);
(4)當進程不再使用一個信號量控制的資源時,信號量值加1,如果此時有進程正在睡眠等待此信號量,則喚醒此進程。
套接字通信並不為Linux所專有,在所有提供了TCP/IP協議棧的操作系統中幾乎都提供了socket,而所有這樣操作系統,對套接字的編程方法幾乎是完全一樣的
三、進程/線程同步機制與進程間通信機制比較
很明顯2者有類似,但是差別很大
同步主要是臨界區、互斥、信號量、事件
進程間通信是管道、內存共享、消息隊列、信號量、socket
共通之處是,信號量和消息(事件)
小結:
進程互斥、同步與通信的關系:進程競爭資源時要實施互斥,互斥是一種特殊的同步,實質上需要解決好進程同步問題,進程同步是一種進程通信,由此看來,進程互斥、同步都可以看做進程的通信;
信號量是進程同步與互斥的常用方法,也可以作為低級的進程通信方法,用於傳遞控制信號;
管道與管程是不同的,管程是進程同步的方式,而管道則是進程通信的方式;

熱點內容
androidtimestamp 發布:2024-04-25 09:06:07 瀏覽:608
玩火影筆記本要什麼配置 發布:2024-04-25 08:34:59 瀏覽:209
sql性能監視器 發布:2024-04-25 08:21:48 瀏覽:832
吃雞ak配置什麼最好 發布:2024-04-25 08:15:46 瀏覽:447
firefox緩存目錄 發布:2024-04-25 08:00:31 瀏覽:940
我的世界國服怎麼免費弄伺服器 發布:2024-04-25 08:00:16 瀏覽:540
javaapi源碼 發布:2024-04-25 07:51:15 瀏覽:606
怎麼在伺服器執行jmeter腳本 發布:2024-04-25 07:35:25 瀏覽:397
域名訪問https 發布:2024-04-25 07:16:56 瀏覽:414
javaie亂碼 發布:2024-04-25 07:07:15 瀏覽:602