區別:1、執行緒是程式執行的最小單位,而行程是作業系統分配資源的最小單位。 2、一個行程由一個或多個執行緒組成,執行緒是一個行程中程式碼的不同執行路線。 3.線程上下文切換比進程上下文切換快得多。 4.行程切換需要的資源很最大,效率很低;執行緒切換需要的資源一般,效率一般。 5.進程擁有自己的堆疊,進程之間不共享堆疊;執行緒擁有自己的棧,共享堆。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
什麼是執行緒、行程?
進程
- 是一個具有一定#獨立功能的程式在一個資料集上的一次動態執行過程
- 是作業系統進行資源分配和調度的一個獨立單位
- 是應用程式的運作的載體
是處理器調度和分配的基本單位
一個行程可以有一個或多個執行緒在各個執行緒之間共享程式的記憶體空間
- 任務排程
-
大部分作業系統(Windows、Linux)的任務排程採用
時間片輪替的搶佔式排程方式 。 - 此調度方式如下:
- 在一個行程中,當一個執行緒任務執行幾毫秒後,會由作業系統核心進行調度
透過查看線程列表決定接下來執行哪一個線程
然後從記憶體中恢復該執行緒的暫存器,最後恢復該執行緒的執行,從而去執行下一個任務
這種方式保證了每個執行緒輪流執行,由於CPU的執行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在同時進行,這就是我們說的
並發- 。
- 程式與執行緒的差異
- 執行緒是程式執行的最小單位,而行程是作業系統分配資源的最小單位
- 一個行程由一個或多個執行緒組成,執行緒是一個行程中程式碼的不同執行路線 #執行緒上下文切換比行程上下文切換快得多
程式切換需要的資源很最大,效率很低;執行緒切換需要的資源一般,效率一般。
進程擁有自己的堆疊,進程之間不共享堆疊,由作業系統調度執行緒擁有自己的棧,共享堆,也是由作業系統調度
是指在一個處理器上集成了多個運算核心從而提高運算能力。也就是有多個真正平行運算的處理核心,每個處理核心對應一個核心執行緒。
- 核心執行緒
單核心處理器對應一個核心執行緒雙核心處理器對應兩個核心執行緒
四核心處理器對應四個核心執行緒核心執行緒(Kernel Thread,KLT)就是直接由作業系統核心支援的執行緒。該線程由核心來完成線程切換,核心透過操作調度器對線程進行調度,並負責將線程的任務映射到各個處理器上。
超執行緒技術
超執行緒技術將一個
模擬成兩個邏輯處理核心,也就是兩個核心執行緒。
所以我們看到的電腦通常都是雙核心四線程、四核心八線程。在作業系統中我們看到CPU數量是實際實體CPU數量的兩倍,如雙核心四執行緒可以看到4CPU。 如我目前寫文章的這台mbp就是i7 6核心12線程:
程式一般不會直接使用內核線程,而是使用內核執行緒的一種高階介面—輕量級進程(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語言中執行緒和進程的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

go语言能编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言。对Go语言程序进行编译的命令有两种:1、“go build”命令,可以将Go语言程序代码编译成二进制的可执行文件,但该二进制文件需要手动运行;2、“go run”命令,会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件。

删除map元素的两种方法:1、使用delete()函数从map中删除指定键值对,语法“delete(map, 键名)”;2、重新创建一个新的map对象,可以清空map中的所有元素,语法“var mapname map[keytype]valuetype”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),