前面我們談完Process,接下來我們來說Thread~~~
Process是一個正在執行的程式,是作業系統資源分配的基本單位。每個 Process 都擁有獨立的記憶體空間、開啟的檔案描述符、程式計數器、暫存器狀態等。而Thread(執行緒)是一個 Process 內部的更小執行單位,負責實際執行指令流程。它們共享同一個 Process 的資源(例如記憶體、開啟檔案、全域變數),但有自己獨立的堆疊(Stack)和程式計數器(PC)。
Process(行程)就像是一場比賽:一個比賽就佔用整個操場(CPU)。
Thread(執行緒)就是比賽中的選手:一場比賽可以只有一位選手,也可以有很多選手同時跑不同的賽道。
所以說,一個Thread裡面包含:
單一執行緒 vs 多執行緒如下表所示:
現在我們在買電腦時,CPU當中強調的8核心、16核心,其實這些核心,就是同時幫你做事的小幫手們。那如果你只派給他們一個任務,其實就相當于浪費掉很多CPU的效能。
在此之前,我們先搞懂兩個重要名詞:
這邊用兩張恐龍本的圖來表示一下~~
第一張是單核心上的併發(看似同時,實則輪流)
第二張是多核心上的平行處理(真的同時跑)
噗呲,J個也算硬插進來的話題,也是被問到不知道怎麼說ww
Multicore Programming(多核心程式設計)是屬於硬體與排程層面的問題。指程式設計時考慮到硬體中存在多個 CPU 核心 (Core),嘗試有效分配運算到不同核心,實現真正的平行處理(parallelism)。J個是涉及 thread binding、cache coherence、核心負載平衡等。
而Multithreaded Programming(多執行緒程式設計)是屬於程式設計層面的概念。指一個程式內部啟動多個Thread同時工作。這些Thread可能Concurrency,也可能Parallelism。總之就是來提升效率、資源共享、回應速度。Multithreaded的好處如下:
然而,理想是美好,現實總是骨感的。我們就來談談Multithreaded常見的五大挑戰:
第一,任務分解(Identifying Tasks)。我們需要把程序(Process)拆成多個小任務(thread),而且這些任務要能獨立執行才行。
第二,Process拆分後,就會需要考量每一個Thread的工作平衡(Balance):每個 thread 工作量要平均,不能一人爆肝、別人耍廢。否則會出現「其中一核心超忙,其他核心閒到發呆」的情況。
第三,資料切分(Data Splitting):不只任務要分,資料也要分!讓每個核心各處理自己的那一塊,減少互搶資源。
第四,資料相依(Data Dependency):如果 thread A 需要 thread B 的結果,那 A 就得等 B,這會讓平行變「卡頓」。這種「你等我我等你」的情況,要靠同步機制來處理。
第五,測試與除錯(Testing & Debugging):多執行緒的錯誤難抓!bug 可能只在某個時間點、某個執行順序才出現,叫做「難以重現的地雷」。測試與除錯會比單執行緒程式更複雜。
希望這樣有幫助大家對於名詞解釋有更深的理解~