線程、進程和協程區別聯繫

進程

每個進程都有自己獨立的地址空間,有自己的堆;還有進程狀態的轉換(就緒狀態、運行狀態、等待狀態)。
操作系統是以進程爲單位分配系統資源的,如cpu、內存啊,進程是資源分配的最小單位。

線程

線程是輕量級進程,是操作系統調度(CPU調度)的最小單位。
線程的狀態:
新建---->就緒<----->運行<----->死亡
在運行狀態中又細分爲,等待阻塞、同步阻塞、其他阻塞。
等待阻塞:線程等待系統通知才能繼續運行
同步阻塞:線程被同步鎖鎖上
其他阻塞:睡眠等待系統IO完成

線程和進程區別和聯繫

  1. 調度上,線程是調度和執行的基本單位,進程是資源分配的基本單位
  2. 併發性上,進程可併發執行,一個進程內的多次線程也可以併發執行
  3. 擁有資源,線程共享進程的資源空間,進程是擁有資源的基本單位,線程可以訪問隸屬於進程的資源。線程其實也有自己的資源就不是系統資源,是一些如運行棧,同步調度信息,待處理信號集等。
  4. 系統開銷,在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。
  5. 處理機分配給線程,真正運行在cpu上的是線程

協程

在這裏插入圖片描述
協程是比線程更輕量的存在,協程不是被操作系統內核所管理的,而是由程序來控制的,即在用戶態執行,這樣的好處是不會像線程那樣消耗資源。
協程在子程序內部是可中斷的,然後轉而執行別的子程序,在適當的時候再返回來接着執行。

def A():
    print '1'
    print '2'
    print '3'

def B():
    print 'x'
    print 'y'
    print 'z'

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

協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。

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

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

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

引入協程是爲了將回調邏輯變成線性同步邏輯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章