欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang協(xié)程與線程區(qū)別簡要介紹

 更新時(shí)間:2022年06月29日 09:30:49   作者:??ysj????  
這篇文章主要介紹了golang協(xié)程與線程區(qū)別簡要介紹,進(jìn)程是操作系統(tǒng)資源分配的基本單位,是程序運(yùn)行的實(shí)例,線程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位

一、進(jìn)程與線程

進(jìn)程是操作系統(tǒng)資源分配的基本單位,是程序運(yùn)行的實(shí)例。例如打開一個(gè)瀏覽器就開啟了一個(gè)進(jìn)程。

線程是操作系統(tǒng)調(diào)度到CPU中執(zhí)行的基本單位。例如在瀏覽器里新建一個(gè)窗口就需要一個(gè)線程來進(jìn)行處理。

在一般情況下,線程是進(jìn)程的組成部分,一個(gè)進(jìn)程可以包含多個(gè)線程。例如瀏覽器可以新建多個(gè)窗口。

進(jìn)程中的多個(gè)線程并發(fā)執(zhí)行并共享進(jìn)程的內(nèi)存等資源。例如多個(gè)窗口之間可以共享登錄狀態(tài)、cookie等信息。

進(jìn)程之間相對(duì)獨(dú)立,不同進(jìn)程具有不同的內(nèi)存地址空間,系統(tǒng)資源描述符等。例如再新開一個(gè)瀏覽器,就又開啟了一個(gè)進(jìn)程,瀏覽器之間狀態(tài)相互獨(dú)立。

開啟一個(gè)進(jìn)程的開銷比開啟一個(gè)線程大得多,且進(jìn)程具有獨(dú)立的內(nèi)存空間,多進(jìn)程之間的通信通常比較困難。

二、并發(fā)與并行

并發(fā)不等于并行。

并發(fā)并不意味著同一時(shí)刻所有任務(wù)都在執(zhí)行,而是在一個(gè)時(shí)間段內(nèi),所有的任務(wù)都能執(zhí)行完畢。例如在單核CPU上運(yùn)行多線程程序,多線程會(huì)交替搶占CPU時(shí)間片,任意一個(gè)時(shí)刻只能執(zhí)行一個(gè)具體的線程。

在多核CPU上,線程可以分布在多個(gè)CPU核心上運(yùn)行,實(shí)現(xiàn)真正的并行處理。

在多核處理場景中,并發(fā)與并行往往同時(shí)存在,多核心在并行處理多個(gè)線程,單核心中的多個(gè)線程又在交替執(zhí)行。

三、go協(xié)程與線程

線程是系統(tǒng)調(diào)度的基本單位。go協(xié)程由go語言運(yùn)行時(shí)的調(diào)度器進(jìn)行調(diào)度,操作系統(tǒng)內(nèi)核感知不到協(xié)程的存在。

在多核處理場景中,線程是并發(fā)與并行同時(shí)存在的,而go協(xié)程依托于線程,因此多核處理場景下,go協(xié)程也是并發(fā)與并行同時(shí)存在的。因?yàn)間o協(xié)程從屬于某一個(gè)線程,所以即便在單核處理器上某一時(shí)刻運(yùn)行一個(gè)線程,在線程內(nèi)go語言調(diào)度器也會(huì)切換多個(gè)協(xié)程執(zhí)行,這時(shí)協(xié)程是并發(fā)的。在多核心處理器上,如果多個(gè)協(xié)程被分配給了不同的線程,而這些線程同時(shí)被不同的CPU核心所處理,這時(shí)協(xié)程就是并行處理的。

go協(xié)程與線程存在著很多不同之處:

1.調(diào)度方式

線程: 線程是根據(jù)CPU時(shí)間片進(jìn)行搶占式調(diào)度的。操作系統(tǒng)通過中斷信號(hào)(定時(shí)器中斷、I/O設(shè)備中斷等)執(zhí)行線程的上下文切換。當(dāng)發(fā)生線程上下文切換時(shí),需要從操作系統(tǒng)用戶態(tài)轉(zhuǎn)移到內(nèi)核態(tài),并保存狀態(tài)信息;當(dāng)切換到下一個(gè)要執(zhí)行的線程時(shí),需要加載狀態(tài)信息并從內(nèi)核態(tài)轉(zhuǎn)移到操作系統(tǒng)用戶態(tài)。

協(xié)程: 協(xié)程存在于用戶態(tài),由go語言運(yùn)行時(shí)調(diào)度器進(jìn)行調(diào)度。協(xié)程從屬于某一個(gè)線程,多個(gè)協(xié)程可以調(diào)度到一個(gè)線程中,一個(gè)協(xié)程也可能切換到多個(gè)線程中執(zhí)行,因此協(xié)程與線程是多對(duì)多(M:N)的關(guān)系。

2.調(diào)度策略

  • 線程搶占式調(diào)度。操作系統(tǒng)調(diào)度器為了均衡每個(gè)線程的執(zhí)行周期,會(huì)定時(shí)發(fā)出中斷信號(hào)強(qiáng)制執(zhí)行線程上下文切換。
  • 協(xié)程協(xié)作式調(diào)度。一個(gè)協(xié)程處理完自己的任務(wù)后,可以主動(dòng)將執(zhí)行權(quán)限讓渡給其他協(xié)程,不會(huì)被輕易搶占。只有在協(xié)程運(yùn)行了過長時(shí)間后,go語言調(diào)度器才會(huì)強(qiáng)制搶占其執(zhí)行。

3.上下文切換速度

線程: 線程上下文的切換需要經(jīng)過操作系統(tǒng)用戶態(tài)與內(nèi)核態(tài)的切換,切換速度大約為1~2微秒。

協(xié)程: 協(xié)程屬于用戶態(tài)輕量級(jí)的線程,協(xié)程的切換不需要經(jīng)過用戶態(tài)與內(nèi)核態(tài)的切換,且切換時(shí)只需要保存極少的狀態(tài)值,因此切換速度快數(shù)倍,大約為0.2微秒左右。(大約10倍于線程的切換速度)

4.棧的大小

線程: 線程的棧大小一般是在創(chuàng)建時(shí)指定的,linux及mac上默認(rèn)的棧大小一般為8MB(可以通過ulimit -s查看)。2000個(gè)線程需要消耗16G虛擬內(nèi)存。

協(xié)程: go協(xié)程棧大小默認(rèn)為2KB, 16G虛擬內(nèi)存可以創(chuàng)建800多萬個(gè)協(xié)程。在實(shí)踐中,經(jīng)常可以看到存在成千上萬的協(xié)程。

四、GMP模型

協(xié)程(G)線程(M)邏輯處理器(P)模型描述了線程與協(xié)程的關(guān)系。在GMP模型中:

G代表go協(xié)程(Goroutine),M代表實(shí)際的線程,P代表邏輯處理器(Process)。go語言為了方便協(xié)程的調(diào)度與緩存,抽象出了邏輯處理器P。

在任一時(shí)刻,一個(gè)邏輯處理器P可能在本地包含多個(gè)協(xié)程G,同時(shí)綁定一個(gè)線程M。需要注意的是,一個(gè)協(xié)程G并不是固定綁定同一個(gè)邏輯處理器P的,可能轉(zhuǎn)移到其他邏輯處理器中。

邏輯處理器P對(duì)應(yīng)的線程M也是不固定的,在某些時(shí)候可能轉(zhuǎn)移到其他P中執(zhí)行。

image.png

到此這篇關(guān)于golang協(xié)程與線程區(qū)別簡要介紹的文章就介紹到這了,更多相關(guān)golang協(xié)程與線程 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)

    Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn)

    這篇文章主要介紹了Go中time.RFC3339 時(shí)間格式化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用Go語言實(shí)現(xiàn)一個(gè)簡單的無界資源池

    使用Go語言實(shí)現(xiàn)一個(gè)簡單的無界資源池

    本文我們希望通過go語言實(shí)現(xiàn)一個(gè)簡單的資源池,而這個(gè)資源池的資源包括但不限于數(shù)據(jù)庫連接池,線程池,協(xié)程池,網(wǎng)絡(luò)連接池,只要這些資源實(shí)現(xiàn)我們指定的關(guān)閉方法,則都可以通過我們封裝的資源池進(jìn)行統(tǒng)一管理,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • 在Golang中使用C語言代碼實(shí)例

    在Golang中使用C語言代碼實(shí)例

    這篇文章主要介紹了在Golang中使用C語言代碼實(shí)例,本文先是給出了一個(gè)Hello World例子、Golang 引用 C例子,并總結(jié)了一些要注意的地方,需要的朋友可以參考下
    2014-10-10
  • Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫log/slog使用詳解

    Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫log/slog使用詳解

    這篇文章主要為大家介紹了Go?1.21.0?新增結(jié)構(gòu)化日志記錄標(biāo)準(zhǔn)庫log/slog使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 一起聊聊Go語言中的語法糖的使用

    一起聊聊Go語言中的語法糖的使用

    語法糖通常是用來簡化代碼編寫的,特性就是使用語法糖前后編譯的結(jié)果是相同的。這篇文章主要就來和大家一起聊聊Go語言中的語法糖的實(shí)現(xiàn)
    2022-07-07
  • 實(shí)用的Go語言開發(fā)工具及使用示例

    實(shí)用的Go語言開發(fā)工具及使用示例

    這篇文章主要為大家介紹了實(shí)用的Go語言開發(fā)工具及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go grpc安裝使用教程

    go grpc安裝使用教程

    gRPC是由Google主導(dǎo)開發(fā)的RPC框架,使用HTTP/2協(xié)議并用ProtoBuf作為序列化工具。這篇文章主要介紹了go grpc安裝使用教程,需要的朋友可以參考下
    2018-02-02
  • gRPC超時(shí)攔截器實(shí)現(xiàn)示例

    gRPC超時(shí)攔截器實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了gRPC超時(shí)攔截器實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一文解析 Golang sync.Once 用法及原理

    一文解析 Golang sync.Once 用法及原理

    這篇文章主要介紹了一文解析 Golang sync.Once 用法及原理,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Golang并發(fā)控制的三種實(shí)現(xiàn)方法

    Golang并發(fā)控制的三種實(shí)現(xiàn)方法

    在Golang中,有多種方式可以進(jìn)行并發(fā)控制,本文詳細(xì)的介紹了三種實(shí)現(xiàn)方法,Channel優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,清晰易懂,WaitGroup優(yōu)點(diǎn)是子協(xié)程個(gè)數(shù)動(dòng)態(tài)可調(diào)整,Context 優(yōu)點(diǎn)是對(duì)子協(xié)程派生出來的孫子協(xié)程的控制,缺點(diǎn)是相對(duì)而言的,要結(jié)合實(shí)例應(yīng)用場景進(jìn)行選擇
    2023-08-08

最新評(píng)論