多行程 Process 間的協調與通訊機制

更新於 2024/12/09閱讀時間約 6 分鐘

前一篇講了CPU 調度的方式,跟如何排程,這篇繼續寫 Process 間如何互相通訊,跟如果有很多 Process 之間如何運作。

CPU 調度與排程策略(CPU Scheduling)

目標:處理多個應用程式的競爭與協作

Interprocess Communication(IPC, 行程間通訊)

當多個行程需要共享資料或彼此通訊時,作業系統會提供各種方法來進行協作。這邊我看英文版有點難懂,所以加上一些比喻,應該會容易懂一些。

Inter Process Communication (IPC)

比喻:學校專題報告小組合作

假設你和幾個同學組成一個專題小組,需要一起完成報告。

  1. 訊息佇列 (Message Queue)
    • 你們透過 記事本留言區 傳遞訊息。例如,小組長貼了一個「今天要完成資料收集」的訊息,其他人按順序查看、完成並回報。
    • 重點:訊息按順序排隊,每個人按順序取用。
  2. 共享記憶體 (Shared Memory)
    • 你們共用一個 線上雲端文件 (Google 文件),所有組員都能同時查看和編輯內容。無論誰更新,其他人都能即時看到最新的資料。
    • 重點:所有人能同時存取和更改相同的資料空間。
  3. 管道 (Pipes)
    • 假設每位組員之間都有 Line 聊天室好友,可以一對一地討論。這個管道是專屬的,別人無法參與或偷聽。
    • 重點:兩個行程之間的直接溝通。
  4. 信號 (Signals)
    • 小組長完成報告後,按下 群組通知按鈕 (例如群組LINE通知) tag 所有人,「報告完成,準備交件!」。
    • 重點:即時廣播給所有相關人員,通常用來發送重要或緊急訊息。

Race Condition (競爭條件)、Critical Section (臨界區)、Dekker's Algorithm (德克演算法)

Race Conditions and How to Prevent Them - A Look at Dekker's Algorithm

比喻:多人同時對一張照片按讚

想像一張熱門照片,很多人同時對它按讚。如果系統沒有處理好,就可能發生競爭條件,導致按讚數錯誤。


1. Race Condition (競爭條件)

當多個使用者同時按下「讚」,伺服器需要更新按讚數。如果沒有適當的同步機制,可能出現以下狀況:

  • 使用者 A 按讚,伺服器讀到「目前按讚數是 3」,準備加 1。
  • 同時 使用者 B 也按讚,伺服器也讀到「目前按讚數是 3」,準備加 1。

理論上,按讚數應該是 5,但由於兩個請求同時進行,兩人都認為目前的按讚數是 3,最後結果只變成 4。

關鍵問題: 這就是競爭條件,因為伺服器同時處理了兩個請求,卻沒有正確同步,導致按讚數錯誤。


2. Critical Section (臨界區)

為了避免這種情況,設定了臨界區,一次只能有一個人( process )進入伺服器,進入後必須執行一段「讀取目前讚數,+1,更新讚數」的程式碼。

如何解決?

  • 當伺服器發現某個使用者正在更新按讚數時,必須暫時鎖住這個區域,直到處理完成。其他使用者只能 排隊等候,不能同時進入。
指針指到才可以進入

指針指到才可以進入


3. Dekker's Algorithm (德克演算法)

如果同時有兩個人想要進入 critical section,如何讓對方知道呢?

  • 兩個使用者想按讚:
    • 每個人先「按警示燈」,看看伺服器是否有人在更新。(我個人覺得很像地下停車場上下樓層的警示燈)
    • 如果有人在更新,另一個人必須等待。
    • 如果兩個人同時按警示燈,伺服器會 交替 允許其中一個人進行,另一個人下次再試,確保每個請求都會被處理到。
raw-image



作業系統 Deadlock影片 這個3分鐘影片很有趣~

Deadlock 與形成的四個條件

當多個行程互相等待彼此釋放資源,卻沒有一方能繼續執行時,就會發生 Deadlock (死結),系統因此停滯不前。

比喻:

想像兩輛車在狹窄巷道中相遇:

  • A 車想前進,但前面被 B 車擋住。
  • B 車也想前進,但前面被 A 車擋住。
    結果兩輛車都無法動彈,形成「死結」。

形成死結的四個必要條件

  1. 互斥 (Mutual Exclusion)
    • 資源只能由一個行程使用。
    • 比喻: 巷道只能容納一輛車通過。
  2. 占有與等待 (Hold and Wait)
    • 一個行程已占有資源,卻仍在等待其他資源。
    • 比喻: A 車已經在巷道內,卻還想進一步前進。
    • 用影片槍跟子彈的比喻,雙方都需要對方手上的資源。
  3. 不剝奪 (No Preemption)
    • 資源無法強制收回,必須由行程自願釋放。
    • 比喻: A 車和 B 車都不願意倒車。
  4. 循環等待 (Circular Wait)
    • 多個行程間形成循環等待鏈。
    • 比喻: A 車等 B 車讓路,而 B 車等 A 車讓路,形成無限等待。

解決死結的方法

  1. 死結預防 (Deadlock Prevention)
    • 設計時避免同時滿足所有死結條件。例如:資源分配時設定固定順序。
  2. 死結避免 (Deadlock Avoidance)
    • 根據程式的需求進行動態資源分配,確保系統永遠不進入死結狀態。
  3. 死結偵測與回復 (Deadlock Detection and Recovery)
    • 系統不主動避免死結,但可偵測到後強制回收資源或中止程式。
  4. 資源分配協議 (Resource Allocation Protocol)
    • 設定系統資源分配規則,避免循環等待。





留言0
查看全部
avatar-img
發表第一個留言支持創作者!
目標:理解程式的排程策略,如何讓多個應用程式同時執行 CPU Scheduling Criteria(CPU 調度準則) CPU Scheduling(Preemptive & Non-Preemptive)
本篇文章探討作業系統如何管理程式,介紹了 Process、Thread 及 Process Control Block(PCB)的基本概念。本文以實際例子解釋這些概念,並詳細說明 Context Switch 的運作方式以及程式的五大狀態。
本文探討記憶體(Memory)和儲存裝置(Storage)之間的主要差異,並解釋它們各自的功能與特性。此外,文章還深入介紹 Process、Thread 及其對 CPU 運作的影響,並結合可視化圖表幫助讀者理解這些複雜概念,特別適合對計算機科學有興趣的讀者。
本文用書櫃、書、書桌的比喻,深入探討電腦中資料儲存結構及作業系統如何協調資料處理。外部儲存裝置如同書櫃,主記憶體則比作書桌,處理器被比喻為讀書的人,並詳細介紹資料存取過程、Common Bus的角色以及作業系統的核心任務。透過此篇,讀者能更好地瞭解電腦在資料處理上的運作邏輯及作業系統的重要性。
本文深入探討 NoSQL 資料庫的特性及優勢,並將其與傳統 SQL 資料庫進行比較。NoSQL 資料庫因其結構靈活、擴展性強而適合儲存變化多端的數據,特別是在社交媒體和電商平臺等高需求場景。CAP 理論也被提出,解釋了分散式系統的能力取捨問題,幫助讀者瞭解在不同需求下如何選擇合適的資料庫技術。
本文探討 SQL 注入(SQL Injection)的攻擊原理及其防護措施。透過具體範例,解釋駭客如何利用應用程式漏洞進行資料庫攻擊,並提供有效的防範方法,包括使用參數化查詢、ORM 框架和輸入驗證等技術,確保應用程式的安全性。最後還簡介資料庫分區與分片的概念,讓讀者更全面理解如何管理和保護資料庫。
目標:理解程式的排程策略,如何讓多個應用程式同時執行 CPU Scheduling Criteria(CPU 調度準則) CPU Scheduling(Preemptive & Non-Preemptive)
本篇文章探討作業系統如何管理程式,介紹了 Process、Thread 及 Process Control Block(PCB)的基本概念。本文以實際例子解釋這些概念,並詳細說明 Context Switch 的運作方式以及程式的五大狀態。
本文探討記憶體(Memory)和儲存裝置(Storage)之間的主要差異,並解釋它們各自的功能與特性。此外,文章還深入介紹 Process、Thread 及其對 CPU 運作的影響,並結合可視化圖表幫助讀者理解這些複雜概念,特別適合對計算機科學有興趣的讀者。
本文用書櫃、書、書桌的比喻,深入探討電腦中資料儲存結構及作業系統如何協調資料處理。外部儲存裝置如同書櫃,主記憶體則比作書桌,處理器被比喻為讀書的人,並詳細介紹資料存取過程、Common Bus的角色以及作業系統的核心任務。透過此篇,讀者能更好地瞭解電腦在資料處理上的運作邏輯及作業系統的重要性。
本文深入探討 NoSQL 資料庫的特性及優勢,並將其與傳統 SQL 資料庫進行比較。NoSQL 資料庫因其結構靈活、擴展性強而適合儲存變化多端的數據,特別是在社交媒體和電商平臺等高需求場景。CAP 理論也被提出,解釋了分散式系統的能力取捨問題,幫助讀者瞭解在不同需求下如何選擇合適的資料庫技術。
本文探討 SQL 注入(SQL Injection)的攻擊原理及其防護措施。透過具體範例,解釋駭客如何利用應用程式漏洞進行資料庫攻擊,並提供有效的防範方法,包括使用參數化查詢、ORM 框架和輸入驗證等技術,確保應用程式的安全性。最後還簡介資料庫分區與分片的概念,讓讀者更全面理解如何管理和保護資料庫。
你可能也想看
Google News 追蹤
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
“所有人寫的程式會變成指令 每一道指令是由CPU執行 而CPU所能理解的指令類型有限”
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在IT世界中,持續整合(CI)和持續部署(CD)已成為提高開發效率和確保高質量軟件交付的重要實踐。本文將探討CI/CD的基本概念,介紹市場上的主流工具,並提供實施這一流程的指南和最佳實踐。
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp
Thumbnail
本文探討了複利效應的重要性,並藉由巴菲特的投資理念,說明如何選擇穩定產生正報酬的資產及長期持有的核心理念。透過定期定額的投資方式,不僅能減少情緒影響,還能持續參與全球股市的發展。此外,文中介紹了使用國泰 Cube App 的便利性及低手續費,幫助投資者簡化投資流程,達成長期穩定增長的財務目標。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
避免 thread 競速(Race Condition)是多執行緒編程中常見的挑戰之一。 Race Condition 發生在多個執行緒同時訪問和修改共享資源時,因為執行緒之間的執行順序無法預測,可能會導致數據的不一致性或意外行為。 本文主要介紹如何使用Lock來避免此狀況出現。 首先先看沒
“所有人寫的程式會變成指令 每一道指令是由CPU執行 而CPU所能理解的指令類型有限”
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
Thumbnail
在IT世界中,持續整合(CI)和持續部署(CD)已成為提高開發效率和確保高質量軟件交付的重要實踐。本文將探討CI/CD的基本概念,介紹市場上的主流工具,並提供實施這一流程的指南和最佳實踐。
※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
Thumbnail
本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
Thumbnail
Websocket是一種網路傳輸的協定,讓建立一次handshake的過程就可以相互傳遞資料,而非同步的過程能夠讓處理事情更有效率,這篇文章將帶你深入瞭解Websocket如何運作、以及其特點與優勢。
Thumbnail
關於多執行緒/多行程的使用方式 在Python 3.2版本之後加入了「concurrent.futures」啟動平行任務, 它可以更好的讓我們管理多執行緒/多行程的應用場景,讓我們在面對這種併發問題時可以不必害怕, 用一個非常簡單的方式就能夠處裡, 底下我們將為您展示一段程式碼: imp