程序間通訊的方式

2021-10-08 23:45:32 字數 2288 閱讀 3403

共享記憶體

訊息佇列

訊號量程序間通訊(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共享記憶體區,...