導航:首頁 > 編程系統 > linuxsemaphore用法

linuxsemaphore用法

發布時間:2022-09-15 20:01:08

linux中mutex和semaphore的區別

mutex互斥體只用於保護臨界區的代碼(訪問共享資源),而不用於鎖之間的同步,即一個線程釋放mutex鎖後,馬上又可能獲取同一個鎖,而不管其它正在等待該mutex鎖的其它線程。
semaphore信號量除了起到保護臨界區的作用外,還用於鎖同步的功能,即一個線程釋放semaphore後,會保證正在等待該semaphore的線程優先執行,而不會馬上在獲取同一個semaphore。
如果兩個線程想通過一個鎖達到輸出1,2,1,2,1,2這樣的序列,應使用semaphore, 而使用mutex的結果可能為1,1,1,1,1,2,2,2,111.....。

㈡ linux 進程間通信的幾種方式

第一種:管道通信
兩個進程利用管道進行通信時,發送信息的進程稱為寫進程;接收信息的進程稱為讀進程。管道通信方式的中間介質就是文件,通常稱這種文件為管道文件,它就像管道一樣將一個寫進程和一個讀進程連接在一起,實現兩個進程之間的通信。寫進程通過寫入端往管道文件中寫入信息;讀進程通過讀出端從管道文件中讀取信息。兩個進程協調不斷地進行寫和讀,便會構成雙方通過管道傳遞信息的流水線。
第二種:消息緩沖通信
多個獨立的進程之間可以通過消息緩沖機制來相互通信。這種通信的實現是以消息緩沖區為中間介質,通信雙方的發送和接收操作均以消息為單位。在存儲器中,消息緩沖區被組織成隊列,通常稱之為消息隊列。消息隊列一旦創建後即可由多進程共享,發送消息的進程可以在任意時刻發送任意個消息到指定的消息隊列上,並檢查是否有接收進程在等待它所發送的消息。若有則喚醒它,而接收消息的進程可以在需要消息的時候到指定的消息隊列上獲取消息,如果消息還沒有到來,則轉入睡眠等待狀態。
第三種:共享內存通信
針對消息緩沖需要佔用CPU進行消息復制的缺點,OS提供了一種進程間直接進行數據交換的通信方式。共享內存,顧名思義這種通信方式允許多個進程在外部通信協議或同步,互斥機制的支持下使用同一個內存段進行通信,它是一種最有效的數據通信方式,其特點是沒有中間環節,直接將共享的內存頁面通過附接映射到相互通信的進程各自的虛擬地址空間中,從而使多個進程可以直接訪問同一個物理內存頁面。

㈢ linux中mutex和semaphore的區別

Mutex的count有三種可能值。「1」代表unlocked,"0"代表lokced,負值代表可能的等待者。

Mutex有如下約定:

有且只有一個進程來持有。

有且只有owner本身可以unlock mutex(owner指針的作用)。

不允許遞歸鎖。但是semaphore是允許的,MySQL在這塊上,之前還有一個BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself

只能能過API來初始化,不允許通過memset和ing來初始化。

當持有mutex時,進程一般不退出;存放mutex的內存不能被釋放。

通常不用於軟硬體的中斷。

五、總結

從上面的定義,可以看出,semaphore一般只是表示資源有多少,信息量有多少,用來類似於解決procer-consumer的問題和同步信號發送等。不能解決串列化問題。
而Mutex則是來解決互斥問題,保證某個資源或者代碼片段的串列訪問;因為只有owner才能釋放鎖。另外,有同學可能會問,Binary
semaphore也只有兩種可能值,也可以實現互斥訪問。但是要知道,Binary
semaphore還是沒有owner指針。但有一點相似處,就是在ISR(Interrupt Service
Routine)系統中,semaphore或者mutex會被中斷程序中斷。

㈣ 為什麼要設置linux semaphore參數

通過ipcs -s 可以看到SEMAPHORE,在這里可以看到NSEMS是254(環境基於RHEL 6(32BIT),ORACLE DATABASE 11.2.0.1.0)
[root@hy1 oracle]# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x39c3211c 1671170 oracle 660 254
這個254表示什麼呢?是ORACLE進程數嗎?
[root@hy1 oracle]# ps -eaf | grep oracle | wc -l
50
可能看到整個ORACLE用戶的進程只有 50
經常官方文檔建議這個參數設置為PROCESSES再加150,那麼這個參數和PROCESSES應該有關,

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 250

在這里PROCESSES為250,其他的4代表什麼呢?
使用oradebug ipc可以跟蹤當前的IPC情況

Maximum processes: = 250
Number of semaphores per set: = 254
Semaphores key overhead per set: = 4
User Semaphores per set: = 250
Number of semaphore sets: = 1
Semaphore identifiers: = 1
Semaphore List=
1671170
可以看到4為SEAMPHORE本身的開銷,再加上PROCESSES定義的大小,剛好是254
kernel.semmsl 定義了一個信號集的信號數,這個參數設置建議為PROCESSES+150,當然系統的默認設置128也不會有問題
但是需要請求多個信號集,從某種程度上來說降低了效率
kernel.semopm定義了每次信號函數能操作的最大信號數,建議和semmsl相等,這樣一次調用就能完成所有的集號操作,而不
需要多次調用
kernel.semmni定了系統中的信號集的個數,一般125足夠用了
kernel.semmns定義了系統中最大信號數,建議值為 kernel.semmsl * kernel.semmni.

需要注意的是不要弄混信號和信號集的概念。

㈤ 為什麼要設置linux semaphore參數

通過ipcs -s 可以看到SEMAPHORE,在這里可以看到NSEMS是254(環境基於RHEL 6(32BIT),ORACLE DATABASE 11.2.0.1.0)
[root@hy1 oracle]# ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x39c3211c 1671170 oracle 660 254
這個254表示什麼呢?是ORACLE進程數嗎?
[root@hy1 oracle]# ps -eaf | grep oracle | wc -l
50
可能看到整個ORACLE用戶的進程只有 50
經常官方文檔建議這個參數設置為PROCESSES再加150,那麼這個參數和PROCESSES應該有關,

SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
processes integer 250

在這里PROCESSES為250,其他的4代表什麼呢?
使用oradebug ipc可以跟蹤當前的IPC情況

Maximum processes: = 250
Number of semaphores per set: = 254
Semaphores key overhead per set: = 4
User Semaphores per set: = 250

㈥ linux系統的進程間通信有哪幾種方式

一、方式

1、管道(Pipe)及有名管道( mkpipe):

管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;

2、信號(Signal):

信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身。

linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction。

實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數。

3、消息隊列(Message):

消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。

4、共享內存:

使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

5、信號量(semaphore):

主要作為進程間以及同一進程不同線程之間的同步手段。

6、套介面(Socket):

更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

二、概念

進程間通信概念:

IPC—-InterProcess Communication

每個進程各自有不同的用戶地址空間,任何一個進程的全局變數在另一個進程中都看不到所以進程之間要交換數據必須通過內核。

在內核中開辟一塊緩沖區,進程1把數據從用戶空間拷到內核緩沖區,進程2再從內核緩沖區把數據讀走,內核提供的這種機制稱為進程間通信。

(6)linuxsemaphore用法擴展閱讀

1)無名管道:

管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用於父子進程或者兄弟進程之間(具有親緣關系的進程)。

管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,構成兩進程間通信的一個媒介。

數據的讀出和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。

2)有名管道:

不同於管道之處在於它提供一個路徑名與之關聯,以FIFO的文件形式存在於文件系統中。這樣,即使與FIFO的創建進程不存在親緣關系的進程,只要可以訪問該路徑,就能夠彼此通過FIFO相互通信(能夠訪問該路徑的進程以及FIFO的創建進程之間)。

因此,通過FIFO不相關的進程也能交換數據。值得注意的是,FIFO嚴格遵循先進先出(first in first out),對管道及FIFO的讀總是從開始處返回數據,對它們的寫則把數據添加到末尾。它們不支持諸如lseek()等文件定位操作。



㈦ linux 下進程間的同步機制有哪些

感覺你提問的應該是進程間的通信。而通訊主要有以下6中方式:
1.管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
2.信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期 信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上, 該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,sigaction函數重新實現了signal函數);
3.報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
4.共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針其他通信機制運行效率較低設計的。往往與其它通信機制,如信號量結合使用, 來達到進程間的同步及互斥。
5.信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
6.套接字(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix 系統上:Linux和System V的變種都支持套接字。

㈧ linux編程時的信號量問題。 我以前用過的信號量頭文件是<semaphore.h>,而現在又發現還有個<sys/sem.h>

信號量在進程是以有名信號量進行通信的,在線程是以無名信號進行通信的,因為線程內linux還沒有實現進程間容的通信,所以在sem_init的第二個參數要為0,而且在多線程間的同步是可以通過有名信號量也可通過無名信號,但是一般情況線程的同步是無名信號量,無名信號量使用簡單,而且sem_t存儲在進程空間中,有名信號量必須LINUX內核管理,由內核結構struct ipc_ids 存儲,是隨內核持續的,系統關閉,信號量則刪除,當然也可以顯示刪除,通過系統調用刪除,
消息隊列,信號量,內存共享,這幾個都是一樣的原理。,只不過信號量分為有名與無名

無名使用 <semaphore.h>,
有名信號量<sys/sem.h>
無名信號量不能用進程間通信,
//無名與有名的區別,有名需要KEY值與IPC標識
所以sem_init的第二個參數必須為0,,,,

㈨ 關於linux下的多線程使用sem信號量的運行問題

不是信號量的問題
printf函數,是先寫到輸出緩沖,遇到\n時,或者緩沖區滿內時,或者有強制輸出容(fflush)時,才會將緩沖區里的內容輸出到屏幕上(標准輸出設備:stdout)。你的代碼裡面並沒有以上3個觸發條件的任意一種,所以printf的內存沒有實際輸出到屏幕上。
你只要在每個printf函數後面加上fflush(stdout);就可以了。

閱讀全文

與linuxsemaphore用法相關的資料

熱點內容
怎麼設置蜂窩數據 瀏覽:668
單機唱歌app哪個好 瀏覽:693
c語言在網站編輯框回車鍵怎麼用 瀏覽:637
ps文件製作記錄 瀏覽:174
為什麼qq不能上傳文件 瀏覽:158
word加入聲音文件 瀏覽:502
buttonjs提交 瀏覽:888
海龍套升級 瀏覽:520
上海買房到哪個網站買比較靠譜 瀏覽:314
電腦如何替換文件內容 瀏覽:415
大數據沉澱 瀏覽:547
蘋果6怎麼找到運營商 瀏覽:747
iphone5連拍怎麼弄 瀏覽:323
上海樂客網路技術有限公司 瀏覽:439
計算機二級資料庫vfp 瀏覽:399
為什麼有護照大數據還要排查 瀏覽:241
為啥qq群文件下載不了 瀏覽:1
note3開機密碼設置 瀏覽:64
excel表文件怎麼按照日期排序 瀏覽:745
源網站招聘 瀏覽:729

友情鏈接