自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 協(xié)程為什么比進(jìn)程和線程占用的系統(tǒng)資源低?

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

01 、介紹

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

線程可以理解為輕量級(jí)進(jìn)程,多個(gè)線程“寄生”在一個(gè)進(jìn)程中,每個(gè)線程有獨(dú)立的棧空間,其它虛擬內(nèi)存空間,多個(gè)線程共享,所以線程之間通信比較簡(jiǎn)單,也就是說(shuō)線程之間可以通過(guò)共享內(nèi)存通信。

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

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

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

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

因?yàn)檫M(jìn)程和線程都是內(nèi)核態(tài)切換,并且進(jìn)程切換成本比線程切換成本更高,所以只介紹線程切換和協(xié)程切換的切換成本。

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

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

為了讓多個(gè)軟件可以在操作系統(tǒng)中同時(shí)運(yùn)行,CPU 分成一個(gè)個(gè)的時(shí)間片,在每個(gè)時(shí)間片中運(yùn)行一個(gè)軟件的一個(gè)線程,因?yàn)闀r(shí)間片非常短,所以我們會(huì)感覺(jué)多個(gè)軟件在同時(shí)運(yùn)行。

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

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

除了時(shí)間成本之外,還會(huì)有性能開銷,系統(tǒng)內(nèi)核調(diào)度線程,需要用戶空間和內(nèi)核空間切換,因?yàn)橹挥袚碛凶罡邫?quán)限的內(nèi)核空間才可以調(diào)度線程,限于篇幅,我們不再展開敘述。

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

因?yàn)橥ㄟ^(guò)創(chuàng)建線程(執(zhí)行單元),為程序爭(zhēng)取更多的 CPU 資源,在線程切換時(shí)也會(huì)浪費(fèi) CPU 資源(時(shí)間成本),所以可以將執(zhí)行單元不再在內(nèi)核態(tài)運(yùn)行,改為在用戶態(tài)運(yùn)行,也就是協(xié)程。

協(xié)程的切換成本較低,是因?yàn)榍袚Q比較簡(jiǎn)單,并且是在用戶態(tài)進(jìn)行切換,切換的時(shí)間成本較低(納秒級(jí)),只需將當(dāng)前協(xié)程的 CPU 寄存器的狀態(tài)先保存起來(lái),然后將需要 CPU 資源的協(xié)程的 CPU 寄存器的狀態(tài)加載到 CPU 寄存器中。

關(guān)于 Go 協(xié)程的調(diào)度,我們?cè)谥暗奈恼轮薪榻B過(guò),此處不再贅述。

03 、內(nèi)存占用

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

讀者朋友們應(yīng)該知道 32 位操作系統(tǒng)只支持 4G 內(nèi)存的內(nèi)存條,這是因?yàn)檫M(jìn)程在 32 位操作系統(tǒng)中最多只能占用 4G 內(nèi)存,而在 64 位操作系統(tǒng)中可以占用更多內(nèi)存。

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

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

04 、總結(jié)

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

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

需要注意的是,Go 協(xié)程占用系統(tǒng)資源低,并不代表可以無(wú)限創(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/
責(zé)任編輯:武曉燕 來(lái)源: Golang語(yǔ)言開發(fā)棧
相關(guān)推薦

2021-04-25 09:36:20

Go協(xié)程線程

2020-11-29 17:03:08

進(jìn)程線程協(xié)程

2011-08-08 16:27:39

ProcessTame進(jìn)程

2022-10-28 10:45:22

Go協(xié)程GoFrame

2023-10-12 09:46:00

并發(fā)模型線程

2020-04-07 11:10:30

Python數(shù)據(jù)線程

2020-08-04 10:56:09

進(jìn)程線程協(xié)程

2024-12-03 15:15:22

2025-02-28 09:04:08

2009-08-17 15:55:32

ASP.NET緩存

2020-06-19 08:01:48

Kotlin 協(xié)程編程

2016-10-28 17:39:47

phpgolangcoroutine

2012-04-24 16:23:28

Win7

2022-02-06 23:54:46

Windows 11Windows微軟

2022-04-19 20:39:03

協(xié)程多進(jìn)程

2024-06-27 07:56:49

2022-01-24 16:17:26

htop工具Linux

2018-12-04 14:00:41

協(xié)程編程模式PHP

2023-11-29 08:02:16

線程進(jìn)程

2021-11-27 05:00:43

線程邏輯地址
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)