中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言中線程和進程的區別有哪些

發布時間:2022-12-28 13:46:35 來源:億速云 閱讀:115 作者:iii 欄目:編程語言

這篇文章主要介紹“go語言中線程和進程的區別有哪些”,在日常操作中,相信很多人在go語言中線程和進程的區別有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go語言中線程和進程的區別有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

區別:1、線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位。2、一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線。3、線程上下文切換比進程上下文切換要快得多。4、進程切換需要的資源很最大,效率很低;線程切換需要的資源一般,效率一般。5、進程擁有自己的堆棧,進程之間不共享堆棧;線程擁有自己的棧,共享堆。

什么是線程、進程?

進程

  • 是一個具有一定獨立功能的程序在一個數據集上的一次動態執行過程

  • 是操作系統進行資源分配和調度的一個獨立單位

  • 是應用程序的運行的載體

線程

  • 線程是程序執行中一個單一的順序控制流程

  • 是程序執行流的最小單位

  • 是處理器調度和分配的基本單位

  • 一個進程可以有一個或多個線程

  • 各個線程之間共享程序的內存空間

任務調度

大部分操作系統(Windows、Linux)的任務調度采用時間片輪轉的搶占式調度方式
該調度方式如下:

  • 在一個進程中,當一個線程任務執行幾毫秒后,會由操作系統內核進行調度

  • 通過硬件的計數器中斷處理器,讓該線程強制暫停并將該線程的寄存器放入內存中

  • 通過查看線程列表決定接下來執行哪一個線程

  • 然后從內存中恢復該線程的寄存器,最后恢復該線程的執行,從而去執行下一個任務

這種方式保證了每個線程輪流執行,由于CPU的執行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在同時進行,這就是我們說的并發

go語言中線程和進程的區別有哪些

進程和線程的區別

  • 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位

  • 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線

  • 線程上下文切換比進程上下文切換要快得多

  • 進程切換需要的資源很最大,效率很低;線程切換需要的資源一般,效率一般。

  • 進程擁有自己的堆棧,進程之間不共享堆棧,由操作系統調度

    線程擁有自己的棧,共享堆,也是由操作系統調度

多線程和多核

多核處理器是指在一個處理器上集成了多個運算核心從而提高計算能力。也就是有多個真正并行計算的處理核心,每一個處理核心對應一個內核線程。

內核線程

每一個處理核心對應一個內核線程。
比如:

  • 單核處理器對應一個內核線程

  • 雙核處理器對應兩個內核線程

  • 四核處理器對應四個內核線程

內核線程(Kernel Thread,KLT)就是直接由操作系統內核支持的線程。該線程由內核來完成線程切換,內核通過操作調度器對線程進行調度,并負責將線程的任務映射到各個處理器上。

超線程技術

目前處理器都采用了超線程技術將一個 物理處理核心模擬成兩個邏輯處理核心,也就是兩個內核線程。
所以我們看到的電腦一般都是雙核四線程、四核八線程。
在操作系統中我們看到CPU數量是實際物理CPU數量的兩倍,如雙核四線程可以看到4CPU。

如我當前編寫文章的這臺mbp就是i7 6核12線程:

go語言中線程和進程的區別有哪些

程序一般不會直接使用內核線程,而是使用內核線程的一種高級接口—輕量級進程(Lightweight Process,LWP),也就是我們常說的線程

協程

協程(Coroutines)基于線程之上,比線程更加輕量級。一個線程可以擁有多個協程。

協程的目的

傳統應用中一般有會給網絡請求創建一個線程去完成業務邏輯。如果是多個請求,就會創建多個線程來出來。
如果遇到很耗時的I/O行為,線程就會一直處于阻塞狀態,如果很多線程都是出于這種空閑狀態(等待該線程執行完成才能執行),這樣就會造成資源應用不徹底,系統的吞吐能力下降。

最常見的很耗時的I/O行為比如JDBC,CPU會一直等待數據I/O操作的返回,這時線程根本沒有利用CPU去做運算,而是處于空閑狀態。同時使用過多的線程,也會帶來更多的上下文切換開銷。

解決上述問題有兩個方案:

  • 單線程加上異步回調
    比如Node.js、Java的Vert.x

  • 協程
    協程的目的就是當出現長時間I/O操作時,讓出當前的協程調度,執行下一個任務,來消除ContexSwith的開銷

協程的特點

  • 線程切換由操作系統負責調度,協程由用戶自己調度,因此減少了上下文切換,提高了效率

  • 線程默認Stack大小為1M,而協程更輕量,接近1K。因此可以在相同的內存中開啟更多的協程

  • 由于協程在同一線程上,因此可以避免競爭關系二使用鎖

  • 適用于被阻塞且需要大量并發的場景。但不適用于大量計算的多線程

協程的原理

協程的流程:

  • 當出現I/O阻塞的時候,由協程的調度器進行調度

  • 通過將數據流立刻yield掉(主動讓出),并記錄當前棧上的數據

  • 阻塞完成后立刻在通過線程恢復棧,并把阻塞的結果放到這個線程上去跑

而跑在由Coroutine負責調度的線程稱為Fiber,比如Golang里的go關鍵字其實就是負責開啟一個Fiber,讓func邏輯跑在上面。

由于協程的暫停完全由程序控制,發生在用戶態上;而線程的阻塞狀態是由操作系統內核來進行切換,發生在內核態上。
因此協程的開銷遠遠小于線程,也就沒有上下文切換的開銷。

線程和協程的比較

比較項線程協程
占用資源初始單位為1MB,固定不可變初始一般為2KB,可隨需要增大
調度所屬有OS內核完成由用戶完成
切換開銷設計模式切換(從用戶態切換到內核態),16個寄存器、PC、SP等寄存器的刷新只有三個寄存器的值修改:PC、SP、DX
性能問題資源占用太高,頻繁創建銷毀會帶來嚴重的性能問題資源占用小,不會帶來嚴重的性能問題
數據同步需要鎖等機制確保數據的一致性和可見性不需要多線程的鎖機制,因此只有一個線程。也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比線程高很多

到此,關于“go語言中線程和進程的區別有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红安县| 永福县| 怀来县| 普宁市| 湟中县| 嘉义市| 和硕县| 成都市| 浏阳市| 昌邑市| 丹江口市| 金山区| 吴忠市| 灵武市| 山东省| 吉安市| 五家渠市| 电白县| 南开区| 吴川市| 永宁县| 新干县| 安顺市| 赤峰市| 江北区| 德清县| 洛扎县| 石台县| 高邮市| 同仁县| 辽源市| 乐陵市| 河东区| 太湖县| 喀喇沁旗| 集安市| 吉木乃县| 石渠县| 泰兴市| 壶关县| 阳春市|