并發(fā)最基本要理解的進(jìn)程、線程、協(xié)程

一、進(jìn)程

1.什么是進(jìn)程?

進(jìn)程是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本概念,可以說進(jìn)程是線程的容器,一個(gè)進(jìn)程里包括數(shù)據(jù)區(qū)域和堆棧存儲著活動過程調(diào)用的指令和本地的變量,進(jìn)程沒運(yùn)行時(shí)候處于沒有生命的一個(gè)實(shí)體的狀態(tài),運(yùn)行時(shí)依賴處理器給他活體狀,一個(gè)進(jìn)程至少有一個(gè)線程,如果沒有的話那么這個(gè)線程就是它本身。

一、多進(jìn)程的概念

理論上一個(gè)CPU只能給一個(gè)進(jìn)程,如果想一個(gè)CPU運(yùn)行多個(gè)進(jìn)程的話,那就是多進(jìn)程,就要使用并發(fā)技術(shù),實(shí)現(xiàn)并發(fā)技術(shù)非常復(fù)雜,說一下簡單的并發(fā)技術(shù) "時(shí)間片輪轉(zhuǎn)進(jìn)程調(diào)度算法" 在操作系統(tǒng)的管理下,所有正在運(yùn)行的進(jìn)程輪流使用CPU,每個(gè)進(jìn)程允許占用CPU的時(shí)間非常短(比如10ms),這樣用戶根本感覺不出來 CPU是在輪流為多個(gè)進(jìn)程服務(wù),但實(shí)際上在任何一個(gè)時(shí)間內(nèi)有且僅有一個(gè)進(jìn)程占有CPU。 如果一臺計(jì)算機(jī)有多個(gè)CPU,情況就不同了,如果進(jìn)程數(shù)大于CPU數(shù)的時(shí)候,使用這種并發(fā)技術(shù)。目前都是幾核的CPU都能夠處理。

同時(shí),這兩種上下文切換的處理都是通過操作系統(tǒng)內(nèi)核來完成的。內(nèi)核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內(nèi)容切換出。

2.什么是線程?

線程是程序執(zhí)行流的最小單元,一個(gè)線程的信息包括(線程ID,指令集合,堆棧組)組成的線程這種單位,上面進(jìn)程提到進(jìn)程是線程的一個(gè)容器,說明線程運(yùn)行在進(jìn)程里面的,那就是運(yùn)行在進(jìn)程里面的一個(gè)實(shí)體,它不擁有系統(tǒng)資源,但它擁有進(jìn)程的資源。

一、線程的三種狀態(tài)

1.就緒狀態(tài):
是指線程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī)的過程。
2.阻塞狀態(tài):
是指線程在等待某一個(gè)事件(信號量)。
3.運(yùn)行狀態(tài):
是指線程占有處理機(jī)正在運(yùn)行。

二、多線程

同時(shí)運(yùn)行多個(gè)線程完成不同的工作,就叫做多線程,使用多線程的好處有:
1.資源利用率更好: 想象一下,一個(gè)應(yīng)用程序需要從本地文件系統(tǒng)中讀取和處理文件的情景。比方說,從磁盤讀取一個(gè)文件需要5秒,處理一個(gè)文件需要2秒。處理兩個(gè)文件則需要14s,在這段時(shí)間里,CPU非常的空閑,它可以做一些別的事情,那么我們使用多個(gè)線程的話,是不是可以處理文件的同時(shí)去讀取新的文件,這樣就提高了時(shí)間效率,
2.程序響應(yīng)更快:假設(shè)做某一個(gè)服務(wù)的時(shí)候,它在某一個(gè)端口監(jiān)聽進(jìn)來的請求,當(dāng)一個(gè)請求到來時(shí),它去處理這個(gè)請求,然后再返回去監(jiān)聽。
3.程序設(shè)計(jì)簡單
做多線程的時(shí)候運(yùn)用多線程的技術(shù)設(shè)計(jì)非常簡單易用,遵循好一些規(guī)則,避免造成阻塞等操作,基本可以很快設(shè)計(jì)程序的需求。
4.使用場景:
多線程:密集I/O任務(wù)(網(wǎng)絡(luò)I/O,磁盤I/O,數(shù)據(jù)庫I/O)使用多線程合適。

三、線程與線程主要依靠什么通信

線程間通信主要通過共享內(nèi)存

3.什么是協(xié)程?

一個(gè)程序可以包含多個(gè)協(xié)程,線程相對獨(dú)立有自己的上下文,協(xié)程也是,但是協(xié)程由自己控制,不受操作系統(tǒng)控制,可以不加鎖的訪問全局變量,所以上下文的切換非常快,可以說是輕量級的線程,也可以說稱之為用戶級別的線程就叫協(xié)程,一個(gè)線程可以多個(gè)協(xié)程,一個(gè)進(jìn)程也可以單獨(dú)擁有多個(gè)協(xié)程,線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步。

1.使用場景:
又稱微線程,在單線程上執(zhí)行多個(gè)任務(wù),用函數(shù)切換,開銷極小。不通過操作系統(tǒng)調(diào)度,沒有進(jìn)程、線程的切換開銷。genventmonkey.patchall
多線程請求返回是無序的,那個(gè)線程有數(shù)據(jù)返回就處理那個(gè)線程,而協(xié)程返回的數(shù)據(jù)是有序的,處理磁盤的I/O比較慢,處理網(wǎng)絡(luò)I/O性能還是比較高。

4.進(jìn)程線程上下文切換

順便說一下上下文切換上下文切換就是從當(dāng)前執(zhí)行任務(wù)切換到另一個(gè)任務(wù)執(zhí)行的過程。但是,為了確保下次能從正確的位置繼續(xù)執(zhí)行,在切換之前,會保存上一個(gè)任務(wù)的狀態(tài)。進(jìn)程上下文切換與線程上下文切換最主要的區(qū)別就是線程的切換虛擬空間內(nèi)存是相同的(因?yàn)槎际菍儆谧约旱倪M(jìn)程),但是,進(jìn)程切換的虛擬空間內(nèi)存則是不同的。同時(shí),這兩種上下文切換的處理都是通過操作系統(tǒng)內(nèi)核來完成的。

image.png

上面畫了一個(gè)進(jìn)程,線程,協(xié)程的調(diào)用關(guān)系圖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容