天天看點

程序與線程、應用程式域關系

程序的出現:

  程序由作業系統建立、管理的,離開了作業系統也就不談什麼程序了,先看看作業系統的四個基本特征:

  1.并發(concurrence)

      并行性與并發性這兩個概念是既相似又差別的兩個概念。

并行性是指兩個或者多個事件在同一時刻發生,這是一個具有微觀意義的概念,即在實體上這些事件是同時發生的;

并發性是指兩個或者多個事件在同一時間的間隔内發生,它是一個較為宏觀的概念。

在多道程式環境下,并發性是指在一段時間内有多道程式在同時運作,但在單處理機的系統中,每一時刻僅能執行一道程式,故微觀上這些程式是在交替執行的。  應當指出,通常的程式是靜态實體,它們是不能并發執行的。為了使程式能并發執行,系統必須分别為每個程式建立程序。程序,又稱任務,簡單來說,是指在系統中能獨立運作并作為資源配置設定的基本機關,它是一個活動的實體。多個程序之間可以并發執行和交換資訊。一個程序在運作時需要運作時需要一定的資源,如 cpu,存儲空間,及i/o裝置等。在作業系統中引入程序的目的是使程式能并發執行。

  2.共享 (sharing)

    所謂共享是指,系統中的資源可供記憶體中多個并發執行的程序共同使用。由于資源的屬性不同,故多個程序對資源的共享方式也不同,可以分為:互斥共享方式 和 同時通路方式

  3.虛拟 (virtual)

    是指通過技術吧一個實體實體變成若幹個邏輯上的對應物。在作業系統中虛拟的實作主要是通過分時的使用方法。顯然,如果n是某一個實體裝置所對應的虛拟邏輯裝置數,則虛拟裝置的速度必然是實體裝置速度的1/n。

  4.異步 (asynchronism)

    在多道程式設計環境下,允許多個程序并發執行,由于資源等因素的限制,通常,程序的執行并非“一氣呵成”,而是以“走走停停”的方式運作。記憶體中每個程序在何時執行,何時暫停,以怎樣的方式向前推進,每道程式總共需要多少時間才能完成,都是不可預知的。或者說,程序是以一步的方式運作的。盡管如此,但隻要運作環境相同,作業經過多次運作,都會獲得完全相同的結果,是以,異步運作方式是運作的。

可見,作業系統為了使程式并發執行而産生了程序。

程序的定義:可并發執行的程式在一個資料集合上的運作過程。

程序的特征:

1.動态性

程序既然是程序實體的執行過程,是以程序是有一定的生命期。而程式隻是一組有序指令的集合,并放在某種媒體上,本身無運作的含義,是以程式是個靜态的實體。

2.并發性

3.獨立性 

這是指程序實體是一個能獨立運作的基本機關,同時也是系統種獨立獲得資源和排程的基本機關。

4.異步性

5.結構特征

從結構上看,程序實體是由程式段、資料段及程序控制塊三部分組成。

   (程序控制塊(PCB):程序控制塊是程序實體的一部分,它記錄了作業系統所需要的、用于描述程序情況及控制程序運作所需的全部資訊。os 是根據PCB來對并發執行的程序進行控制和管理的)

關于程序的總結:

定義:可并發執行的程式在一個資料集合上的運作過程,每個程序有一個自己的位址空間以及一個單一的控制流程。

要解決的問題:為了使程式能并發執行,(要并發執行就要隔離程序,使程序獨立,即每個程序有屬于自己的資料段、程式段、程序控制塊)

線程的出現:

    我們首先回顧程序的兩個基本屬性:

(1)程序使一個可擁有資源的獨立機關

(2)程序同時又是一個可以獨立排程和分派的基本機關。正是由于這兩個基本屬性,才使程序成為一個能獨立運作的基本機關,進而構成了程序并發執行的基礎。

   為了使程式能并發執行,系統必須進行以下操作:

(1) 建立程序。建立一個程序時必須為之人、配置設定所必需的、除處理器以外的所有資源,如記憶體空間、I/O裝置以及建立相應的PCB.

(2) 撤消程序。系統在撤消程序時,需要先對這這些資源進行回收,然後再撤銷PCB.

(3) 程序切換。在對程序進行切換時,由于要保留目前程序的CPU環境和設定新選中的程序的CPU環境,為此須花費不少處理器時間。

   簡言之,由于程序是一個資源的擁有者,因而在程序的建立、撤銷、和切換的過程中,系統必須為之付出較大的時空開銷,也正因為如此,在系統中設定的程序的數目不宜過多,程序的切換的頻率也不宜過高,但這也就限制了并發程度的進一步提高。為了解決這個問題,不少作業系統的學者們想到:将程序的兩個屬性分開,由作業系統分開處理。即對作為排程和分派的基本機關,不同時作為獨立配置設定資源的機關,以使之輕裝運作;而對擁有資源的基本機關,又不頻繁地對之進行切換,在這種思想的指導下,産生了線程的概念。

線程引入的原因: 為了減少程式并發執行所付出的時空開銷,使os具有更好的并發性。

    在引入線程的os 中,線程是程序中的一個實體(程序中的一個或多個指令執行流),是被系統獨立排程和分派的基本機關。線程基本上不再擁有系統資源,(隻擁有一點在運作中必不可少的資源,如程式計數器、寄存器和棧),但它可與同屬一個程序的其他線程功能共享程序所擁有的全部資源。線一個線程可以建立和撤銷另一個線程;同一程序中的多個線程之間可以并發執行。

 線程與程序的比較:

    線程具有許多傳統程序所具有的特征,故又稱為輕型線程或程序元;而把傳統的程序稱為重型程序。在引入了線程的os中,通常一個程序擁有若幹個線程。下面從四個方面來比較線程與程序。

1.排程

   在“原始”的OS中,擁有資源的基本機關和獨立排程、配置設定的基本機關都是程序。而在引入線程的OS中,則把線程作為排程和分派的基本機關,而把程序作為資源擁有的基本機關,使傳統程序的兩個屬性分開,線程便能輕裝運作,進而可以顯著的提高系統并發程度。在同一程序中,線程的切換不會引起程序切換,在由一個程序中的線程切換到另一程序中的線程時,将會引起程序切換。

    在引入線程的OS中,不僅程序之間可以并發執行,而且在一個程序中的多個線程之間亦可以并發執行,因而使OS具有更好的并發性,進而能更有效的使用系統資源和提高系統吞吐量。

3.擁有資源

    不論是“原始”的OS,還是設有線程的作業系統,程序都是擁有資源的一個獨立機關,它可以擁有自己的資源。線程自己基本不再擁有系統資源,但它可以通路其隸屬程序的資源。

4.系統開銷

    由于在建立或撤銷程序時,系統都要為之配置設定或回收資源,如記憶體空間,I/O裝置等。因為,OS所付出的開銷将顯著地大于在建立或撤銷線程時的開銷。類似的,在進行程序切換時,涉及到整個目前程序CPU環境的儲存以及新被排程運作的程序的CPU 環境設定。而線程切換隻須儲存和設定少量寄存器的内容,并不涉及存儲器管理方面的操作。可見,程序切換的開銷也遠大于線程切換的開銷。此外,由于同一程序中的多個線程具有相同的位址空間,使它們之間的同步和通信的實作變得比較容易。

    這個機制在現代作業系統的實作主要可分為兩大類。即根據作業系統核心是否對線程可感覺,分為核心線程和使用者線程。

1.核心線程   無論是使用者程序中的線程還是系統程序中的線程,它們的建立、撤銷和切換都是由核心實作的。在核心中保留了一張線程控制塊,核心根據該控制塊而感覺線程的存在并對線程進行控制。

2.使用者線程      它僅存在于使用者級中,對于這種線程的建立、撤銷和切換,都不利用系統調用實作,因而這種線程與核心無關。相應地,核心也并不知道使用者級線程的存在。( 排程的實作方式是采用在使用者空間增加運作庫,這些運作庫被稱為“線程包”,每當使用者程序獲得CPU控制權,線程運作庫決定該從哪裡開始運作)

( 實際上,上面所說的線程是作業系統排程的基本機關,實際上指的隻是核心線程。作業系統在排程時,參考各程序内的線程運作情況做出排程決定,如果一個程序中沒有就緒态的線程,那麼這個程序也不會被排程占用CPU.

  在Windows 2000中,作業系統進行排程時根本就不理采線程是屬于哪個程序的,隻是将所有的就緒線程統一排成若幹個優先級隊列,然後進行排程。在這個情況下,線程的确成了排程的最小機關)。

關于線程的總結:

出現的背景:由于程序是一個資源的擁有者,因而在程序的建立、撤銷、和切換的過程中,系統必須為之付出較大的時空開銷,限制了并發程度的進一步提高。

要解決的問題:解決程序的建立、撤銷、和切換的過程中,系統必須為之付出較大的時空開銷的問題

解決的方法:将程序的兩個屬性分開,由作業系統分開處理。把“獨立排程、配置設定的基本機關”這個屬性分離出來作為線程;而把程序作為資源擁有的基本機關,線程作為程序中的一個實體而存在。

應用程式域的出現:

(來自msdn)

   在.net出現以前,一個程序下,隻能運作一個應用程式,而在,net出現後,一個程序下,可以運作多個應用程式,這都是因為應用程式域的出現。

    以前使用程序邊界來隔離在同一台計算機上運作的應用程式。每一個應用程式被加載到單獨的程序中,這樣就将該應用程式與在同一台計算機上運作的其他應用程式相隔離。

   隔離這些應用程式的原因在于記憶體位址是與程序相關的;在目标程序中,不能通過任何有意義的方式使用從一個程序傳遞到另一個程序的記憶體指針。此外,您不能在兩個程序間進行直接調用。您必須代之以使用代理,它提供一定程度的間接性。

    應用程式域提供安全而通用的處理單元,公共語言運作庫可使用它來提供應用程式之間的隔離。您可以在具有同等隔離級别(存在于單獨的程序中)的單個程序中運作幾個應用程式域,而不會造成程序間調用或程序間切換等方面的額外開銷。在一個程序内運作多個應用程式的能力顯著增強了伺服器的可伸縮性。

     隔離應用程式對于應用程式安全也是十分重要的。例如,您可以在單個浏覽器程序中運作幾個 Web 應用程式中的控件,同時使這些控件不能通路彼此的資料和資源。

應用程式域所提供的隔離具有以下優點(引入原因):

    在一個應用程式中出現的錯誤不會影響其他應用程式。因為類型安全的代碼不會導緻記憶體錯誤,是以使用應用程式域可以確定在一個域中運作的代碼不會影響程序中的其他應用程式。

    能夠在不停止整個程序的情況下停止單個應用程式。使用應用程式域使您可以解除安裝在單個應用程式中運作的代碼。

    應用程式域形成了托管代碼的隔離、解除安裝和安全邊界。線程是公共語言運作庫用來執行代碼的作業系統構造。在運作時,所有托管代碼均加載到一個應用程式域中,由特定的作業系統線程來運作。

    應用程式域和線程之間不具有一對一的相關性。在任意給定時間,在單個應用程式域中可以執行幾個線程,而且特定線程并不局限在單個應用程式域内。也就是說,線程可以自由跨越應用程式域邊界;不為每個應用程式域建立新線程。

    在任意給定時間,每一線程都在一個應用程式域中執行。運作庫會跟蹤在哪些應用程式域中有哪些線程正在運作。

一些相關面試題:

Q:談談你對Windows多線程程式設計的認識

回答思路:

(1)【什麼是程序和線程?】程序是系統資源的擁有者;線程是Windows任務排程的最小機關。

(2)【程序和線程有什麼?】Windows下,程序占有4G的位址空間;線程隻占用運作必須的stack。

(3)【程序和線程的關系?】程序是線程的容器,線程必須在程序中運作,每個程序建立時都會有一個主線程被建立。

(4)【從數量上比較】線程數遠大于程序數,一個程序可以有一個或多個線程。

(5)【關于線程排程】線程排程的兩種方式:搶占式(如Win9X、UNIX、OS/2)、非搶占式(DOS、Win3.X

(6)【Windows如何實作多線程并發】Windows用時間片模拟多線程并發

(7)【為什麼要使用多線程?】 為了減少程式并發執行所付出的時空開銷,使os具有更好的并發性。

(8)【使用多線程的優點】提高并發程度、提高效率

(9)【使用多線程的缺點】難使資料同步、開發調試困難、任意使用多線程會降低效率{過猶不及}、不是可以随意使用多線程

繼續閱讀