線程和進程

簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程,使得多線程程序的并發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.

進程和線程的主要差別在于它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

The term thread is used to refer to a separate path of execution for code.
The term process is used to refer to a running executable, which can encompass multiple threads.

線程用于指代一個獨立執行的代碼路徑
進程用于指代一個可執行程序,他可以包含多個線程

當一個可執行程序中擁有多個獨立執行的代碼路徑的時候,這就叫做多線程。

進程

進程(process)是一塊包含了某些資源的內存區域。操作系統利用進程把它的工作劃分為一些功能單元。

進程中所包含的一個或多個執行單元稱為線程(thread)。進程還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的線程訪問。

線程只能歸屬于一個進程并且它只能訪問該進程所擁有的資源。當操作系統創建一個進程后,該進程會自動申請一個名為主線程或首要線程的線程。
應用程序(application)是由一個或多個相互協作的進程組成的。

線程

一個線程包含以下內容:

<ul>
<li> 一個指向當前被執行指令的指令指針;</li>
<li> 一個棧;</li>
<li> 一個寄存器值的集合,定義了一部分描述正在執行線程的處理器狀態的值;</li>
<li> 一個私有的數據區。</li>
</ul>

所有這些元素都歸于線程執行上下文的名下。處在同一個進程中的所有線程都可以訪問該進程所包含的地址空間,當然也包含存儲在該空間中的所有資源。

并行使用一些線程通常是我們在實現算法時的自然反應。實際上,一個算法往往由一系列可以并發執行的任務組成。但是需要引起注意的是,使用大量的線程將引起過多的上下文切換,最終反而影響了性能。

進程與線程的一個簡單解釋

<li> 計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在運行。</li>

<li> 假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背后的含義就是,單個CPU一次只能運行一個任務。</li>

<li> 進程就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態。</li>

<li> 一個車間里,可以有很多工人。他們協同完成一個任務。</li>

<li> 線程就好比車間里的工人。一個進程可以包括多個線程。</li>

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

<li> 可是,每間房間的大小不同,有些房間最多只能容納一個人,比如廁所。里面有人的時候,其他人就不能進去了。這代表一個線程使用某些共享內存時,其他線程必須等它結束,才能使用這一塊內存。</li>

<li> 一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,后到的人看到上鎖,就在門口排隊,等鎖打開再進去。這就叫"互斥鎖"(Mutual exclusion,縮寫 Mutex),防止多個線程同時讀寫某一塊內存區域。</li>

<li> 還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大于n,多出來的人只能在外面等著。這好比某些內存區域,只能供給固定數目的線程使用。</li>

<li> 這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。后到的人發現鑰匙架空了,就知道必須在門口排隊等著了。這種做法叫做"信號量"(Semaphore),用來保證多個線程不會互相沖突。
不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用后者替代前者。但是,因為mutex較為簡單,且效率高,所以在必須保證資源獨占的情況下,還是采用這種設計。</li>

<li> 操作系統的設計,因此可以歸結為三點:

(1)以多進程形式,允許多個任務同時運行;

(2)以多線程形式,允許單個任務分成不同的部分運行;

(3)提供協調機制,一方面防止進程之間和線程之間產生沖突,另一方面允許進程之間和線程之間共享資源。
</li>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、進程和線程 進程 進程就是一個執行中的程序實例,每個進程都有自己獨立的一塊內存空間,一個進程中可以有多個線程。...
    阿敏其人閱讀 2,626評論 0 13
  • 一、概述: 進程就是一個程序運行的時候被CPU抽象出來的,一個程序運行后被抽象為一個進程,但是線程是從一個進程里面...
    夏天的風_song閱讀 589評論 0 5
  • 前言 拖了好久,不過還是得堅持。喜歡本文的話可以加下公眾號【于你供讀】。 目錄 線程與進程 線程與進程是操作系統里...
    GitHubClub閱讀 852評論 0 4
  • 又來到了一個老生常談的問題,應用層軟件開發的程序員要不要了解和深入學習操作系統呢? 今天就這個問題開始,來談談操...
    tangsl閱讀 4,173評論 0 23
  • 兒時有一個很好的玩伴叫霞,她自小家里貧窮,母親是一個啞巴在她剛上小學一年級時就跑丟了,父親是老實巴交的農民。我們相...
    上善若水sunny閱讀 1,360評論 3 4