日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Go 協(xié)程為什么比進程和線程占用的系統(tǒng)資源低?

01 、介紹

進程是一個可執(zhí)行程序在運行時的一塊獨立的虛擬內存[1]空間,Linux 給每個進程分配一個虛擬內存空間,包括??臻g、未使用內存、堆空間、BSS、DATA、TEXT 等。

線程可以理解為輕量級進程,多個線程“寄生”在一個進程中,每個線程有獨立的??臻g,其它虛擬內存空間,多個線程共享,所以線程之間通信比較簡單,也就是說線程之間可以通過共享內存通信。

進程和線程都是 CPU 的一個執(zhí)行單元,在內核態(tài)切換,切換成本較高。

協(xié)程是用戶態(tài)的一個偽執(zhí)行單元,在用戶態(tài)切換執(zhí)行流程,切換成本較低。

02、切換執(zhí)行單元的成本

我們通過介紹線程和協(xié)程的切換流程,講述為什么在內核態(tài)切換的成本較高,而在用戶態(tài)切換的成本較低?

因為進程和線程都是內核態(tài)切換,并且進程切換成本比線程切換成本更高,所以只介紹線程切換和協(xié)程切換的切換成本。

內核態(tài)切換 - 線程

在了解線程在內核態(tài)切換之前,我們先了解一下什么是 CPU 時間片[2],在操作系統(tǒng)中,我們會安裝很多軟件,并且我們會同時使用多個軟件,而 CPU 資源有限。

為了讓多個軟件可以在操作系統(tǒng)中同時運行,CPU 分成一個個的時間片,在每個時間片中運行一個軟件的一個線程,因為時間片非常短,所以我們會感覺多個軟件在同時運行。

在編寫代碼時,我們?yōu)榱丝梢宰尦绦虮环峙涞礁嗟?CPU 資源,可以多創(chuàng)建一些線程,用于提升程序運行的效率。需要注意的是,線程并不是創(chuàng)建越多越好。

因為 CPU 在內核態(tài)切換執(zhí)行單元(線程)時,會有時間成本,在進行切換執(zhí)行單元時,需要保存寄存器中的數(shù)據(jù),將原執(zhí)行單元的狀態(tài)保存,切換操作也會占用 CPU 資源(時間片),從而減少了供線程運行的 CPU 資源(時間片)。

除了時間成本之外,還會有性能開銷,系統(tǒng)內核調度線程,需要用戶空間和內核空間切換,因為只有擁有最高權限的內核空間才可以調度線程,限于篇幅,我們不再展開敘述。

用戶態(tài)切換 - 協(xié)程

因為通過創(chuàng)建線程(執(zhí)行單元),為程序爭取更多的 CPU 資源,在線程切換時也會浪費 CPU 資源(時間成本),所以可以將執(zhí)行單元不再在內核態(tài)運行,改為在用戶態(tài)運行,也就是協(xié)程。

協(xié)程的切換成本較低,是因為切換比較簡單,并且是在用戶態(tài)進行切換,切換的時間成本較低(納秒級),只需將當前協(xié)程的 CPU 寄存器的狀態(tài)先保存起來,然后將需要 CPU 資源的協(xié)程的 CPU 寄存器的狀態(tài)加載到 CPU 寄存器中。

關于 Go 協(xié)程的調度,我們在之前的文章中介紹過,此處不再贅述。

03 、內存占用

除了 CPU 資源有限之外,內存資源也是有限的,所以我們還需要了解進程、線程、協(xié)程的內存占用。

讀者朋友們應該知道 32 位操作系統(tǒng)只支持 4G 內存的內存條,這是因為進程在 32 位操作系統(tǒng)中最多只能占用 4G 內存,而在 64 位操作系統(tǒng)中可以占用更多內存。

線程占用內存一般是 10MB,不同的操作系統(tǒng)版本之間有些差異,區(qū)間在 4M - 64M。

協(xié)程占用內存最小,一個協(xié)程占用 2KB 左右的內存。

04 、總結

本文我們主要介紹為什么 Go 協(xié)程比進程和線程占用的系統(tǒng)資源低,通過進程、線程、協(xié)程的 CPU 資源和內存占用的比較,發(fā)現(xiàn)無論是在切換時消耗的 CPU 資源(時間片),還是內存占用,Go 協(xié)程都有明顯優(yōu)勢。

一句話總結就是 Go 協(xié)程的切換成本和內存占用比線程和進程都低。

需要注意的是,Go 協(xié)程占用系統(tǒng)資源低,并不代表可以無限創(chuàng)建 Go 協(xié)程。

參考資料

  1. http://www.cs.rpi.edu/academics/courses/fall04/os/c12/
  2. https://www.geeksforgeeks.org/time-slicing-in-cpu-scheduling/

新聞標題:Go 協(xié)程為什么比進程和線程占用的系統(tǒng)資源低?
標題URL:http://m.5511xx.com/article/dpsgjeh.html