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

 2023-12-25 阅读 29 评论 0

摘要:?  一 線程與進程的區別  1. 相同點:(a)二者都具有ID,一組寄存器,狀態,優先級以及所要遵循的調度策略。(b)每個進程都有一個進程控制塊,線程也擁有一個線程控制塊。(c)線程和子進程共享父

?  一 線程與進程的區別

  1. 相同點:
a)二者都具有ID,一組寄存器,狀態,優先級以及所要遵循的調度策略。
b)每個進程都有一個進程控制塊,線程也擁有一個線程控制塊。
c)線程和子進程共享父進程中的資源;線程和子進程獨立于它們的父進程,競爭使用處理器資源;線程和子進程的創建者可以在線程和子進程上實行某些控制,比如,創建者可以取消、掛起、繼續和修改線程和子進程的優先級;線程和子進程可以改變其屬性并創建新的資源。
  2.不同點:
a 線程是進程的一部分, 一個沒有線程的進程是可以被看作單線程的,如果一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
b 啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。

c)系統在運行的時候會為每個進程分配不同的內存區域,但是不會為線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。而一個線程的數據可以直接為其他線程所用,這不僅快捷,而且方便。
??? d 與進程的控制表PCB相似,線程也有自己的控制表TCB,但是TCB中所保存的線程狀態比PCB表中少多了。
??? e 進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,并不依賴線程而獨立存在。

3. 其他敘述:

進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程可以有多個線程,這些線程共享這個進程的資源。

一般,一個應用程序對應于一個或多個進程,可以把進程看作是該應用程序在操作系統中的標識;而一個進程通常由多個線程組成,而線程是操作系統為該應用程序分配處理時間的最小單元。



??????二 進程與程序的區別:

????? 程序是一組指令的集合,它是靜態的實體,沒有執行的含義。而進程是一個動態的實體,有自己的生命周期。一般說來,一個進程肯定與一個程序相對應,并且只有一個,但是一個程序可以有多個進程,也可以只有一個進程。除此之外,進程還有并發性和交往性。簡單地說,進程是程序的一部分,程序運行的時候會產生進程。

線程與線程處理msdn):

操作系統使用進程將它們正在執行的不同應用程序分開。線程是操作系統分配處理器時間的基本單元,并且進程中可以有多個線程同時執行代碼。每個線程都維護異常處理程序、調度優先級和一組系統用于在調度該線程前保存線程上下文的結構。線程上下文包括為使線程在線程的宿主進程地址空間中無縫地繼續執行所需的所有信息,包括線程的 CPU 寄存器組和堆棧。

???
支持搶先多任務處理的操作系統可以創建多個進程中的多個線程同時執行的效果。它通過以下方式實現這一點:在需要處理器時間的線程之間分割可用處理器時間,并輪流為每個線程分配處理器時間片。當前執行的線程在其時間片結束時被掛起,而另一個線程繼續運行。當系統從一個線程切換到另一個線程時,它將保存被搶先的線程的線程上下文,并重新加載線程隊列中下一個線程的已保存線程上下文。

?????時間片的長度取決于操作系統和處理器。由于每個時間片都很小,因此即使只有一個處理器,多個線程看起來似乎也是在同時執行。這實際上就是多處理器系統中發生的情形,在此類系統中,可執行線程分布在多個可用處理器中。

.NET Framework 將操作系統進程進一步細分為由?System.AppDomain?表示的、稱為應用程序域的輕量托管子進程。一個或多個托管線程(由System.Threading.Thread?表示)可以在同一個非托管進程中的一個或任意數目的應用程序域中運行。雖然每個應用程序域都是用單個線程啟動的,但該應用程序域中的代碼可以創建附加應用程序域和附加線程。其結果是托管線程可以在同一個非托管進程中的應用程序域之間自由移動;您可能只有一個線程在若干應用程序域之間移動。

進程??


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

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)【關于線程調度】線程調度的兩種方式:搶占式(如Win9XUNIXOS/2)、非搶占式(DOSWin3.X
????? 6)【Windows如何實現多線程并發】Windows用時間片模擬多線程并發
????? 7)【為什么要使用多線程?】?為了減少程序并發執行所付出的時空開銷,使os具有更好的并發性。
????? 8)【使用多線程的優點】提高并發程度、提高效率
????? 9)【使用多線程的缺點】難使數據同步、開發調試困難、任意使用多線程會降低效率{過猶不及}、不是可以隨意使用多線程

轉載于:https://www.cnblogs.com/elock/archive/2009/09/03/1559374.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/194852.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息