詳細介紹線程與進程的區別與產生

目錄

一、進程(Process)

二、線程(Thread)

三、進程線程的舉例解釋

四、進程與線程的區別

五、擴展

1、進程的由來

2、線程的由來


在我們去看他們的區別之前,首先,我們要了解什麼是線程與進程?

一、進程(Process)

      簡單來說進程是在系統中正在運行的一個應用程序,程序一旦運行就是進程,比如正在運行的QQ是一個進程、正在運行的瀏覽器也是一個進程。詳細一點就是說:進程是計算機中程序關於某數據集合上的一個運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的繼承。在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。系統可以分配給每個進程一段有限使用的CPU的時間(又稱CPU時間片),CPU在這段時間中執行某個進程,然後下一個時間片又跳到另一個進程中去執行(注意:此時上一個進程中任務可以未執行完)。由於CPU轉換較快(對於我們人類來說),所以使得每個進程好像同時執行一樣。

二、線程(Thread)

     線程包含在進程中,是進程中的實際運作單位,是程序執行的最小單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發執行多個線程,每條線程並行執行不同的任務。

三、進程線程的舉例解釋

       可能你在看完上面進程線程的概念後,依然不是太理解它們。那咱們就用一個簡單的例子來解釋一下,大家都喜歡用一個工廠的例子,我感覺這個例子也是很好的。

      首先,計算機的核心是CPU,它承擔了所以的計算任務。我們現在把它比作一個工廠,假設工廠的電力有限,一個只能供給一個車間使用(此處表示該工廠是單CPU的,單個CPU,一次只能運行一個任務)。也就是說一個車間開工,其他車間就得停工。

       進程就好比工廠的車間,它代表CPU所能處理的任務。任何時刻,單個CPU總是隻能運行一個進程,其他進程處於非運行狀態,但是這個CPU可以讓這個車間工作一會後,再讓另一個車間工作一會。

       一個車間裏,可以有很多的工人,線程就好比車間裏的工人。一個進程可以包括多個線程。

       車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵一個進程的內存空間是共享的,每個線程都可以使用這些共享內存。

       可是,有些房間最多隻能允許一個人在裏面,比如廁所。裏面有人的時候,其他人就不能進去了,這代表一個線程使用某些共享內存時,其他線程必須等它結束,才能使用這塊內存。如何防治其他人進入呢?加一把鎖。先到的人鎖上門,後面的人只能等鎖打開才能進入,這個就叫“互斥鎖”(Mutual exclusion ,縮寫Mutex),目的是爲了防止多個線程同時讀寫某一塊內存區域。

       還有一些房間,可以同時容納 n 個人,多出來的人只能在外面等着,這就像某些內存區域,只能供給固定數目的線程使用。那這防止其他人進入的方法就是掛 n 把鎖,進去的人取一把鑰匙,出來的時候再把鑰匙掛回原處,當鑰匙被拿完後,後面的人就不能進了,只能等着。這種做法叫做“信號量”(Semaphore),用來保證多個線程不會互相沖突。

      看完這個例子,希望可以讓你對進程與線程理解的更清晰,至於後面說到的鎖,暫時知道就可以了,先不用理解。這個例子是在單CPU下的。目前,我們的計算機都是多CPU的,可以同時運行多個進程。另外,再附加一個鏈接,這是意外發現的一個比較有趣的講線程的故事《我是一個線程》。

        我是一個線程

四、進程與線程的區別

區別 進程 線程
根本區別 作爲資源分配的基本單位 執行和調度的基本單位
所處環境 在操作系統中能同時運行多個程序(多進程) 在同一應用程序中有多個順序流同時執行(多線程)
分配內存 系統在運行時會爲每一個進程分配不同的內存區域 系統不會爲線程分配內存,線程所使用的資源是它所屬的進程的資源,線程組只能共享資源,也就是說,線程除了在運行時要佔用CPU資源之外,計算機內部的軟硬件資源的分配與線程無關,線程只能共享它所屬進程的資源。
包含關係 沒有線程的進程可以被看作是一個單線程,如果一個進程內擁有多個線程,則進程的執行過程是由多條線程共同完成的。 線程是進程的一部分,如果沒有某一個進程也就不會存在這個進程裏的線程。線程又被稱爲輕量級進程或輕權進程。
開銷大小 每個進程都有獨立的代碼和數據空間,進程間的切換會有較大的開銷。 線程可以看成是輕量級的進程,屬於同一進程的線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計算器(PC),線程之間的切換開銷小。

五、擴展

1、進程的由來

       這個就要追述到電腦剛剛發明出來的時候,那時候是沒有操作系統的,電腦處理的任務都是順序的,一個任務在處理期間是獨佔了整個電腦資源。任務的運行需要CPU、輸入輸出設備等一起協同工作,但是由於CPU運行的很快,而輸入輸出設備運行的很慢,所以往往大部分時間CPU都處於空閒狀態,等待輸入輸出的完成,就像排隊買飯,排隊2小時,喫飯5分鐘,這樣就太慢太浪費資源了。所以就出現了支持多道程序運行的系統(多道批處理系統):電腦一次可以處理多個任務,當一個任務需要I/O時,就會執行其他需要CPU處理的任務,如此循環處理直到執行完所有任務。這樣提高了CPU的利用率,也提高了效率。就這樣一步一步發展成瞭如今的操作系統。(由來這部分是操作系統中的內容,我只是粗略的簡單講述了一下)

      在多道批處理系統中引申出了一個非常重要的模式,即:允許多個任務金如意內存並運行,由於在內存中存儲了多個任務,那麼那麼多任務如何進行區分?當某個任務因爲等待I/O暫停時,怎麼恢復到之前的運行狀態?所以,人們就發明了進程這一概念,用進程來保存每個任務的數據和運行狀態,同時對每個進程劃分對應的內存地址空間(代碼、數據、進程空間、打開的文件),並且要求進程只能使用它自己的內存空間,從而來達到任務的區分和恢復。

2、線程的由來

       在此時,我們要知道一個名詞:併發。什麼是併發呢?其實很好了解,就是同時完成多件事。比如我們可以使用電腦邊聽歌邊聊天。在現實生活中,很多很多是都是同時進行的,程序中也會出現同時進行的任務。

       多道批處理系統所引入的進程的概念,提高了計算機的運行效率,但是單單使用進程來處理程序的併發(併發,宏觀上可以理解爲:同一個時間段有多個任務在計算機中執行)的弊端也越來越突出,因爲一個進程在一個時間段內只能做一件事。如果某個程序有多個任務,只能逐個執行這些任務,由前面我們說進程與線程的區別時,我們知道進程間的切換開銷是比較大的。

      舉個例子吧:我喜歡在喫飯的時候看電視下飯,那我們就以喫飯爲例:假設現在我們希望計算機一邊執行喫飯的任務,一邊執行看電視的任務。我們知道計算機是以進程爲調度單位的,那麼我們想一邊喫飯,一邊看電視的行爲,只能拆分爲兩個進程,但是我們知道進程中存儲了大量信息,那麼當計算機進行進程切換的時候,就會有很大的時間消耗和空間消耗(因爲每個進程對應不同的內存地址空間,進程切換,實際上是處理器處理不同的地址空間)。如果不拆分爲兩個進程,我們讓這兩個任務在同一個進程中,那麼這兩個任務必然是依次執行的,但是這樣就違背了我們要同時喫飯看電視的要求。所以,問題來了,我們是否可以實現進程中任務的切換,有可以避免進程切換內存地址空間呢?

      因此:線程這一概念就被髮明瞭。用線程表示進程中不同的任務,同時又將計算機實際的調度單元轉到線程。這樣就避免了進程的內存地址空間的切換,也達到了多任務的併發執行。

 

 

      

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