操作系统进程间通信 --- IPC
生活随笔
收集整理的這篇文章主要介紹了
操作系统进程间通信 --- IPC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 概述
進程間通信的原因:
進程之間要保持獨立, 也需要通信, 保證相對獨立性的同時還需要去確保進程間的溝通.
1.1 通信模型
IPC facility提供2個操作:
- send(message) -- 消息大小固定或者可變
- receive(message)
如果P和Q想通信, 需要:
- 在它們之間建立通信鏈路
- 通過 send/receive交換消息
通信鏈路的實現:
- 物理(例如, 共享內存, 硬件總線)
- 邏輯(例如, 邏輯屬性)
1.2 直接及間接通信
假如進程A, B需要進行通信, 有以下兩種方式:
- 進程A把消息先發給內核, 由內核再轉發給進程B.
- 進程A和B直接進行通信.
那么第一種方式就是間接通信, 第二種方式是直接通信.
為了能夠實現有效正確的通信, 直接/間接通信需要有以下注意事項:
直接通信:
- 進程必須正確的命名對方:
- send(P, message) -- 發送信息到進程P
- receive(Q, message) == 從進程Q接受消息
- 通信鏈路的屬性
- 自動建立鏈路
- 一條鏈路恰好對應一對通信進程
- 每對進程之間只有一個鏈接存在
- ?鏈接可以是單向的, 但通常為雙向的
間接通信:
- 定向從消息隊列接收消息
- 每個消息隊列都有一個唯一的ID
- 只有它們共享了一個消息隊列, 進程才能夠通信
- 通信鏈路的屬性
- 只有進程共享一個共同的消息隊列, 才建立鏈路
- 鏈路可以與許多進程相關聯
- 每對進程可以共享多個通信鏈路
- 連接可以是單向或雙向
- 操作
- 創建一個新的消息隊列
- 通過消息隊列發送和接收消息
- 銷毀消息隊列
- 原語的定義如下:
? ? ? ? ? ? ? ? ? ? ? ?send(A, message) --- 發送消息到隊列A
? ? ? ? ? ? ? ? ? ? ? ?receive(A, message) --- 從隊列A接受消息
1.3 阻塞與非阻塞
消息傳遞可以是阻塞或非阻塞
阻斷被認為是同步的:
- Blocking send has the sender block until the message is received
- Blocking receive has the receiver block until a message is available
非阻斷被認為是異步的:
- 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 通信鏈路緩沖
隊列的消息被附加到鏈路, 可以是以下3種方式之一:
- 0容量 - 0 messages, 發送方必須等待接收方(阻塞傳遞)
- 有限容量 - n messages的有限長度, 如果隊列滿了那么發送方就必須等待
- 無限容量 - 無限長度, 發送方不需要等待
2. 信號
Signal:
- 軟件中斷通知事件處理
- Example: SIGFPE, SIGKILL, SIGUSR1, SIGTOP, SIGCONT
接收到信號時會發生什么:
- Catch: 指定信號處理函數被調用
- Ignore: 依賴操作系統的默認操作(Example: Abort, memory, dump, suspend or resume process)
- Mask: 閉塞信號因此不會傳送, 可能是暫時的(當處理同樣類型的信號)
不足:
不能傳輸要交換的任何數據
3. 管道
管道是用來進行數據交換的.?
4. 消息隊列
消息隊列按FIFO來管理消息:
- Message: 作為一個和字節序列存儲
- Message Queues: 消息數組
- FIFO & FIFO configuration
5. 共享內存
進程:
- 每個進程都有私有地址空間
- 在每個地址空間內, 明確地設置了共享內存段
優點:
- 快速, 方便地共享數據
不足:
- 必須同步數據訪問
總結
以上是生活随笔為你收集整理的操作系统进程间通信 --- IPC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php静态数组变量初始化,为什么数组初始
- 下一篇: java虚拟机规范 51cto_java