當前位置:首頁 » 操作系統 » linux共享內存信號量

linux共享內存信號量

發布時間: 2025-04-02 18:52:20

『壹』 linux系統編程學習筆記——進程間的同步:信號量、互斥鎖、信號

Linux系統編程學習筆記——進程間的同步:信號量、互斥鎖、信號

信號量用途:用於同步進程或線程間的動作。 內核維護:一個整數,其值限制為大於等於0。 操作:可執行增減值操作,這些操作可能導致進程阻塞。 類型未命名信號量:位於內存共享區域,通過sem_post喚醒阻塞進程,sem_wait阻塞當前進程。若用於進程間,需置於共享內存上,使用mmap函數映射。 命名信號量:擁有唯一名字,通過sem_open函數創建並訪問,可用於進程間通過名字共享信號量實現同步。 注意事項:信號量的初始值會影響進程的執行流程。

互斥鎖用途:用於任務間的同步。 功能:確保共享資源在訪問時只有一個線程執行,側重於加鎖和解鎖狀態。 應用:主要應用於線程之間,通過互斥鎖實現共享資源的訪問控制,避免並發修改問題。

信號用途:事件通知機制,內核、其他進程或自身可向進程發送信號。 處理:接收信號後,進程可選擇忽略、掛起或在特定信號處理函數後恢復執行。 應用: 通過kill命令向進程發送信號,影響進程的執行流程。 創建父子進程時,子進程可以定期列印信息,父進程可以延遲後殺死子進程,或通過指定信號處理函數實現更復雜的進程間交互。 信號處理函數用於響應特定信號,如中斷或異常情況處理。

以上是對Linux系統編程中進程間同步的三種機制——信號量、互斥鎖和信號的簡要總結。

『貳』 濡備綍鍦↙inux涓閫氳繃semget鍜宻emctl鍑芥暟鍒嗛厤騫墮噴鏀句俊鍙烽噺錛

Linux 緋葷粺涓錛屼俊鍙烽噺鐨勭$悊閫氳繃 semget 鍜 semctl 榪欎袱涓緋葷粺璋冪敤鏉ュ畬鎴愶紝瀹冧滑鐨勪綔鐢ㄧ被浼間簬 shmget 鍜 shmctl 瀵瑰叡浜鍐呭瓨鐨勫勭悊銆傝佷嬌鐢ㄤ俊鍙烽噺錛屼綘闇瑕侀栧厛璋冪敤 semget 鍑芥暟錛屼紶鍏ュ弬鏁板寘鎷淇″彿閲忕粍鐨勯敭鍊箋佷俊鍙烽噺鐨勬暟閲忎互鍙婃潈闄愭爣璇嗐傞敭鍊肩敤浜庡敮涓鏍囪瘑淇″彿閲忕粍錛屽嵆浣胯繘紼嬮鍑猴紝淇″彿閲忎篃浼氬湪緋葷粺涓鎸佷箙瀛樺湪銆傝幏鍙栧凡瀛樺湪鐨勪俊鍙烽噺鏃訛紝鍙浠ヤ紶鍏0浣滀負緇勫歸噺銆


淇″彿閲忕殑鐢熷懡鍛ㄦ湡闇瑕佹墜鍔ㄧ$悊錛屽綋鏈鍚庝竴涓浣跨敤淇″彿閲忕殑榪涚▼閫鍑烘椂錛岄渶瑕佽皟鐢 semctl 鍑芥暟鏉ュ垹闄や俊鍙烽噺緇勩傝繖涓鍑芥暟闇瑕佸洓涓鍙傛暟錛氫俊鍙烽噺緇勬爣璇嗙︺佽佹搷浣滅殑淇″彿閲忕紪鍙鳳紙鍦ㄨ繖涓渚嬪瓙涓鏄1錛夈佸父閲 IPC_RMID 鍜屼竴涓 union semun 綾誨瀷鐨勭粨鏋勪綋錛堝疄闄呮搷浣滀腑蹇界暐錛夈傚垹闄ゆ搷浣滆佹眰璋冪敤鑰呬笌淇″彿閲忕粍鍒涘緩鑰呮潈闄愮浉鍚岋紝鎴栬呮嫢鏈 root 鏉冮檺銆備笌 shmget 涓嶅悓錛屽垹闄や俊鍙烽噺緇勪細絝嬪嵆閲婃斁緋葷粺璧勬簮銆


鍦ㄤ唬鐮佸眰闈錛屽備唬鐮 5.2錛坰em_all_deall.c錛夋墍紺猴紝鏈変袱涓鍏抽敭鍑芥暟錛氫竴涓鐢ㄤ簬鍒嗛厤浜屽厓淇″彿閲忥紙binary_semaphore_allocation錛夛紝閫氳繃 semget 鍑芥暟鑾峰彇鎴栧壋寤猴紱鍙︿竴涓鐢ㄤ簬閲婃斁浜屽厓淇″彿閲忥紙binary_semaphore_deallocate錛夛紝浣跨敤 semctl 鍑芥暟榪涜屽垹闄ゆ搷浣滐紝紜淇濊祫婧愮殑姝g『閲婃斁銆



鍒嗛厤浜屽厓淇″彿閲忥細 int binary_semaphore_allocation (key_t key, int sem_flags)錛岃繑鍥 semget 鐨勭粨鏋滐紝濡傛灉闇瑕佸垯鍒涘緩淇″彿閲忋


閲婃斁浜屽厓淇″彿閲忥細 int binary_semaphore_deallocate (int semid)錛岃皟鐢 semctl 鍑芥暟鍒犻櫎淇″彿閲忥紝鍙傛暟鍖呮嫭淇″彿閲忕粍鏍囪瘑絎﹀拰甯擱噺 IPC_RMID銆


鎵╁睍璧勬枡

Linux 鎻愪緵鐨勫悇縐嶇郴緇熻皟鐢ㄦ潵瀹炵幇涓涓鍏鋒湁涓ょ嶇姸鎬佺殑淇″彿閲忥紙binary semaphore錛夈

『叄』 linux共享內存使用的過程

Linux共享內存使用的過程?

一、什麼是共享內存
顧名思義,共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種非常有效的方式。不同進程之間共享的內存通常安排為同一段物理內存。進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址,就好像它們是由用C語言函數malloc分配的內存一樣。而如果某個進程向共享內存寫入數據,所做的改動將立即影響到可以訪問同一段共享內存的任何其他進程。

特別提醒:共享內存並未提供同步機制,也就是說,在第一個進程結束對共享內存的寫操作之前,並無自動機制可以阻止第二個進程開始對它進行讀取。所以我們通常需要用其他的機制來同步對共享內存的訪問,例如前面說到的信號量。

二、共享內存的使用
與信號量一樣,在Linux中也提供了一組函數介面用於使用共享內存,而且使用共享共存的介面還與信號量的非常相似,而且比使用信號量的介面來得簡單。它們聲明在頭文件 sys/shm.h中。
1、shmget函數
該函數用來創建共享內存,它的原型為:
int shmget(key_t key, size_t size, int shmflg);
第一個參數,與信號量的semget函數一樣,程序需要提供一個參數key(非0整數),它有效地為共享內存段命名,shmget函數成功時返回一個與key相關的共享內存標識符(非負整數),用於後續的共享內存函數。調用失敗返回-1.

不相關的進程可以通過該函數的返回值訪問同一共享內存,它代表程序可能要使用的某個資源,程序對所有共享內存的訪問都是間接的,程序先通過調用shmget函數並提供一個鍵,再由系統生成一個相應的共享內存標識符(shmget函數的返回值),只有shmget函數才直接使用信號量鍵,所有其他的信號量函數使用由semget函數返回的信號量標識符。

第二個參數,size以位元組為單位指定需要共享的內存容量

第三個參數,shmflg是許可權標志,它的作用與open函數的mode參數一樣,如果要想在key標識的共享內存不存在時,創建它的話,可以與IPC_CREAT做或操作。共享內存的許可權標志與文件的讀寫許可權一樣,舉例來說,0644,它表示允許一個進程創建的共享內存被內存創建者所擁有的進程向共享內存讀取和寫入數據,同時其他用戶創建的進程只能讀取共享內存。

『肆』 linux查看共享內存命令

共享內存查看
使用ipcs命令,不加如何參數時,會把共享內存、信號量、消息隊列的信息都列印出來,如果只想顯示共享內存信息,使用如下命令:
[root@localhost ~]# ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:
第一列就是共享內存的key;
第二列是共享內存的編號shmid;
第三列就是創建的用戶owner;
第四列就是許可權perms;
第五列為創建的大小bytes;
第六列為連接到共享內存的進程數nattach;
第七列是共享內存的狀態status。其中顯示「dest」表示共享內存段已經被刪除,但是還有用戶在使用它,當該段內存的mode欄位設置為SHM_DEST時就會顯示「dest」。當用戶調用shmctl的IPC_RMID時,內存先查看多少個進程與這個內存關聯著,如果關聯數為0,就會銷毀這段共享內存,否者設置這段內存的mod的mode位為SHM_DEST,如果所有進程都不用則刪除這段共享內存。

熱點內容
Java項目案例分析 發布:2025-04-03 17:01:33 瀏覽:269
sql導入導出資料庫 發布:2025-04-03 16:48:18 瀏覽:780
微信平台資料庫 發布:2025-04-03 16:46:28 瀏覽:886
網路編程技術電大 發布:2025-04-03 16:43:06 瀏覽:348
編程菜鳥教程 發布:2025-04-03 16:39:51 瀏覽:254
android網路庫 發布:2025-04-03 16:36:52 瀏覽:556
北京時間伺服器ip地址埠號 發布:2025-04-03 16:35:56 瀏覽:855
基岩版伺服器埠什麼協議 發布:2025-04-03 16:34:30 瀏覽:597
手機前端編程軟體 發布:2025-04-03 16:33:19 瀏覽:442
android很抱歉已停止運行 發布:2025-04-03 16:27:51 瀏覽:437