進程與線程的基本概念與區別

進程與線程

基本概念

任務調度

爲了更好的提高CPU的利用率,所以採用了任務調度。任務調度也就是把任務排序,當一個任務不佔用CPU的時候,去執行另一任務。總之實現CPU的最大利用。

特點
  • 採用時間片輪轉的搶佔式調度任務輪流執行
  • 併發執行:宏觀並行,微觀串行

image-20200316121445109

如上圖所示,任務1執行完之後,接着就是任務2,然後是任務3。因爲任務執行的速度很快,所以我們在微觀上可以看做是串行執行,也就是每一時刻只有一個任務執行。但在宏觀上,我們可以認爲是並行執行。

比如殺軟進行病毒查殺時,查毒軟件進程在下載更新病毒庫(A)的同時要進行殺毒(B)

A----B-----A----B

A B交替佔用CPU, 由於時間非常短,所以對用戶來說宏觀上感覺在下載和查毒同時進行。而實際執行爲串行執行

進程

進程就是正在運行的程序,程序的動態執行過程。以QQ爲例,我們下載的時候,它是一個安裝文件。打開之後它就是一個進程。

進程是資源調度和分配的基本單位。計算機給運行的程序分配資源時,比如分內存,設備,是按照進程來分配的。

進程之間是相互獨立的。一個程序可以在一臺機器上擁有多個進程

線程

image-20200316111402267

爲什麼引入線程?

因爲進程之間是相互獨立的,切換代價太大,所以考慮進程內部併發執行。

線程

將一個進程劃分爲若干個獨立的執行流,每一個執行流均稱爲一個線程。可以把進程形象的看作一個車間,而把線程看作工人

線程是CPU調度和分配的基本單位。

進程與線程的關係
  • 線程是程序執行的最小單位,進程是系統分配資源最小單位
  • 一個進程由一個或多個線程組成
  • 進程之間相互獨立,同一進程下的各個線程之間共享程序的內存空間(包括代碼段,數據集,堆等)及一些進程級的資源。某進程內的線程在其他進程不可見
  • 調度和切換:線程上下文切換比進程上下文切換要快得多;線程只佔用了cpu和少量寄存器,切換比較容易。
在IDE中觀察線程和進程
 static void Main(string[] args)
        {
            string str=Console.ReadLine();
            Console.WriteLine(str);
            Console.ReadLine();
        }

設置斷點

image-20200316121355133
然後觀察線程和進程窗口

image-20200316120734893

進程

image-20200316113844413
線程

image-20200316121052582

這裏注意到,默認會爲我們創建一個主線程。因爲沒有線程,就沒有進程,程序就運行不起來。

邏輯內核的數量

利用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章