你能講清楚操作系統中的 線程和進程 嗎?
寫在前面:
筆者晚上花了些功夫學習梳理了一下 進程和線程
,現在通過概念
+生活例子
+自己一針見血的描述
產出這篇文章,全文避免使用生硬的術語,儘量用通俗易懂的話把二者講明白。
什麼是進程?
- 很精闢的一句話:一個進程就是一個程序的運行實例。 比如你電腦任務管理器中的某個正在運行的exe程序就是一個進程。
- 詳細解釋:當你啓動一個程序的時候,操作系統爲該程序分配一塊地址空間,用於存放代碼、數據和執行任務的主線程,這個運行環境就是進程 。每一個進程至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。
什麼是多進程?
用生活例子來比對:你是不是經常在QQ聊天的時候還聽網易雲的歌曲啊?對操作系統而言多進程
即操作系統中同時運行的多個程序,容許多個資源集合同時被處理
爲什麼要引入進程?
在回答這個問題之前,我們不妨再通過實際生活中的例子談起。你的電腦上肯定安裝了各種軟件吧!這些軟件運行時需要給它們分配不同的資源(內存、CPU等),它們佔用各自內存的同時,互相獨立又互相競爭。
這是怎麼做到的呢?因爲進程的存在隔離了不同的資源,讓這些程序管理着各自的運行,如果要給進程取個外號,它就是資源分組大師。 操作系統裏確實也是這樣定義進程的 :
進程:計算機中已運行的程序,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎
什麼是線程?
- 進程中的一個執行任務(控制單元),負責當前進程中程序的執行。
- 換句話說:線程是進程的一個實體,是進程的一條執行路徑
什麼是多線程
可以用開篇講的給女朋友做飯的例子
來看多線程,雖然我沒有女朋友哈(╥╯﹏╰╥)ง 顧名思義多線程
即 在同一個進程中同時運行的多個任務
線程的屬性
- 有標識符ID
- 有自己的棧和指針
- 共享所在進程的地址空間和其他資源
- 有狀態及狀態轉換,因此需要提供一些狀態轉換操作
- 不運行時需要保存上下文環境,因此需要程序計數器等寄存器
爲什麼引入線程?
和前面提到的進程放在一起比較:進程是從資源分組
的角度出發的,線程
則是從執行
的角度出發的。進程給程序分配好的資源怎麼利用呢?這時候就要靠線程
來處理資源利用
進程存在下面三個痛點:
- 進程切換的代價、開銷相對較大
- 在一個進程內也需要並行執行多個程序,實現不同功能
- 進程有時候性能較低
引入線程出於以下三個方面的考慮:
-
應用的需求: 有些需求只能通過線程機制去實現。比如運行的QQ是一個進程的話,你要和別人發起聊天,還要在QQ上面下載文件,這種需求不依靠線程是實現不了的
-
開銷的考慮: 在進程內創建、終止線程比創建、終止進程快。同一進程內的線程間的切換比進程切換快,尤其是用戶級線程間的切換。線程之間 互相通信無須通過內核(同一進程的線程共享內存和文件)
-
性能的考慮: 多個線程中,任務功能不同(有的負責計算,有的負責I/O ),如果有多個處理器,一個進程就可以有很多任務同時在執行
爲什麼使用多進程與多線程?
- 使用多進程可以在一個時間段內執行多個任務,並且可以提高CPU的使用率
- 多線程是爲了同步完成多項任務,不是爲了提高運行效率,而是
爲了提高資源使用效率來提高系統的效率
。CPU一次只執行一個線程,線程的執行有隨機性,線程多就會有更高的機率搶到CPU的執行權。
說到這個我就想到了這幾天鬧得沸沸揚揚的一件事兒:PanDownload電腦端作者被捕,原因就是PanDownload是使用多線程的方式下載百度雲資源的,而這樣做是違法的
進程與線程的區別
-
進程與線程根本區別(角色定位): 進程是操作系統資源分配的基本單位,而線程則是任務調度和執行的基本單位
-
定義上: 進程是一個程序的運行實例,線程是進程的一個執行路徑
-
資源共享上: 進程之間不能共享資源,而線程共享進程所在地址空間和其他資源,同時線程有自己的棧和棧指針,程序計數器等寄存器
-
獨立性區別: 進程有自己獨立的地址空間,線程則沒有,且線程依附於進程
-
開銷方面: 進程切換的開銷大,線程相對較小
寫在最後: 上面這些內容大致地講解了一些進程與線程相關知識,其實有關線程和進程還可以講很多很多,比如進程與線程的創建方式、實現原理等等… 但是我們目的不在此,就先略過了。以上內容是我結合資料的一些膚淺理解,希望本文能對大家理解進程與線程
有所幫助,如有描述不準確的地方,歡迎指正!