操作系统进程间通信 --- IPC
1. 概述
進(jìn)程間通信的原因:
進(jìn)程之間要保持獨(dú)立, 也需要通信, 保證相對(duì)獨(dú)立性的同時(shí)還需要去確保進(jìn)程間的溝通.
1.1 通信模型
IPC facility提供2個(gè)操作:
- send(message) -- 消息大小固定或者可變
- receive(message)
如果P和Q想通信, 需要:
- 在它們之間建立通信鏈路
- 通過(guò) send/receive交換消息
通信鏈路的實(shí)現(xiàn):
- 物理(例如, 共享內(nèi)存, 硬件總線)
- 邏輯(例如, 邏輯屬性)
1.2 直接及間接通信
假如進(jìn)程A, B需要進(jìn)行通信, 有以下兩種方式:
- 進(jìn)程A把消息先發(fā)給內(nèi)核, 由內(nèi)核再轉(zhuǎn)發(fā)給進(jìn)程B.
- 進(jìn)程A和B直接進(jìn)行通信.
那么第一種方式就是間接通信, 第二種方式是直接通信.
為了能夠?qū)崿F(xiàn)有效正確的通信, 直接/間接通信需要有以下注意事項(xiàng):
直接通信:
- 進(jìn)程必須正確的命名對(duì)方:
- send(P, message) -- 發(fā)送信息到進(jìn)程P
- receive(Q, message) == 從進(jìn)程Q接受消息
- 通信鏈路的屬性
- 自動(dòng)建立鏈路
- 一條鏈路恰好對(duì)應(yīng)一對(duì)通信進(jìn)程
- 每對(duì)進(jìn)程之間只有一個(gè)鏈接存在
- ?鏈接可以是單向的, 但通常為雙向的
間接通信:
- 定向從消息隊(duì)列接收消息
- 每個(gè)消息隊(duì)列都有一個(gè)唯一的ID
- 只有它們共享了一個(gè)消息隊(duì)列, 進(jìn)程才能夠通信
- 通信鏈路的屬性
- 只有進(jìn)程共享一個(gè)共同的消息隊(duì)列, 才建立鏈路
- 鏈路可以與許多進(jìn)程相關(guān)聯(lián)
- 每對(duì)進(jìn)程可以共享多個(gè)通信鏈路
- 連接可以是單向或雙向
- 操作
- 創(chuàng)建一個(gè)新的消息隊(duì)列
- 通過(guò)消息隊(duì)列發(fā)送和接收消息
- 銷(xiāo)毀消息隊(duì)列
- 原語(yǔ)的定義如下:
? ? ? ? ? ? ? ? ? ? ? ?send(A, message) --- 發(fā)送消息到隊(duì)列A
? ? ? ? ? ? ? ? ? ? ? ?receive(A, message) --- 從隊(duì)列A接受消息
1.3 阻塞與非阻塞
消息傳遞可以是阻塞或非阻塞
阻斷被認(rèn)為是同步的:
- Blocking send has the sender block until the message is received
- Blocking receive has the receiver block until a message is available
非阻斷被認(rèn)為是異步的:
- Non-blocking send has the sender send the message and continue
- Non-blocking receive has the receiver receive a valid message or null
1.4 通信鏈路緩沖
隊(duì)列的消息被附加到鏈路, 可以是以下3種方式之一:
- 0容量 - 0 messages, 發(fā)送方必須等待接收方(阻塞傳遞)
- 有限容量 - n messages的有限長(zhǎng)度, 如果隊(duì)列滿了那么發(fā)送方就必須等待
- 無(wú)限容量 - 無(wú)限長(zhǎng)度, 發(fā)送方不需要等待
2. 信號(hào)
Signal:
- 軟件中斷通知事件處理
- Example: SIGFPE, SIGKILL, SIGUSR1, SIGTOP, SIGCONT
接收到信號(hào)時(shí)會(huì)發(fā)生什么:
- Catch: 指定信號(hào)處理函數(shù)被調(diào)用
- Ignore: 依賴(lài)操作系統(tǒng)的默認(rèn)操作(Example: Abort, memory, dump, suspend or resume process)
- Mask: 閉塞信號(hào)因此不會(huì)傳送, 可能是暫時(shí)的(當(dāng)處理同樣類(lèi)型的信號(hào))
不足:
不能傳輸要交換的任何數(shù)據(jù)
3. 管道
管道是用來(lái)進(jìn)行數(shù)據(jù)交換的.?
4. 消息隊(duì)列
消息隊(duì)列按FIFO來(lái)管理消息:
- Message: 作為一個(gè)和字節(jié)序列存儲(chǔ)
- Message Queues: 消息數(shù)組
- FIFO & FIFO configuration
5. 共享內(nèi)存
進(jìn)程:
- 每個(gè)進(jìn)程都有私有地址空間
- 在每個(gè)地址空間內(nèi), 明確地設(shè)置了共享內(nèi)存段
優(yōu)點(diǎn):
- 快速, 方便地共享數(shù)據(jù)
不足:
- 必須同步數(shù)據(jù)訪問(wèn)
總結(jié)
以上是生活随笔為你收集整理的操作系统进程间通信 --- IPC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php静态数组变量初始化,为什么数组初始
- 下一篇: 操作系统中的全局页面置换算法