進程、線程與JVM、CLR
進程和線程的關系:
網上有一副很經典的圖可以讓我們來理解進程和線程的關系:
下面這副圖是一個雙向多車道的道路圖,假如我們把整條道路看成是一個“進程”的話,那么圖中由白色虛線分隔開來的各個車道就是進程中的各個“線程”了。
這副圖出自:http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html
一些說明:
-
這些線程(車道)共享了進程(道路)的公共資源(土地資源)。
</li> -
這些線程(車道)必須依賴于進程(道路),也就是說,線程不能脫離于進程而存在(就像離開了道路,車道也就沒有意義了)。
</li> -
這些線程(車道)之間可以并發執行(各個車道你走你的,我走我的),也可以互相同步(某些車道在交通燈亮時禁止繼續前行或轉彎,必須等待其它車道的車輛通行完畢)。
</li> -
這些線程(車道)之間依靠代碼邏輯(交通燈)來控制運行,一旦代碼邏輯控制有誤(死鎖,多個線程同時競爭唯一資源),那么線程將陷入混亂,無序之中。
</li> -
這些線程(車道)之間誰先運行是未知的,只有在線程剛好被分配到CPU時間片(交通燈變化)的那一刻才能知道。
</li> </ul>線程的生存期
當安排執行一個線程后,這個線程會經歷幾個狀態,包括:未啟動,激活,睡眠狀態等,如下圖顯示的線程的生存期:
此圖來自《c#線程參考手冊》,這本書的電子版在CSDN有下載:http://d.download.csdn.net/down/1493065/phs415
如果使用Java,看下面圖更容易點,其實他們描述的意思完全一樣:
JVM 與 進程,線程
Java編寫的程序都運行在在Java虛擬機(JVM)中,每用java命令啟動一個java應用程序,就會啟動一個JVM進程。在同一個JVM進 程中,有且只有一個進程,就是它自己。在這個JVM環境中,所有程序代碼的運行都是以線程來運行的。JVM找到程序程序的入口點main(),然后運行 main()方法,這樣就產生了一個線程,這個線程稱之為主線程。當main方法結束后,主線程運行完成。JVM進程也隨即退出。
如下圖所示:
上述資料參看:
JVM和JRE淺談
http://blog.csdn.net/liufeng_cp/archive/2008/07/18/2674317.aspxJava多線程編程總結
http://lavasoft.blog.51cto.com/62575/27069Java 由于要考慮跨平臺,所以它跟進程,線程的模型比較簡單, .Net 則復雜些了:
.Net CLR、 進程, 應用程序域, 線程
說明:
-
類似于Java虛擬機,目前CLR都是存在某個進程內,即:進程加載CLR。在 .Net 4.0 中,可以進程內并存 .Net 4.0 和之前版本, 就是這個的一個典型場景(.Net 4.0 的新特性你: "In-Proc SxS“ 就是指這個)。
</li> -
.Net 中引入了應用程序域的概念,這是進程內的進一步的邏輯分區。顯然:一個進程可以包含多個應用程序域,每一個應用程序域中承載一個.NET可執行程序。這樣的好處:
</li>-
應用程序域是.NET平臺操作系統獨立性的關鍵特性。這種邏輯分區將不同操作系統加載可執行程序的差異抽象化了。
</li> -
和一個完整的進程相比,應用程序域的CPU和內存占用要小的多。因此CLR加載和卸載應用程序域比起完整的進程來說也快的多。
</li> -
應用程序域為承載的應用程序提供了深度隔離。如果進程中一個應用程序域失敗了,其他的應用程序域也能保持正常。
</li> </ul> </ul>下面這幅圖就描述了 應用程序域 所處的位置:
參看: 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.htmllinux線程淺析
http://blog.chinaunix.net/u2/87597/showart.php?id=2178432Azure 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.htmlJava多線程編程總結
來自:http://my.oschina.net/u/2338362/blog/403293
http://lavasoft.blog.51cto.com/62575/27069
-
-