進程、線程和協程之間的區別和聯繫

Windows Lua 技術 程序員界的彭于晏 2018-12-07

一、進程

進程,直觀點說,保存在硬盤上的程序運行以後,會在內存空間裡形成一個獨立的內存體,這個內存體有自己的地址空間,有自己的堆,上級掛靠單位是操作系統。操作系統會以進程為單位,分配系統資源,所以我們也說,進程是資源分配的最小單位。

【進程間通信(IPC)】:

管道(Pipe) 所有的 POSIX systems, Windows;

命名管道(FIFO) 所有的 POSIX 系統, Windows;

消息隊列(Message queue) 多數操作系統;

信號量(Semaphore) 所有的 POSIX 系統, Windows;

共享內存 所有的 POSIX 系統, Windows。

二、線程

線程,有時被稱為輕量級進程(Lightweight Process,LWP),是操作系統調度(CPU調度)執行的最小單位。

三、進程和線程的區別與聯繫

【區別】:

調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位;

併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行;

擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源。進程所維護的是程序所包含的資源(靜態資源), 如:地址空間,打開的文件句柄集,文件系統狀態,信號處理handler等;線程所維護的運行相關的資源(動態資源),如:運行棧,調度相關的控制信息,待處理的信號集等;

系統開銷:在創建或撤消進程時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。但是進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個進程死掉就等於所有的線程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。

【聯繫】:

一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程;

資源分配給進程,同一進程的所有線程共享該進程的所有資源;

處理機分給線程,即真正在處理機上運行的是線程;

線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

四、協程

協程,又稱微線程,纖程。英文名Coroutine。協程的概念很早就提出來了,但直到最近幾年才在某些語言(如Lua)中得到廣泛應用。

子程序,或者稱為函數,在所有語言中都是層級調用,比如A調用B,B在執行過程中又調用了C,C執行完畢返回,B執行完畢返回,最後是A執行完畢。所以子程序調用是通過棧實現的,一個線程就是執行一個子程序。子程序調用總是一個入口,一次返回,調用順序是明確的。而協程的調用和子程序不同。

協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然後轉而執行別的子程序,在適當的時候再返回來接著執行。

進程、線程和協程之間的區別和聯繫

假設由協程執行,在執行A的過程中,可以隨時中斷,去執行B,B也可能在執行過程中中斷再去執行A,結果可能是:1 2 x y 3 z。

協程的特點在於是一個線程執行,那和多線程比,協程有何優勢?

極高的執行效率:因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯;

不需要多線程的鎖機制:因為只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。

相關推薦

推薦中...