App下載

能否解釋下什么是進(jìn)程、線程、協(xié)程,他們之間的關(guān)系是怎樣的?

享受養(yǎng)生的年輕人 2021-12-15 14:24:51 瀏覽數(shù) (2385)
反饋

進(jìn)程: 本質(zhì)上是一個(gè)獨(dú)立執(zhí)行的程序,進(jìn)程是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本概念,操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。


線程: 是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程執(zhí)行不同的任務(wù),切換受系統(tǒng)控制。


協(xié)程:  又稱為微線程,是一種用戶態(tài)的輕量級(jí)線程,協(xié)程不像線程和進(jìn)程需要進(jìn)行系統(tǒng)內(nèi)核上的上下文切換,協(xié)程的上下文切換是由用戶自己決定的,有自己的上下文,所以說(shuō)是輕量級(jí)的線程,也稱之為用戶級(jí)別的線程就叫協(xié)程,一個(gè)線程可以多個(gè)協(xié)程,線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步Java的原生語(yǔ)法中并沒(méi)有實(shí)現(xiàn)協(xié)程,目前python、Lua和GO等語(yǔ)言支持。


關(guān)系:一個(gè)進(jìn)程可以有多個(gè)線程,它允許計(jì)算機(jī)同時(shí)運(yùn)行兩個(gè)或多個(gè)程序。線程是進(jìn)程的最小執(zhí)行單位,CPU
的調(diào)度切換的是進(jìn)程和線程,進(jìn)程和線程多了之后調(diào)度會(huì)消耗大量的CPU,CPU上真正運(yùn)行的是線程,線程可
以對(duì)應(yīng)多個(gè)協(xié)程。


協(xié)程對(duì)于多線程有什么優(yōu)缺點(diǎn)嗎?

優(yōu)點(diǎn):
非??焖俚纳舷挛那袚Q,不用系統(tǒng)內(nèi)核的上下文切換,減小開(kāi)銷。
單線程即可實(shí)現(xiàn)高并發(fā),單核CPU可以支持上萬(wàn)的協(xié)程。
由于只有一個(gè)線程,也不存在同時(shí)寫(xiě)變量的沖突,在協(xié)程中控制共享資源不需要加鎖。


缺點(diǎn):
協(xié)程無(wú)法利用多核資源,本質(zhì)也是個(gè)單線程。
協(xié)程需要和進(jìn)程配合才能運(yùn)行在多CPU上。
目前java沒(méi)成熟的第三方庫(kù),存在風(fēng)險(xiǎn)。
調(diào)試debug存在難度,不利于發(fā)現(xiàn)問(wèn)題。


0 人點(diǎn)贊