爲什麼引入進程和線程
在早期的計算機系統中單道批處理系統的程序是順序執行,在內存中僅裝入一道用戶程序,獨佔系統的所有資源,只有在一個系統完成之後才允許裝入另一個系統,這種方式浪費資源,系統運行效率低。
多道批處理系統:同時在內存中裝入多個系統,讓他們同時共享系統資源,併發執行,所以引入了進程的概念。
在80年代中期之前,進程一直是能擁有資源和獨立調度的基本單位,後來人們提出了比進程更小的基本單位——線程,想提高程序併發執行的程度。
進程在併發執行時所需付出的時空開銷:
- 創建進程:系統創建進程時,必須給其分配其必須的所有資源,如內存空間、I/O設備、以及相應的PCB。
- 撤銷進程:撤銷進程時必須對其所佔的所有資源進行回收,再撤銷PCB。
- 進程切換:對進程上下文切換時,需要先保留當前進程的CPU環境,設置新的選中的進程的CPU環境,花費不少處理機時間。
所以提出了線程:輕量級進程的概念。線程是調度和分配的基本單位,因爲其擁有資源較少,當縣城切換時,僅需保存和設置少量寄存器內容,切換代價遠小於進程。
進程和線程的區別
指標 | 進程 | 線程 |
---|---|---|
定義 | 進程的兩個屬性:1.進程是可擁有資源的基本單位 2.進程同時是可獨立調度和分配的基本單位 | 線程是調度和分派的基本單位 |
關係 | 因爲每個進程都有自己的進程地址空間,所以每個進程之間都是獨立的,進程之間的關係可以是父子關係 | 因爲一個進程可以創建多個線程,多個線程除了有自己的一點資源外,都共享進程地址空間中的資源,所以線程之間是平等的,一個進程中只有一個主線程 |
擁有資源 | 進程PCB | 線程可以擁有的資源:線程ID、一組寄存器、棧、errno、信號屏蔽字、調度優先級 |
終止或崩潰時 | 進程終止時,其他進程不會受到影響,因爲每個進程之間是獨立的 | 一個線程崩潰時,其他線程會受到影響,因爲一個線程如果崩潰,很可能會影響進程地址空間中的數據,這樣其它線程也會受影響 |
切換 | 進程切換消耗大 | 線程切換消耗小 |
實現 | fork() | pthread_create() |
引入線程使系統的併發性更好,支持多處理機系統: 對傳統的進程,即單處理進程,不管有多少個處理機,都只能在一個處理及上運行,但多線程進程,可以將一個進程中的多個線程分配到多個處理機上,使它們併發執行,加快了進程的完成。