Part V Threading
25 Thread Basics .
在這個章節,我會介紹一些關於線程的基礎,包括他們的概念和用處。我還會解釋為什麼微軟創造線程、CPU趨勢、CLR線程和windows線程的關係、使用線程的開銷、windows是如何安排線程的、微軟.NET架構類中線程的屬性等等。
這本書的第五部分,“線程”將想你講述windows和CLR是如何一起工作來提供一個線程架構的。我希望在你讀完這章的時候,你能夠通過學到的知識使用線程高效的構建你的程式。
25.1 Why Does Windows Support Threads? 為什麼Windows支援線程
追溯到很久以前,作業系統是沒有提供線程這個概念的。實際上,整個系統只有一個線程,包括作業系統代碼和應用程式代碼。一個線程的問題就是如果一個花費時間很長的任務會阻止其他任務的運行。比如,在16位windows 的年代,為了列印一個檔案而佔用了整台機器是十分常見的,導致OS和其他應用程式停止回應。而且有時候應用程式裡如果有bug,會導致無限迴圈從而機器就無法操作了。
基於這個原因,終端使用者沒有辦法只能重新啟動電腦。當然,使用者是不喜歡這樣的,因為所有正在啟動並執行應用程式停止了;更重要的,這些應用程式中正在處理的資料都被拋出記憶體和丟失。微軟知道,要在電腦行業處於領先地位,16位 Windows 還不夠好,因此他們的目標是構建一個新的作業系統,以滿足企業和個人的需要。這個新的作業系統,必須穩健,可靠,可擴充,安全,它必須提高16位Windows的許多不足之處。這個作業系統核心原本在Microsoft Windows NT 中附帶。多年來,這個核心已經有許多的調整,並添加了很多功能。這個最新版本的核心附帶在微軟用戶端和伺服器的Windows作業系統的最新版本。
當微軟設計這個作業系統的核心,他們決定在所謂的進程(process)運行每一個應用執行個體。進程是由一個應用程式的一個執行個體要使用的資源的集合。每個進程都有一個虛擬位址空間,確保代碼和一個進程使用的資料是無法訪問另一個進程。這使得應用程式執行個體健壯,因為一個進程不能破壞被另一個進程使用的代碼或資料。此外,進程是無法訪問作業系統的核心代碼和資料的,因此,它不可能對應用程式代碼破壞作業系統代碼或資料。所以,現在,應用程式代碼不能破壞其他應用程式或作業系統本身,整個計算體驗,是為終端使用者提供更好的多。此外,該系統更安全,因為應用程式代碼不能訪問另一應用程式或作業系統本身的使用者名稱,密碼,信用卡資訊或其他敏感資訊。
這很好,但CPU本身呢?如果一個應用程式進入一個無限迴圈該怎麼辦?如果只有一個CPU的機器中,然後它執行的無限迴圈,不能執行其他任何東西,因此,儘管資料無法被損壞,更安全,系統仍然可恩那個停止回應。微軟需要解決這個問題,問題的答案就是線程。作為一個Windows的概念,其任務是虛擬化CPU。Windows為每個進程中提供線程自己專有的線程(這功能類似於一個CPU,姑且當作一個邏輯CPU),如果應用程式代碼進入一個無限迴圈,那麼與之相關的代碼就會被凍結,但其他進程(其中有他們自己的線程)不凍結,他們繼續運行!