Skip to main content

Command Palette

Search for a command to run...

行程 Process & 執行緒 Thread & 微執行緒 Coroutine

持續更新

Published

I am not a programmer just a leaner. Writing JavaScript, Python, and Go and doing something on Kubernetes.

行程 Process & 執行緒 Thread & 微執行緒 Coroutine 的關係

我個人是覺得可以想像成 Process 是公司,不同公司是各自獨立的,有各自的資源,例如營業額、土地、廠房。但是彼此也可以相互的合作。可以轉職跳換不同的公司,但是其耗費的成本就比較高。Thread 就是公司間的各部門,一間公司由一個或多個部門所組成。部門間的轉換相對容易,且共享這一間公司的所有資源。Coroutine 則可以視為部門中的成員,可以視為已經是最小的執行單位。

什麼是行程 Process

In computing, a process is the instance of a computer program that is being executed by one or many threads. -- Wikipedia

可以把 Process 看作是一個包含一個或多個 Thread 的容器,執行程式的 Instance。Process 之間彼此獨立有各自的地址空間,會有各自的 CPU Time、Memory、Disk 等。再細分的話又可以分為 Kernel Process & User Process。

因為 Process 是各自獨立的,所以可以達到 Parallel。

Process 會用不同的 state 來記錄其狀態。

  • new (新產生):該進程正在產生中
  • ready (就緒):該進程正在等待 CPU 分配資源,只要一拿到資源就可以馬上執行
  • running (執行):該進程取得 CPU 資源並且執行中
  • waiting (等待):該進程在等待某個事件的發生,可能是等待 I/O 設備輸入輸出完成或者是接收到一個信號,也可以想成是被 block (阻塞) 住
  • exit (結束):該進程完成工作,將資源釋放掉

Pros and Cons

Pros

彼此獨立可以忽略 Race condition 的問題。

Cons

進程的建立及切換(context switch)的性能開銷比較大,因為涉及到 OS 資源的切換,彼此間要通信也比較複雜及耗時。

什麼是執行緒 Thread

In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system. The implementation of threads and processes differs between operating systems, but in most cases a thread is a component of a process. -- Wikipedia

每一個 Thread 負責某一項功能,同一個 Process 底下的 Thread 共享資源,如記憶體、變數等。

Multithread

在多執行緒中,執行緒屬於同步機制,在同時間運行的執行緒,若執行緒間同時存取或修改全域變數,則容易發生同步問題(Race condition)。若執行緒之間互搶資源,則可能產生死結(Deadlock)。因為是共享資源的方式,所以需要記住 Multithread 是 Concurrent 而不是 Parallel。

Thread Pool

什麼是微執行緒 Coroutine

Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed. -- Wikipedia

Coroutine 的概念,在 1958 年由 Melvin Edward Conway 提出。一種類似多執行緒的單執行緒程式概念,且可以避開多執行緒的 Race condition 問題,因為他是單執行緒不會有第二個執行緒來搶著操作。

Coroutine 屬於非同步機制,在執行過程擁有自己的上下文,同時具有可暫時儲存上下文的機制,當一個 Coroutine 儲存後,執行完其他任務可在重新進入,並且從上一次執行的狀態繼續進行。這樣的功能讓程式可以達到分段執行。

Coroutine 的調度完全由使用者控制,Process 和 Thread 的調用都是依照了 CPU 內的演算法去操作,屬於搶占式調度,可以主動搶奪執行的控制權。Coroutine 是不行的,只能進行非搶佔式的調度。

結語

Process & Thread 的執行會牽扯到 Concurrent & Parallel 的概念。然後 Thread 和 Coroutine 的執行概念可以延伸到同步與非同步的概念,可以參考 JavaScript 中的 Event Loop 或是 JavaScript 和 Python 中的 async/await

延伸閱讀

Operating System

Part 1 of 1

A series about Operating System

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.