網上有一副很經典的圖可讓咱們來理解進程和線程的關係:php
下面這副圖是一個雙向多車道的道路圖,假如咱們把整條道路當作是一個「進程」的話,那麼圖中由白色虛線分隔開來的各個車道就是進程中的各個「線程」了。html
這副圖出自:http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html java
一些說明:linux
這些線程(車道)共享了進程(道路)的公共資源(土地資源)。程序員
這些線程(車道)必須依賴於進程(道路),也就是說,線程不能脫離於進程而存在(就像離開了道路,車道也就沒有意義了)。編程
這些線程(車道)之間能夠併發執行(各個車道你走你的,我走個人),也能夠互相同步(某些車道在交通燈亮時禁止繼續前行或轉彎,必須等待其它車道的車輛通行完畢)。c#
這些線程(車道)之間依靠代碼邏輯(交通燈)來控制運行,一旦代碼邏輯控制有誤(死鎖,多個線程同時競爭惟一資源),那麼線程將陷入混亂,無序之中。多線程
這些線程(車道)之間誰先運行是未知的,只有在線程恰好被分配到CPU時間片(交通燈變化)的那一刻才能知道。併發
當安排執行一個線程後,這個線程會經歷幾個狀態,包括:未啓動,激活,睡眠狀態等,以下圖顯示的線程的生存期:spa
此圖來自《c#線程參考手冊》,這本書的電子版在CSDN有下載:http://d.download.csdn.net/down/1493065/phs415
若是使用Java,看下面圖更容易點,其實他們描述的意思徹底同樣:
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.aspx
Java多線程編程總結
http://lavasoft.blog.51cto.com/62575/27069
Java 因爲要考慮跨平臺,因此它跟進程,線程的模型比較簡單, .Net 則複雜些了:
說明:
相似於Java虛擬機,目前CLR都是存在某個進程內,即:進程加載CLR。在 .Net 4.0 中,能夠進程內並存 .Net 4.0 和以前版本, 就是這個的一個典型場景(.Net 4.0 的新特性你: "In-Proc SxS「 就是指這個)。
.Net 中引入了應用程序域的概念,這是進程內的進一步的邏輯分區。顯然:一個進程能夠包含多個應用程序域,每個應用程序域中承載一個.NET可執行程序。這樣的好處:
應用程序域是.NET平臺操做系統獨立性的關鍵特性。這種邏輯分區將不一樣操做系統加載可執行程序的差別抽象化了。
和一個完整的進程相比,應用程序域的CPU和內存佔用要小的多。所以CLR加載和卸載應用程序域比起完整的進程來講也快的多。
應用程序域爲承載的應用程序提供了深度隔離。若是進程中一個應用程序域失敗了,其餘的應用程序域也能保持正常。
下面這幅圖就描述了 應用程序域 所處的位置:
參看: 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