linux操作系統進程間通信IPC之共享存儲映射

(1)文件存儲映射I/O(Memory-mapped I/O)

? ? ? ? ? 一個磁盤文件與存儲空間中的一個緩存區相對應,這樣可以在不適合read/write函數的情況下,使用地址(指針)完成I/O操作。具體實現通過內核指定一個文件映射到存儲區域中,這個映射可以通過mmap來實現。

? ? ? ? ? mmap函數原型及頭文件

? ? ? ? ? ? ? ? ??

? ? ? ? ?函數參數:addr:建立映射區的首地址,由linux內核決定,直接賦值NULL即可;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?length:想要建議映射區的大小(應該比磁盤文件小)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?prot:映射區權限,有PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITE(權限小于文件的權限)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?flags:標志位參數,通常用來設置更新物理區域,設置共享,創建匿名映射區

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MAP_SHARED:映射區所做的操作會反應到磁盤上

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MAP_PRIVATE:映射區所做的操作會不反應到磁盤上

? ? ? ? ? ? ? ? ? ? ? ? ? ? fd:磁盤文件的文件描述符

? ? ? ? ? ? ? ? ? ? ? ? ? ? offset:映射文件的偏移(4K整數倍,因為內存的最小大小是4K)

? ? ? ? ?返回參數:成功,返回映射區首地址;失敗:返回MAP_FAILED宏(一定要檢查再使用)

? ? ? ? 與mmap相對的,有一個函數munmap用來回收mmap申請的映射空間

? ? ? ? ?函數原型及頭文件: 成功返回0,失敗返回-1.

? ? ? ? ? ?

? ? ? ? ?mmap和munmap函數使用時注意事項:

(2)mmap父子間進程通信

? ? ? ? ?父子間等有血緣關系的進程可以通過mmap來建立映射,只需要改變創建映射區的標志位參數flags.

? ? ? ? ? ? ? ? ?MAP_SHARED(共享映射)? 父子進程共享映射區

? ? ? ? ? ? ? ? ?MAP_PRIVATE(私有映射)? 父子間各自獨占映射區

實現父子進程通信,父進程穿件映射區,然后fork子進程,修改映射區的內容,父進程再讀取映射區內容,檢查是否修改。

? ? ? ?父子進程共享:打開的文件和mmap建立的映射區(MAP_SHARED)

(3)匿名映射

? ? ? ? ?父子進程間通信建立一個映射區通常需要打開一個文件,創建好再unlink(刪除文件的臨時目錄項,以便在所有使用這個文件的進程關閉后刪除文件),close等操作,比較麻煩,可以采用匿名映射來代替臨時文件,具體操作如下:

? ? ? ? mmap(NULL.size(任意大小),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);

? ? ? ? MAP_ANONYMOUS(MAP_ANON)宏是linux操作系統所特有的宏。

? ? ? ?在類unix系統中可以使用以下操作完成匿名映射區的建立。

? ? ? ?fd=open("/dev/zero",O_RDWR);

? ? ? p=mmap(NULL,size,PROT_READ|PROT_WRITE,MMAP_SHARED,fd,0);

(4)mmap無血源關系實現進程間通信

? ? ? ? mmap是內核借助文件創建一個映射區,多個進程可以通過利用該映射區來完成數據傳遞,因此無血緣關系的進程也可以進行通信,只需要設置對應的flags即可(設置成MAP_SHARED)

實現非血源關系的進程間的通信,一個進程實現寫映射區操作,一個實現讀映射區操作(先完成寫進程操作,再完成讀進程操作)。

寫進程操作:

讀進程操作

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382336.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

redis源碼剖析(十四)—— dump.rdb文件分析工具

分析rdb文件的工具 安裝 git clone https://github.com/sripathikrishnan/redis-rdb-tools.git sudo pip install --upgrade pip sudo pip install python-lzf分析以n開頭的key rdb --command justkeyvals --key "n*" /home/kou/redis_tar/redis-3.0-annotated/s…

linux操作系統之信號

(1)信號的概念 信號的特點:簡單,不能攜帶大量信息,滿足某種特定條件才觸發。 信號的機制;“軟中斷”,通過軟件方式實現,具有很強的延時性。每個進程收到的信號,都由內核負…

redis源碼學習筆記目錄

Redis源碼分析(零)學習路徑筆記 Redis源碼分析(一)redis.c //redis-server.c Redis源碼分析(二)redis-cli.c Redis源碼剖析(三)——基礎數據結構 Redis源碼剖析(四&…

linux操作系統信號捕捉函數之sigaction用法小結

&#xff08;1&#xff09;sigaction函數&#xff1a;注冊一個信號捕捉函數&#xff08;不參與捕捉信號&#xff0c;信號由內核捕捉&#xff09;&#xff0c;并修改原來的信號處理動作 &#xff08;2&#xff09;函數原型及頭文件 頭文件&#xff1a;#include<signal.h>…

redis源碼剖析(十五)——客戶端思維導圖整理

redis源碼剖析&#xff08;十五&#xff09;——客戶端執行邏輯結構整理 加載略慢

linux操作系統信號捕捉函數之回調函數小結

&#xff08;1&#xff09;signal 信號捕捉函數&#xff1a;注冊一個信號捕捉函數&#xff08;不參與捕捉&#xff0c;那是內核的事情&#xff09; 函數實現&#xff1a; typedef void(*sighandler_t)(int); //聲明了一個函數指針&#xff08;代表著一類函數&#xff1a;參…

Redis運維和開發學習筆記-全書思維導圖

Redis運維和開發學習筆記-全書思維導圖 圖片過大&#xff0c;無法上傳。 鏈接:https://pan.baidu.com/s/13pnEMBEdLgjZNOOEAuDvEQ 密碼:qhch

linux操作系統之競態條件(時序競態)

&#xff08;1&#xff09;時序競態&#xff1a;前后兩次運行同一個程序&#xff0c;出現的結果不同。 &#xff08;2&#xff09;pause函數&#xff1a;使用該函數會造成進程主動掛起&#xff0c;并等待信號喚醒&#xff0c;調用該系統調用的進程會處于阻塞狀態&#xff08;主…

linux操作系統之全局異步IO及可重入/不可重入函數

&#xff08;1&#xff09;全局變量異步I/O實現父子進程交替數數 1&#xff09;信號捕捉函數 2&#xff09;main函數實現信號交替 3&#xff09;程序實現 1》創建子進程&#xff0c;父進程等待1s&#xff0c;等待子進程完成捕捉函數注冊&#xff08;捕捉信號SIGUSR1&#xff09…

RDB和AOF速度測試

同一臺機器測試 Redis3.2 Redis5.0.7 Linux python 3.10.0-693.11.1.el7.x86_64 #1 SMP Mon Dec 4 23:52:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux rdb測試步驟 1. 修改redis.conf配置文件 開啟rdb(測試aof時&#xff0c;注釋掉rdb&#xff0c;并重啟redis) # save &quo…

LInux操作系統之SIGCHLD信號

&#xff08;1&#xff09;SIGCHLD產生條件 1&#xff09;子進程終止的時候 2&#xff09;子進程接收到SIGSTOP信號停止時 3&#xff09;子進程處于停止狀態&#xff0c;接受到SIGCONT后喚醒 &#xff08;2&#xff09;借助SIGCHLD使用waitpid信號實現父進程對子進程的回收 &a…

rdb和aof到底哪個快

rdb和aof到底哪個快&#xff1f; 大多數情況rdb比aof快&#xff01;取決因素是fsync策略 具體選擇aof還是rdb應根據業務場景選擇。糾結于兩者哪個更快意義不大 測試數據 數據量rdb時間rdb文件大小5000076s1.1M100000197s2.1M150000235s3.1M200000305s4.3M 數據量aof時間ao…

linux操作系統之終端

&#xff08;1&#xff09;終端分類&#xff1a; AltCtrlF1~F6 字符終端 pts :偽終端 AltCtrlF7 圖形終端 SSH&#xff0c;Telnet 網路終端 &#xff08;2&#xff09;終端的啟動流程 每一個進程都可以通過一個特殊的設備文件/dev/tty訪問它的控制終端&#x…

golang實現聊天室(一)

一個簡單的tcp通訊 客戶端發一下&#xff0c;服務端收一下打印 客戶端 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:8888", 30*time.Second)if err ! nil {return}conn.Write([]byte("string not "))conn.Close() }服務端 …

linux操作系統之進程組及會話

&#xff08;1&#xff09;進程組&#xff08;作業&#xff09;&#xff1a;代表一個或多個進程的集合。 1)父進程創建子進程時&#xff0c;默認子進程與父進程屬于同一進程組&#xff0c;進程組id第一個進程id(組長id,父進程id)。 2)使用kill -SIGKILL -進程組id(負數&#xf…

golang實現聊天室(二)

golang實現聊天室&#xff08;二&#xff09; 上一篇完成了服務端啟動監聽連接&#xff0c;客戶端建立連接&#xff0c;發一個消息&#xff0c;斷開連接。服務端收一下&#xff0c;然后服務端打印。 客戶端可以一直發送消息&#xff0c;服務端不停接收并打印 client func mai…

golang實現聊天室(三)

golang實現聊天室&#xff08;三&#xff09; 實現多個客戶端同時給服務端發送消息&#xff0c;服務端接受并打印出來 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:5888", 30*time.Second)if err ! nil {log.Fatal("conn…

linux操作系統之線程同步及互斥量

&#xff08;1&#xff09;線程同步 1&#xff09;線程同步&#xff1a;指一個線程發出某一個功能運行時&#xff0c;在運行還沒有結束的時候&#xff0c;該調用不返回。同時其它線程為保證數據的一致性&#xff0c;不能調用該功能。 2&#xff09;多個控制流共同操作一個共享資…

golang實現聊天室(四)

golang實現聊天室&#xff08;四&#xff09; 服務端給已經建立連接的客戶端發送消息 client1 func main() {var conn, err net.DialTimeout("tcp", "127.0.0.1:6888", 30*time.Second)if err ! nil {log.Fatal("conn error")}for {conn.Write…