C# 多線程學習系列一

一、Windows線程的由來  關於操作系統的一些知識

(1)、單個"工作線程"的問題  

早期的Windows沒有線程的概念,整個系統只有一個"工作線程",上面同時跑着操作系統代碼和應用程序代碼.這種方式最大的缺點就是,一個應用程序運行時會霸佔整臺機器(應爲只有一個工作線程),且當它發生死循環時,會造成PC停止工作.如果此時重啓,更shit的是,所有的應用程序都會停止,且丟失數據.

(2)、Windows進程

i、什麼是Windows進程,以及它解決的問題

MS爲了解決單個"工作線程"的問題,設計了新的內核,該內核實現了Windows進程的功能,每個Windows進程(應用程序要使用的資源集合)運行一個應用程序,如下圖:

一個Chrome瀏覽器進程包含了很多子進程(子進程可以共享父進程的資源),後面包含了正在使用的資源集合,包括CPU、內存等.每個進程都有一個虛擬空間地址(PID).

當一個應用程序應爲代碼故障發生卡死等問題,並不會影響其他的應用程序的運行,只需要打開任務管理器,將該進程關閉即可.其他應用程序的數據也不會丟失,因爲它們是彼此獨立的進程.

ii、Window進程的安全性

在Windows中,進程之間不能相互訪問(不包括父子進程),單個進程也無法訪問Windows內核.

iii、關於CPU的問題

雖然Windows進程很好的解決了單個"工作線程"的問題,Windows不會發生一個應用程序崩潰,所有應用程序全都停止且所有運行着的應用程序的數據丟失的情況。但是如果PC只有一個CPU,當CPU本身發生死循環等問題,還是會導致PC停止工作.

iv、什麼是Windows線程,以及Windows線程解決的問題

MS爲了解決單個進程執行異常,導致CPU停止工作的問題,設計了Windows線程,它的作用是對CPU進行虛擬化,Windows會給每個Windows進程分配一個Windows線程,該線程相當於一個虛擬的CPU(包含CPU所有的功能),如果應用程序的代碼進入死循環,相關進程會被停止,但是其他的應用程序進程並不會停止,會繼續執行.因爲它們擁有自己的線程(虛擬CPU).

2、Windows線程的消耗

雖然Windows線程保證了Windows的可靠性和健壯性,但是天下沒有免費的午餐,隨之帶來的肯定是其他的PC資源消耗.這裏不想介紹太多操作系統級別的東西,只說一些直觀的我們能看到的.就以我的筆記本爲例,打開任務管理器如下:

我的筆記本此時跑着176個進程,所以理論上至少有176個線程,但是實際卻有2103個線程,平均每個進程12個線程.下面是我筆記本的配置

雙核,理論上最優的配置是,只有兩個線程,應爲涉及到線程上下文切換(從一個線程上下文切換到另一個上下文),而上下文的切換的性能代價是十分大的.

我的CPU利用率爲7%,說明93%的時間,這2103個線程啥事都沒幹,嚴重的浪費了我的內存.如果這個時候開啓了遠程桌面服務,假設10個用戶連了我的筆記本,所有的開銷會翻倍.

當然雖然線程的開銷很大,但是相比於創建進程,開銷相比較小.但是開發應用程序的時候,還是要合理的使用線程!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章