進程、線程與應用程序域

進程、線程與應用程序域

 

2015-06-15html

目錄編程

1 進程
  1.1 四個基本特徵
  1.2 進程的出現
  1.3 進程的定義和特徵
  1.4 關於進程的總結
2 線程
  2.1 線程的出現
  2.2 關於線程的總結
3 應用程序域(AppDomain)
  3.1 應用程序域的出現
  3.2 域與線程的關係
  3.3 示例:在另外一個應用程序域中執行代碼
參考:安全

1 進程


 返回併發

1.1 四個基本特徵

進程由操做系統建立、管理的,離開了操做系統也就不談什麼進程了,先看看操做系統的四個基本特徵:異步

  • 併發(concurrence)

並行性是指兩個或者多個事件在同一時刻發生,這是一個具備微觀意義的概念,即在物理上這些事件是同時發生的;而併發性是指兩個或者多個事件在同一時間的間隔內發生,它是一個較爲宏觀的概念。async

在多道程序環境下,併發性是指在一段時間內有多道程序在同時運行,但在單處理機的系統中,每一時刻僅能執行一道程序,故微觀上這些程序是在交替執行的。應當指出,一般的程序是靜態實體,它們是不能併發執行的。爲了使程序能併發執行,系統必須分別爲每一個程序創建進程。進程,又稱任務,簡單來講,是指在系統中能獨立運行並做爲資源分配的基本單位,它是一個活動的實體。多個進程之間能夠併發執行和交換信息。一個進程在運行時須要運行時須要必定的資源,如 cpu,存儲空間,及i/o設備等。在操做系統中引入進程的目的是使程序能併發執行。性能

  • 共享 (sharing)

所謂共享是指,系統中的資源可供內存中多個併發執行的進程共同使用。因爲資源的屬性不一樣,故多個進程對資源的共享方式也不一樣,能夠分爲:互斥共享方式 和 同時訪問方式spa

  • 虛擬 (virtual)

是指經過技術吧一個物理實體變成若干個邏輯上的對應物。在操做系統中虛擬的實現主要是經過分時的使用方法。顯然,若是n是某一個物理設備所對應的虛擬邏輯設備數,則虛擬設備的速度必然是物理設備速度的1/n。操作系統

  • 異步 (asynchronism)

在多道程序設計環境下,容許多個進程併發執行,因爲資源等因素的限制,一般,進程的執行並不是「一鼓作氣」,而是以「走走停停」的方式運行。內存中每一個進程在什麼時候執行,什麼時候暫停,以怎樣的方式向前推動,每道程序總共須要多少時間才能完成,都是不可預知的。或者說,進程是以異步的方式運行的。儘管如此,但只要運行環境相同,做業通過屢次運行,都會得到徹底相同的結果,所以,異步運行方式是容許的。.net

1.2 進程的出現

操做系統爲了使程序併發執行而產生了進程。

1.3 進程的定義和特徵

進程的定義:可併發執行的程序在一個數據集合上的運行過程。

進程的特徵:

  • 動態性 進程既然是進程實體的執行過程,所以進程是有必定的生命期。而程序只是一組有序指令的集合,並放在某種介質上,自己無運行的含義,所以程序是個靜態的實體。
  • 併發性
  • 獨立性  這是指進程實體是一個能獨立運行的基本單位,同時也是系統種獨立得到資源和調度的基本單位。
  • 異步性
  • 結構特徵 從結構上看,進程實體是由程序段、數據段及進程控制塊三部分組成。
    (進程控制塊(PCB):進程控制塊是進程實體的一部分,它記錄了操做系統所須要的、用於描述進程狀況及控制進程運行所需的所有信息。os 是根據PCB來對併發執行的進程進行控制和管理的)

1.4 關於進程的總結 

  • 定義:可併發執行的程序在一個數據集合上的運行過程,每一個進程有一個本身的地址空間以及一個單一的控制流程。
  • 要解決的問題:爲了使程序能併發執行,(要併發執行就要隔離進程,使進程獨立,即每一個進程有屬於本身的數據段、程序段、進程控制塊)
    在.Net以前,每個應用程序被加載到單獨的進程中,併爲該進程指定私有的虛擬內存。進程不能直接訪問物理內存,操做系統經過其它的處理把這些虛擬內存映射到物理內存或IO設備的某個區域,而這些物理內存之間不會有重疊,這就決定了一個進程不可能訪問分配給另外一個進程的內存。相應地,運行在該進程中的應用程序也不可能寫入另外一個應用程序的內存,這確保了任何執行出錯的代碼不會損害其地址空間之外的應用程序。在這種機制下,進程做爲應用程序之間一個獨立而安全的邊界在很大程度上提升了運行安全。
  • 進程的缺點:是下降了性能。許多一塊兒工做的進程須要相互通訊,而進程卻不能共享任何內存,你不能經過任何有意義的方式使用從一個進程傳遞到另外一個進程的內存指針。此外,你不能在兩個進程間進行直接調用。你必須代之以使用代理,它提供必定程度的間接性。

2 線程


 返回

2.1 線程的出現

咱們首先回顧進程的兩個基本屬性:

  • 進程使一個可擁有資源的獨立單位
  • 進程同時又是一個能夠獨立調度和分派的基本單位。

正是因爲這兩個基本屬性,才使進程成爲一個能獨立運行的基本單位,從而構成了進程併發執行的基礎。

因爲進程是一個資源的擁有者,於是在進程的建立、撤銷、和切換的過程當中,系統必須爲之付出較大的時空開銷。爲了解決這個問題,很多操做系統的學者們想到:將進程的兩個屬性分開,由操做系統分開處理。即對做爲調度和分派的基本單位,不一樣時做爲獨立分配資源的單位,以使之輕裝運行;而對擁有資源的基本單位,又不頻繁地對之進行切換,在這種思想的指導下,產生了線程的概念。

線程引入的緣由: 爲了減小程序併發執行所付出的時空開銷,使os具備更好的併發性。

在引入線程的os 中,線程是進程中的一個實體(進程中的一個或多個指令執行流),是被系統獨立調度和分派的基本單位。線程基本上再也不擁有系統資源,(只擁有一點在運行中必不可少的資源,如程序計數器、寄存器和棧),但它可與同屬一個進程的其餘線程功能共享進程所擁有的所有資源。線一個線程能夠建立和撤銷另外一個線程;同一進程中的多個線程之間能夠併發執行。

線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的所有資源。一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。因爲線程之間的相互制約,導致線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。

2 .2 關於線程的總結

  • 出現的背景:因爲進程是一個資源的擁有者,於是在進程的建立、撤銷、和切換的過程當中,系統必須爲之付出較大的時空開銷,限制了併發程度的進一步提升。
  • 要解決的問題:解決進程的建立、撤銷、和切換的過程當中,系統必須爲之付出較大的時空開銷的問題
  • 解決的方法:將進程的兩個屬性分開,由操做系統分開處理。把「獨立調度、分配的基本單位」這個屬性分離出來做爲線程;而把進程做爲資源擁有的基本單位,線程做爲進程中的一個實體而存在。

3 應用程序域(AppDomain)


 返回

3.1 應用程序域的出現

在.Net中,應用程序有了一個新的邊界:應用程序域(如下簡稱域)。它是一個用於隔離應用程序的虛擬邊界。在.net出現之前,一個進程下,只能運行一個應用程序,而在,net出現後,一個進程下,能夠運行多個應用程序,這都是由於應用程序域的出現。

.Net結構中,因爲公共語言運行庫可以驗證代碼是否爲類型安全的代碼,因此它能夠提供與進程邊界同樣大的隔離級別,其性能開銷也要低得多。

3.2 域與線程的關係

在.Net中,線程是公共語言運行庫用來執行代碼的操做系統構造。在運行時,全部託管代碼均加載到一個域中,由特定的操做系統線程來運行。然而,域和線程之間並不具備一一對應關係。在任意給定時間,單個域中能夠執行不止一個線程,並且特定線程也並不侷限在單個域內。也就是說,線程能夠跨越域邊界,不爲每一個域建立新線程。固然,在指定時刻,每一線程都只能在一個域中執行。運行庫會跟蹤全部域中有哪些線程正在運行。經過調用.Net類庫的 Thread.GetDomain 方法,你還能夠肯定正在執行的線程所在的域。

3.3 示例:在另外一個應用程序域中執行代碼

若是但願將該程序集加載到另一個應用程序域中,可使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用這些方法的其餘重載版本之一,參考在另外一個應用程序域中執行代碼(C# 編程指南)

若是想從默認入口點之外的位置執行另外一個程序集,可在遠程程序集中定義一個從 MarshalByRefObject 派生的新類型。而後在應用程序中使用 CreateInstance 建立該類型的一個實例,參考跨越AppDomain邊界訪問對象

參考:

[1] 進程、線程與應用程序域(AppDomain) 淺析

[2] 複習功課:對進程、線程、應用程序域的理解

相關文章
相關標籤/搜索