對進程、線程、應用程序域的理解

 前幾天面試的一道題是談談進程、線程、應用程序域的區別,雖然能說上來幾點,但感覺理解的很膚淺、很不透徹,閒暇時從書箱裏翻出塵封已久的《操作系統》(還好,畢業時偶沒捨得賣),翻了翻進程的那一章。看之前我列出了下面三個問題:
1. 這些概念(技術)出現的背景以及要解決的問題 (要幹什麼)
2. 它們之間的聯繫與區別
3. 三者之間的發展脈絡
 
進程的出現:
(複習功課嘛,就把相關的內容都看看了,哎,都忘的差不多了)
  進程由操作系統創建、管理的,離開了操作系統也就不談什麼進程了,先看看操作系統的四個基本特徵:
  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中,則把線程作爲調度和分派的基本單位,而把進程作爲資源擁有的基本單位,使傳統進程的兩個屬性分開,線程便能輕裝運行,從而可以顯著的提高系統併發程度。在同一進程中,線程的切換不會引起進程切換,在由一個進程中的線程切換到另一進程中的線程時,將會引起進程切換。
2.併發性
    在引入線程的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)【使用多線程的缺點】難使數據同步、開發調試困難、任意使用多線程會降低效率{過猶不及}、不是可以隨意使用多線程
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章