線程與進程,阻塞非阻塞,同步與異步

進程和線程的區別?

(1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元
(2)同一個進程中可以包括多個線程,並且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進程至少包括一個線程。
(3)進程的創建調用fork或者vfork,而線程的創建調用pthread_create,進程結束後它擁有的所有線程都將銷燬,而線程的結束不會影響同個進程中的其他線程的結束
(4)線程是輕兩級的進程,它的創建和銷燬所需要的時間比進程小很多,所有操作系統中的執行功能都是創建線程去完成的
(5)線程中執行時一般都要進行同步和互斥,因爲他們共享同一進程的所有資源
(6)線程有自己的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有自己的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標誌

阻塞與非阻塞

阻塞調用是指調用結果返回之前,調用者會進入阻塞狀態等待。只有在得到結果之後纔會返回。
非阻塞調用是指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。
一個線程/進程經歷的5個狀態,創建,就緒,運行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是說當線程中調用某個函數,需要IO請求,或者暫時得不到競爭資源的,操作系統會把該線程阻塞起來,避免浪費CPU資源,等到得到了資源,再變成就緒狀態,等待CPU調度運行。
這裏寫圖片描述

同步與異步

同步:在發出一個同步調用時,在沒有得到結果之前,該調用就不返回。

異步:在發出一個異步調用後,調用者不會立刻得到結果,該調用就返回了。

同步的定義看起來跟阻塞很像,但是同步跟阻塞是兩個概念,同步調用的時候,線程不一定阻塞,調用雖然沒返回,但它還是在運行狀態中的,CPU很可能還在執行這段代碼,而阻塞的話,它就肯定不在CPU中跑這個代碼了。這就是同步和阻塞的區別。同步是肯定可以在,阻塞是肯定不在。
異步和非阻塞的定義比較像,兩者的區別是異步是說調用的時候結果不會馬上返回,線程可能被阻塞起來,也可能不阻塞,兩者沒關係。非阻塞是說調用的時候,線程肯定不會進入阻塞狀態。

上面兩組概念,就有4種組合。

同步阻塞調用:得不到結果不返回,線程進入阻塞態等待。

同步非阻塞調用:得不到結果不返回,線程不阻塞一直在CPU運行。

異步阻塞調用:去到別的線程,讓別的線程阻塞起來等待結果,自己不阻塞。

異步非阻塞調用:去到別的線程,別的線程一直在運行,直到得出結果。

並行

並行是多個程序在多個CPU上同時運行,任意一個時刻可以有很多個程序同時運行,互不干擾。
這裏寫圖片描述

併發

併發是多個程序在一個CPU上運行,CPU在多個程序之間快速切換,微觀上不是同時運行,任意一個時刻只有一個程序在運行,但宏觀上看起來就像多個程序同時運行一樣,因爲CPU切換速度非常快,時間片是64ms(每64ms切換一次,不同的操作系統有不同的時間),人類的反應速度是100ms,你還沒反應過來,CPU已經切換了好幾個程序了。
這裏寫圖片描述

發佈了102 篇原創文章 · 獲贊 27 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章