共享記憶體
訊息佇列
訊號量程序間通訊(ipc):作業系統為使用者提供的幾種程序間通訊方式
為什麼作業系統要為使用者提供程序間通訊方式?
如何提供程序間通訊方式?
程序間通訊的方式:
systemv標準的程序間通訊方式:共享記憶體,訊息佇列,訊號量
命令操作:
管道的本質:核心中的一塊緩衝區;若多個程序可訪問到同乙個緩衝區,就可以實現通訊
核心中一塊沒有具體識別符號的緩衝區,只能用於具有親緣關係的程序間通訊。子程序只能通過複製父程序的方式獲取到管道的檔案描述符(操作控制代碼),因為父程序建立管道的時候作業系統會返回管道的檔案描述符
建立匿名管道:
int
pipe
(int pipefd[2]
);// pipefd[2]具有兩個int型節點的陣列的首位址,用於接收建立管道返回的操作控制代碼
// pipefd[0]用於從管道中讀取資料,pipefd[1]用於向管道中寫入資料
管道是單向的資源傳輸,自身並不限制資源的傳輸方向,使用時只能用一端,哪一端不使用就關閉哪一端
命令列中管道符的實現:ps -ef | grep ssh
一塊具有識別符號的緩衝區,可用於同一主機上的任意程序間通訊。多個程序可以通過開啟同乙個命名管道檔案訪問同乙個管道(核心中的緩衝區)實現通訊
建立命名管道檔案介面:
int
mkfifo
(char
* filename,mode_t mode)
;// 引數:
// filename:管道檔名稱
// mode:管道檔案許可權
// 返回值:成功返回0,失敗返回-1
共享記憶體是一塊物理記憶體
操作流程:
建立共享記憶體:在物理記憶體上開闢空間
程序將共享記憶體對映到自己的虛擬位址空間(基本的記憶體操作都可以對這塊空間進行操作)
解除虛擬位址空間與共享記憶體的對映關係
釋放共享記憶體資源
特性:
**操作:
1.建立共享記憶體:
int
shmget
(key_t key,size_t size,
int shm***)
;
void
*shmat
(int shmid,
const
void
* shmaddr,
int shm***)
;
3.解除對映關係:
int
shmdt
(const
void
* shmaddr)
;
返回值:成功返回0,失敗返回-1
4.刪除共享記憶體:
shmctl
(int shmid,
int cmd,
struct shmid_ds* buf)
;
共享記憶體與管道的區別:
概念:核心中的乙個優先順序佇列
實現原理:多個程序通過訪問同乙個佇列,進行新增節點或者獲取節點實現通訊
操作流程:
建立訊息佇列:在核心中建立乙個優先順序佇列
程序可以向佇列中新增節點/獲取節點
刪除訊息佇列
特性:自帶同步與互斥、生命週期隨核心
概念:用於實現程序間的同步與互斥(共享記憶體本身不提供同步與互斥,操作存在安全隱患,因此需要使用訊號量保護對共享記憶體的操作)
本質:乙個核心中的計數器+pcb等待佇列
實現原理:
阻塞:為了完成乙個功能發起呼叫,若當前不具備完成條件則一直等待 ↩︎
同步:通過條件判斷實現臨界資源(一次只能供乙個程序訪問的資源)操作的合理性 ↩︎
原子操作:不能被打斷的操作,指的是乙個操作要麼一次完成,要麼就不做 ↩︎
互斥:通過同一時間唯一訪問實現臨界資源操作的安全性 ↩︎
程序間的通訊方式,執行緒間的通訊方式 程序
當時做筆記的時候 忘了在 看到的了,有時間我再研究研究 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 namedpipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semo...
程序間通訊的方式?執行緒間通訊的方式?
管道 命名管道 訊號量 訊息佇列 訊號及共享記憶體只適用於本地程序間通訊,套接字則可用於遠端通訊,因而一般用於網路程式設計。部分概念解釋 匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。命名管道是一種實際存在的fifo檔案,稱作...
程序間通訊方式
謝謝作者 用於程序間通訊 ipc 的四種不同技術 共享記憶體,臨界區,管道,訊息 1.訊息傳遞 管道,fifo,posix和system v訊息佇列 2.同步 互斥鎖,條件變數,讀寫鎖,檔案和記錄鎖,posix和system v訊號燈 3.共享記憶體區 匿名共享記憶體區,有名posix共享記憶體區,...