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 示例:在另外一個應用程序域中執行代碼
參考:安全
返回併發
進程由操做系統建立、管理的,離開了操做系統也就不談什麼進程了,先看看操做系統的四個基本特徵:異步
並行性是指兩個或者多個事件在同一時刻發生,這是一個具備微觀意義的概念,即在物理上這些事件是同時發生的;而併發性是指兩個或者多個事件在同一時間的間隔內發生,它是一個較爲宏觀的概念。async
在多道程序環境下,併發性是指在一段時間內有多道程序在同時運行,但在單處理機的系統中,每一時刻僅能執行一道程序,故微觀上這些程序是在交替執行的。應當指出,一般的程序是靜態實體,它們是不能併發執行的。爲了使程序能併發執行,系統必須分別爲每一個程序創建進程。進程,又稱任務,簡單來講,是指在系統中能獨立運行並做爲資源分配的基本單位,它是一個活動的實體。多個進程之間能夠併發執行和交換信息。一個進程在運行時須要運行時須要必定的資源,如 cpu,存儲空間,及i/o設備等。在操做系統中引入進程的目的是使程序能併發執行。性能
所謂共享是指,系統中的資源可供內存中多個併發執行的進程共同使用。因爲資源的屬性不一樣,故多個進程對資源的共享方式也不一樣,能夠分爲:互斥共享方式 和 同時訪問方式spa
是指經過技術吧一個物理實體變成若干個邏輯上的對應物。在操做系統中虛擬的實現主要是經過分時的使用方法。顯然,若是n是某一個物理設備所對應的虛擬邏輯設備數,則虛擬設備的速度必然是物理設備速度的1/n。操作系統
在多道程序設計環境下,容許多個進程併發執行,因爲資源等因素的限制,一般,進程的執行並不是「一鼓作氣」,而是以「走走停停」的方式運行。內存中每一個進程在什麼時候執行,什麼時候暫停,以怎樣的方式向前推動,每道程序總共須要多少時間才能完成,都是不可預知的。或者說,進程是以異步的方式運行的。儘管如此,但只要運行環境相同,做業通過屢次運行,都會得到徹底相同的結果,所以,異步運行方式是容許的。.net
操做系統爲了使程序併發執行而產生了進程。
進程的定義:可併發執行的程序在一個數據集合上的運行過程。
進程的特徵:
咱們首先回顧進程的兩個基本屬性:
正是因爲這兩個基本屬性,才使進程成爲一個能獨立運行的基本單位,從而構成了進程併發執行的基礎。
因爲進程是一個資源的擁有者,於是在進程的建立、撤銷、和切換的過程當中,系統必須爲之付出較大的時空開銷。爲了解決這個問題,很多操做系統的學者們想到:將進程的兩個屬性分開,由操做系統分開處理。即對做爲調度和分派的基本單位,不一樣時做爲獨立分配資源的單位,以使之輕裝運行;而對擁有資源的基本單位,又不頻繁地對之進行切換,在這種思想的指導下,產生了線程的概念。
線程引入的緣由: 爲了減小程序併發執行所付出的時空開銷,使os具備更好的併發性。
在引入線程的os 中,線程是進程中的一個實體(進程中的一個或多個指令執行流),是被系統獨立調度和分派的基本單位。線程基本上再也不擁有系統資源,(只擁有一點在運行中必不可少的資源,如程序計數器、寄存器和棧),但它可與同屬一個進程的其餘線程功能共享進程所擁有的所有資源。線一個線程能夠建立和撤銷另外一個線程;同一進程中的多個線程之間能夠併發執行。
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的所有資源。一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。因爲線程之間的相互制約,導致線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。
在.Net中,應用程序有了一個新的邊界:應用程序域(如下簡稱域)。它是一個用於隔離應用程序的虛擬邊界。在.net出現之前,一個進程下,只能運行一個應用程序,而在,net出現後,一個進程下,能夠運行多個應用程序,這都是由於應用程序域的出現。
.Net結構中,因爲公共語言運行庫可以驗證代碼是否爲類型安全的代碼,因此它能夠提供與進程邊界同樣大的隔離級別,其性能開銷也要低得多。
在.Net中,線程是公共語言運行庫用來執行代碼的操做系統構造。在運行時,全部託管代碼均加載到一個域中,由特定的操做系統線程來運行。然而,域和線程之間並不具備一一對應關係。在任意給定時間,單個域中能夠執行不止一個線程,並且特定線程也並不侷限在單個域內。也就是說,線程能夠跨越域邊界,不爲每一個域建立新線程。固然,在指定時刻,每一線程都只能在一個域中執行。運行庫會跟蹤全部域中有哪些線程正在運行。經過調用.Net類庫的 Thread.GetDomain 方法,你還能夠肯定正在執行的線程所在的域。
若是但願將該程序集加載到另一個應用程序域中,可使用 ExecuteAssembly 或 ExecuteAssemblyByName,或者使用這些方法的其餘重載版本之一,參考在另外一個應用程序域中執行代碼(C# 編程指南)。
若是想從默認入口點之外的位置執行另外一個程序集,可在遠程程序集中定義一個從 MarshalByRefObject 派生的新類型。而後在應用程序中使用 CreateInstance 建立該類型的一個實例,參考跨越AppDomain邊界訪問對象。