03-4. Shared Memory(共享記憶體) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 深入理解 Shared Memory 這種最快的 IPC 方式,學習如何在多個 Process 間安全地共享資料。
🤔 什麼是 Shared Memory? Shared Memory(共享記憶體) = 多個 Process 共用同一塊記憶體區域
一句話解釋: 讓多個獨立的 Process 直接存取同一塊記憶體,避免資料複製,是最快的 IPC 方式。
🏢 用辦公室來比喻 普通 IPC(Pipe、Queue) Process A 辦公室 Process B 辦公室 ├─ 文件 A ├─ 文件 B(複製的) │ │ └──→ 傳真機 ──→ 傳真機 ──┘ 每次溝通都要複製文件(慢、耗資源)Shared Memory Process A 辦公室 Process B 辦公室 ├─ 員工 ├─ 員工 │ │ └──→ 共用雲端硬碟 ←──────┘ (同一份檔案) 兩邊直接存取同一份檔案(快、高效) 但需要鎖定機制避免衝突 💻 Shared Memory 原理 記憶體佈局對比 普通 Process(獨立記憶體) Process A (PID 1001) Process B (PID 1002) ├─ Code Segment ├─ Code Segment ├─ Data: counter = 0 ├─ Data: counter = 0(獨立副本) ├─ Heap ├─ Heap └─ Stack └─ Stack 無法直接共享資料Shared Memory Process A (PID 1001) Process B (PID 1002) ├─ Code Segment ├─ Code Segment ├─ Data ├─ Data ├─ Heap ├─ Heap │ └─ 指向共享記憶體 │ └─ 指向共享記憶體 └─ Stack └─ Stack ↓ ↓ └──→ Shared Memory ←─────────┘ counter = 100 兩個 Process 存取同一塊記憶體 1️⃣ Python Shared Memory 基礎 Value:共享單一值 from multiprocessing import Process, Value import time def increment(shared_value, name): """增加共享值""" for _ in range(5): shared_value.
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
03-5. Socket 通訊 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 掌握 Socket 這種最靈活的 IPC 方式,學習如何使用 TCP/UDP 進行 Process 間通訊,甚至跨網路通訊。
🤔 什麼是 Socket? Socket(套接字) = 網路通訊的端點
一句話解釋: Socket 是一種通訊介面,讓 Process 能夠透過網路協定(TCP/UDP)互相傳遞資料,可用於本機或跨機器通訊。
🏢 用通訊方式比喻 Pipe/Queue = 內線電話 同一棟大樓內的兩個辦公室 ├─ 辦公室 A ──→ 內線 ──→ 辦公室 B └─ 只能在同一棟樓使用Socket = 手機/網路電話 不同地點的辦公室 ├─ 台北辦公室 ──→ 網路 ──→ 高雄辦公室 ├─ 可以跨城市、跨國家 └─ 使用標準化協定(TCP/UDP) 💻 Socket 基礎概念 TCP vs UDP 特性 TCP UDP 連線方式 面向連線 無連線 可靠性 可靠(保證送達) 不可靠(可能遺失) 速度 較慢 較快 順序 保證順序 不保證順序 適用場景 HTTP、檔案傳輸 影片串流、遊戲 Socket 通訊流程 TCP 流程 Server Client │ │ │ 1.
04-1. Thread Safety 基礎概念 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)
🤔 什麼是 Thread Safety? 一句話解釋: Thread Safety(線程安全)是指多個 Thread 同時存取共享資源時,程式仍能正確執行,不會產生錯誤結果。
🏢 用銀行帳戶來比喻 不安全的情況 銀行帳戶:餘額 = 1000 元 時間 T0: ├─ 員工 A(Thread A): 讀取餘額 = 1000 └─ 員工 B(Thread B): 讀取餘額 = 1000 時間 T1: ├─ 員工 A: 存入 100 → 計算 1000 + 100 = 1100 └─ 員工 B: 提取 50 → 計算 1000 - 50 = 950 時間 T2: ├─ 員工 A: 寫入 1100 └─ 員工 B: 寫入 950 最終餘額: 950 ← 錯誤!應該是 1050這就是 Thread Safety 問題!
04-2. Race Condition(競態條件) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 深入理解 Race Condition 的成因、識別方法、影響,以及如何預防和解決這個最常見的 Thread Safety 問題。
🤔 什麼是 Race Condition? Race Condition(競態條件) = 多個 Thread「競賽」存取共享資源,結果取決於執行順序
一句話解釋: 當程式的執行結果取決於 Thread 的執行順序或時機,而這個順序是不可預測的,就發生了 Race Condition。
🏃 用賽跑來比喻 正常的賽跑(無共享資源) 跑者 A ────────→ 終點 A 跑者 B ────────→ 終點 B 各自跑各自的道,互不干擾Race Condition(共享資源) 跑者 A ─┐ ├──→ 同一個計分板 ← 誰先到誰寫入 跑者 B ─┘ 問題: - A 看到分數 = 0,準備寫入 1 - B 看到分數 = 0,準備寫入 1 - A 寫入 1 - B 寫入 1(覆蓋了 A 的結果) - 最終分數 = 1(應該是 2!) 💻 經典 Race Condition 案例 案例 1:計數器問題 from threading import Thread import time counter = 0 def increment(): global counter for _ in range(100000): # 這不是原子操作! counter += 1 # 創建兩個 Thread t1 = Thread(target=increment) t2 = Thread(target=increment) t1.
04-3. Deadlock(死鎖) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 深入理解 Deadlock 的成因、必要條件、檢測與預防方法,學習如何避免這個可能導致程式完全卡死的嚴重問題。
🤔 什麼是 Deadlock? Deadlock(死鎖) = 多個 Thread 互相等待對方釋放資源,導致所有 Thread 永遠阻塞
一句話解釋: 當兩個或多個 Thread 互相等待對方持有的資源,而誰都無法繼續執行,就發生了 Deadlock。
🚗 用十字路口來比喻 經典的十字路口 Deadlock ↑ 車 C │ 車 B ←──┼──→ 車 D │ ↓ 車 A 狀況: - 車 A 等車 B 離開 - 車 B 等車 C 離開 - 車 C 等車 D 離開 - 車 D 等車 A 離開 結果:所有車都動不了!這就是 Deadlock 💻 經典 Deadlock 案例 案例 1:哲學家就餐問題 from threading import Thread, Lock import time # 5 支筷子(Lock) chopsticks = [Lock() for _ in range(5)] def philosopher(philosopher_id): """哲學家進餐""" left = philosopher_id right = (philosopher_id + 1) % 5 print(f"哲學家 {philosopher_id} 開始思考") time.
04-4. Lock / Mutex / Semaphore 完整指南 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 完整掌握 Lock、Mutex、Semaphore 等同步機制的原理、用法、差異及最佳實踐,學會選擇最適合的同步工具。
🤔 同步機制概覽 同步機制是用來協調多個 Thread 存取共享資源的工具,防止 Race Condition 和 Deadlock。
同步機制家族 ├─ Lock(鎖) │ ├─ Mutex(互斥鎖) │ └─ RLock(可重入鎖) ├─ Semaphore(信號量) │ ├─ Binary Semaphore(二元信號量) │ └─ Counting Semaphore(計數信號量) ├─ Event(事件) ├─ Condition(條件變數) └─ Barrier(屏障) 1️⃣ Lock(互斥鎖 / Mutex) 基本概念 Lock = 互斥鎖(Mutual Exclusion Lock)
from threading import Lock lock = Lock() # 臨界區(Critical Section) lock.