進程與線程
基本概念
任務調度
爲了更好的提高CPU的利用率,所以採用了任務調度。任務調度也就是把任務排序,當一個任務不佔用CPU的時候,去執行另一任務。總之實現CPU的最大利用。
特點
- 採用時間片輪轉的搶佔式調度任務輪流執行
- 併發執行:宏觀並行,微觀串行
如上圖所示,任務1執行完之後,接着就是任務2,然後是任務3。因爲任務執行的速度很快,所以我們在微觀上可以看做是串行執行,也就是每一時刻只有一個任務執行。但在宏觀上,我們可以認爲是並行執行。
比如殺軟進行病毒查殺時,查毒軟件進程在下載更新病毒庫(A)的同時要進行殺毒(B)
A----B-----A----B
A B交替佔用CPU, 由於時間非常短,所以對用戶來說宏觀上感覺在下載和查毒同時進行。而實際執行爲串行執行
進程
進程就是正在運行的程序,程序的動態執行過程。以QQ爲例,我們下載的時候,它是一個安裝文件。打開之後它就是一個進程。
進程是資源調度和分配的基本單位。計算機給運行的程序分配資源時,比如分內存,設備,是按照進程來分配的。
進程之間是相互獨立的。一個程序可以在一臺機器上擁有多個進程
線程
爲什麼引入線程?
因爲進程之間是相互獨立的,切換代價太大,所以考慮進程內部併發執行。
線程
將一個進程劃分爲若干個獨立的執行流,每一個執行流均稱爲一個線程。可以把進程形象的看作一個車間,而把線程看作工人。
線程是CPU調度和分配的基本單位。
進程與線程的關係
- 線程是程序執行的最小單位,進程是系統分配資源最小單位
- 一個進程由一個或多個線程組成
- 進程之間相互獨立,同一進程下的各個線程之間共享程序的內存空間(包括代碼段,數據集,堆等)及一些進程級的資源。某進程內的線程在其他進程不可見;
- 調度和切換:線程上下文切換比進程上下文切換要快得多;線程只佔用了cpu和少量寄存器,切換比較容易。
在IDE中觀察線程和進程
static void Main(string[] args)
{
string str=Console.ReadLine();
Console.WriteLine(str);
Console.ReadLine();
}
設置斷點
然後觀察線程和進程窗口
進程
線程
這裏注意到,默認會爲我們創建一個主線程。因爲沒有線程,就沒有進程,程序就運行不起來。
邏輯內核的數量
利用System.Environment
類提供的靜態ProcessorCount
屬性,可獲取本機可用邏輯內核的數量。
StringBuilder sb = new StringBuilder(); //新建一個可變字符串sb
sb.AppendLine($"本機的邏輯CPU內核數量:{Environment.ProcessorCount}");
sb.AppendLine("是否爲64位操作系統:" +( Environment.Is64BitOperatingSystem ? "是" : "否"));
sb.AppendLine("是否爲64位進程:" + (Environment.Is64BitProcess ? "是" : "否"));
sb.AppendLine($"系統已啓動:{Environment.TickCount}ms");
Console.WriteLine(sb);
Console.ReadLine();
結果如下:
本機的邏輯CPU內核數量:8
是否爲64位操作系統:是
是否爲64位進程:否
系統已啓動:151708656ms