那么線程和進程究竟是怎么樣的效率的關系呢?
答:首先:
1、進程是程序的一次執行。
2、進程是資源分配的基本單位(調度單位)。
3、一個進程可以包括多個線程。
4、在單CPU計算機中,有一個資源是無法被多個程序並行使用的:CPU。
5、操作系統調度器:拆分CPU為一段段時間的運行片,輪流分配給不同的程序。
6、操作系統內存管理模塊:管理物理內存、虛擬內存相關的事務。
由於CPU同時刻只能執行一個進程,如果我們不加以控制的話,一個進程可能使用CPU直到運行結束,於是出現了操作系統調度器,而進程也成為了調度單位。
進程的運行不僅僅需要CPU,還需要很多其他資源,如內存啊,顯卡啊,GPS啊,磁盤啊等等,統稱為程序的執行環境,也就是程序上下文。
在這里就出現了並發的概念,調度器切換CPU給不同進程使用的速度非常快,於是在使用者看來程序是在同時運行,這就是並發,而實際上CPU在同一時刻只在運行一個進程。
CPU進程無法同時刻共享,但是出現一定要共享CPU的需求呢?此時線程的概念就出現了。線程被包含在進程當中,進程的不同線程間共享CPU和程序上下文。(共享進程分配到的資源)
單CPU進行進程調度的時候,需要讀取上下文+執行程序+保存上下文,即進程切換。
如果這個CPU是單核的話,那么在進程中的不同線程為了使用CPU核心,則會進行線程切換,但是由於共享了程序執行環境,這個線程切換比進程切換開銷少了很多。在這里依然是並發,唯一核心同時刻只能執行一個線程。
如果這個CPU是多核的話,那么進程中的不同線程可以使用不同核心,真正的並行出現了。
線程是CPU調度和分配的基本單位,一定要和 進程是操作系統進行資源分配(包括cpu、內存、磁盤IO等)的最小單位 區別清楚。有句話說CPU只能看到線程,可以這么理解,假設我是CPU,我閉着眼,操作系統調度器將一個進程分配給我之后,我拿到進程睜開眼,我看到的是什么?我看到的是進程中的很多線程,那么我現在能調度和分配的是什么?進程?不行,因為我看不到其他進程,何來調度分配,只能調度我看到的那些線程,如果我是4核的話,把線程ABCD分配到核心1234,其他的線程依然要等待分配,至於等待多久,如何分配,暫不在本文討論范圍。於是線程是CPU調度和分配的基本單位。
結論: 計算io操作密集型的代碼多線程效率更高,因為線程創建要比進程創建開銷少
但是計算密集型的代碼多 那么進程操作更快,因為多進可以應用多核技術
2020-07-05