進程、線程與JVM、CLR

進程和線程的關係:

網上有一副很經典的圖可讓咱們來理解進程和線程的關係:php

下面這副圖是一個雙向多車道的道路圖,假如咱們把整條道路當作是一個「進程」的話,那麼圖中由白色虛線分隔開來的各個車道就是進程中的各個「線程」了。html

image

這副圖出自:http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html java

一些說明:linux

  • 這些線程(車道)共享了進程(道路)的公共資源(土地資源)。程序員

  • 這些線程(車道)必須依賴於進程(道路),也就是說,線程不能脫離於進程而存在(就像離開了道路,車道也就沒有意義了)。編程

  • 這些線程(車道)之間能夠併發執行(各個車道你走你的,我走個人),也能夠互相同步(某些車道在交通燈亮時禁止繼續前行或轉彎,必須等待其它車道的車輛通行完畢)。c#

  • 這些線程(車道)之間依靠代碼邏輯(交通燈)來控制運行,一旦代碼邏輯控制有誤(死鎖,多個線程同時競爭惟一資源),那麼線程將陷入混亂,無序之中。多線程

  • 這些線程(車道)之間誰先運行是未知的,只有在線程恰好被分配到CPU時間片(交通燈變化)的那一刻才能知道。併發

 

線程的生存期

當安排執行一個線程後,這個線程會經歷幾個狀態,包括:未啓動,激活,睡眠狀態等,以下圖顯示的線程的生存期:spa

image

此圖來自《c#線程參考手冊》,這本書的電子版在CSDN有下載:http://d.download.csdn.net/down/1493065/phs415

 

若是使用Java,看下面圖更容易點,其實他們描述的意思徹底同樣:

image

JVM 與 進程,線程

Java編寫的程序都運行在在Java虛擬機(JVM)中,每用java命令啓動一個java應用程序,就會啓動一個JVM進程。在同一個JVM進程中,有且只有一個進程,就是它本身。在這個JVM環境中,全部程序代碼的運行都是以線程來運行的。JVM找到程序程序的入口點main(),而後運行main()方法,這樣就產生了一個線程,這個線程稱之爲主線程。當main方法結束後,主線程運行完成。JVM進程也隨即退出。

以下圖所示:

image

上述資料參看:

JVM和JRE淺談 
http://blog.csdn.net/liufeng_cp/archive/2008/07/18/2674317.aspx

Java多線程編程總結 
http://lavasoft.blog.51cto.com/62575/27069

Java 因爲要考慮跨平臺,因此它跟進程,線程的模型比較簡單, .Net 則複雜些了:

.Net CLR、 進程, 應用程序域, 線程

image

說明:

  • 相似於Java虛擬機,目前CLR都是存在某個進程內,即:進程加載CLR。在 .Net 4.0 中,能夠進程內並存 .Net 4.0 和以前版本, 就是這個的一個典型場景(.Net 4.0 的新特性你: "In-Proc SxS「 就是指這個)。

  • .Net 中引入了應用程序域的概念,這是進程內的進一步的邏輯分區。顯然:一個進程能夠包含多個應用程序域,每個應用程序域中承載一個.NET可執行程序。這樣的好處:

    • 應用程序域是.NET平臺操做系統獨立性的關鍵特性。這種邏輯分區將不一樣操做系統加載可執行程序的差別抽象化了。

    • 和一個完整的進程相比,應用程序域的CPU和內存佔用要小的多。所以CLR加載和卸載應用程序域比起完整的進程來講也快的多。

    • 應用程序域爲承載的應用程序提供了深度隔離。若是進程中一個應用程序域失敗了,其餘的應用程序域也能保持正常。

下面這幅圖就描述了 應用程序域 所處的位置:

image

參看: CLR 全面透徹解析進程內並行 

參考資料:

深究Java虛擬機 
http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=33&Id=302411&PPage=1

關於進程 線程和一些常見的多線程概念 
http://www.cnblogs.com/ChrisWang/archive/2009/09/07/1563675.html

.Net Discovery 系列之五--深刻淺出.Net實時編譯機制(上) 
http://www.cnblogs.com/isline/archive/2009/12/22/1629831.html

linux線程淺析 
http://blog.chinaunix.net/u2/87597/showart.php?id=2178432

Azure Cloud Application 運行方式特色 
http://tech.ccidnet.com/art/1105/20090625/1808497_1.html

讀書感覺 - 程序員 - C#線程參考手冊(多線程技術分析) 
http://www.cnblogs.com/lzhdim/archive/2009/11/27/1611510.html

多線程編程的基礎知識點 
http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html

Java多線程編程總結 
http://lavasoft.blog.51cto.com/62575/27069

相關文章
相關標籤/搜索