區別:1、執行緒是程式執行的最小單位,而行程是作業系統分配資源的最小單位。 2、一個行程由一個或多個執行緒組成,執行緒是一個行程中程式碼的不同執行路線。 3.線程上下文切換比進程上下文切換快得多。 4.行程切換需要的資源很最大,效率很低;執行緒切換需要的資源一般,效率一般。 5.進程擁有自己的堆疊,進程之間不共享堆疊;執行緒擁有自己的棧,共享堆。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
進程
一個行程可以有一個或多個執行緒在各個執行緒之間共享程式的記憶體空間
大部分作業系統(Windows、Linux)的任務排程採用
時間片輪替的搶佔式排程方式透過查看線程列表決定接下來執行哪一個線程
然後從記憶體中恢復該執行緒的暫存器,最後恢復該執行緒的執行,從而去執行下一個任務
執行緒擁有自己的棧,共享堆,也是由作業系統調度
是指在一個處理器上集成了多個運算核心從而提高運算能力。也就是有多個真正平行運算的處理核心,每個處理核心對應一個核心執行緒。
四核心處理器對應四個核心執行緒核心執行緒(Kernel Thread,KLT)就是直接由作業系統核心支援的執行緒。該線程由核心來完成線程切換,核心透過操作調度器對線程進行調度,並負責將線程的任務映射到各個處理器上。
超執行緒技術
超執行緒技術將一個
物理處理核心模擬成兩個邏輯處理核心,也就是兩個核心執行緒。
所以我們看到的電腦通常都是雙核心四線程、四核心八線程。#傳統應用程式中一般有會為網路請求建立一個執行緒去完成業務邏輯。如果是多個請求,就會建立多個執行緒來出來。
如果遇到很耗時的I/O行為,執行緒就會一直處於阻塞狀態,如果很多執行緒都是出於這種空閒狀態(等待該執行緒執行完成才能執行),這樣就會造成資源應用不徹底,系統的吞吐能力下降。
最常見的很耗時的I/O行為例如JDBC,CPU會一直等待資料I/O操作的返回,這時執行緒根本沒有利用CPU去做運算,而是處於空閒狀態。同時使用過多的線程,也會帶來更多的上下文切換開銷。
解決上述問題有兩個方案:
協程的流程:
當出現I/O阻塞的時候,由協程的調度器進行調度
透過將資料流立刻yield掉(主動讓出),並記錄目前堆疊上的資料
阻塞完成後立刻在透過執行緒恢復棧,並把阻塞的結果放到這個執行緒上去跑
而跑在由Coroutine
負責調度的執行緒稱為Fiber
,例如Golang裡的go
關鍵字其實就是負責開啟一個Fiber
,讓func
邏輯跑在上面。
由於協程的暫停完全由程式控制,發生在使用者狀態上;而執行緒的阻塞狀態是由作業系統核心來進行切換,發生在核心狀態上。
因此協程的開銷遠小於線程,也就沒有上下文切換的開銷。
比較項目 | 執行緒 | 協程 |
---|---|---|
佔用資源 | #初始單位為1MB,固定不可變 | 初始一般為2KB ,可隨需要增加 |
調度所屬 | 有OS核心完成 | 由使用者完成 |
切換開銷 | 設計模式切換(從用戶態切換到核心狀態),16個暫存器、PC、SP等暫存器的刷新 | 只有三個暫存器的值修改:PC、SP 、DX |
效能問題 | 資源佔用太高,頻繁建立銷毀會帶來嚴重的效能問題 | 資源佔用小,不會帶來嚴重的效能問題 |
資料同步 | 需要鎖定等機制確保資料的一致性和可見性 | 不需要多執行緒的鎖定機制,因此只有一個線程。也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比線程高很多 |
以上是go語言中執行緒和進程的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!