文章目錄
- 一. 進程
- 🍎什么是程序?什么是進程?
- 🍋程序的并發性和并行性
- 🍉進程誕生的原因
- 🍑PCB
- 二. 線程
- 🍥什么是線程?
- 🍦為什么引入線程?
- 三. 進程與線程的區別與聯系
一. 進程
🍎什么是程序?什么是進程?
程序:程序是一系列有序指令的集合,用于告訴計算機要執行何種操作及操作的先后順序。這些指令包括進行各種計算、數據處理、輸入輸出等操作,用來完成特定的任務或解決特定的問題。
進程:進程從不同的角度可以有不同的定義。(1) 進程可以認為是程序的一次執行(2) 進程是具有獨立功能的程序在一個數據集合上運行的過程,它是系統進行資源分配的基本單位。
程序 VS 進程:
- 進程是一個正在執行的程序,它有一定的生命周期,包括進程的創建、調度、銷毀,具有動態性。
- 程序相當于一個可執行程序,是一組有序指令的集合,它存放在某種介質上,一個沒有執行的程序本質上并不具有活動性,是靜態的。
🍋程序的并發性和并行性
程序的并行性是指兩個或多個程序在同一時刻處于運行狀態。如:在一條同向多車道的公路上,同一時刻可以有多輛車經過同一個地點。
程序的并發性是指兩個或多個程序在同一時間間隔內發生。如:在一條單車道的公路上,若有多輛車想經過一個地點,只能按照一定的順序依次通過。
🍉進程誕生的原因
早期的操作系統都屬于單核CPU,這意味著計算機在同一時刻只能同時運行一個程序,且只有一個程序運行結束后后面的程序才能依次執行。
為了解決多個程序需要并發執行的問題,操作系統引入了進程的概念,在操作系統中每個正在運行的程序都被抽象成“進程”的概念,每個創建的進程都有一個對應 進程控制塊(PCB process control block),PCB中含有一些特定的屬性,當一個進程在運行過程中出現了優先級更高的進程,則當前程序所有運行的狀態都通過PCB進行保存,等到進程下次執行就會恢復原先在狀態,以此實現對多個進程的調度。
由于操作系統對進程調度的速度很快,多個進程在一段小的時間間隔內被調度了非常多次,因此在宏觀上屬于“并行執行”;而在微觀的角度上,單核CPU的計算機在一個時刻只能運行一個進程 ,多個進程是依次進行執行的,因此在微觀上屬于“并發執行”。
🍑PCB
前面說到了每個進程都有一個PCB,用于描述一個進程,因此PCB本質上就代表了一個進程,它相當于C語言中的結構體或Java中的類,PCB中主要的屬性如下:
- pid:進程的身份標識,每個進程在同一時刻都有一個唯一pid;一個應用程序的執行可能包含多個進程,即有多個pid。
- 一組內存指針:描述了一個進程所分配的內存空間在哪些位置,每一塊內存空間具體的作用:如存儲程序執行的二進制指令和執行指令所需的數據、程序執行產生的臨時數據等。
- 文件描述符表:描述了一個進程所持有的硬盤資源,由于數據在硬盤上以文件的形式來表示和操作,因此文件描述符表描述了進程關聯了哪些文件,能夠操作你想想文件。
- 進程狀態:描述了一個進程當前的狀態,如運行狀態、就緒狀態、阻塞等待狀態等。
- 進程優先級:決定了進程執行的先后順序。
- 上下文:保存進程當前運行的狀態,以便后續的恢復和執行。
- 記賬信息:記錄了當前進程執行的時間、占用的CUP情況,作為操作系統調度的依據,避免因為一個進程優先級過低而出現線程“餓死”的情況。
二. 線程
🍥什么是線程?
線程是一個比進程更小的基本單位,一個進程可以有多個線程,而一個線程只能存在于一個進程當中。線程是系統調度的基本單位,也稱作“輕量級進程”。
🍦為什么引入線程?
這里先說結論:
- 創建進程的系統開銷比線程大。
- 銷毀進程消耗的時間比線程多。
- 調度進程的時間開銷比線程大。
進程相比于線程的劣勢:
- 一個應用程序的執行可能需要創建多個進程,這多個進程間有時需要進行數據的交換和進程的切換以共同完成某個功能,由于每個進程都擁有各自的PCB,即擁有各自獨立的內存空間、硬件資源、文件描述符表等,因此如果頻繁地對進程調度會產生大量的時間開銷。
- 如果在一段時間內,系統上有較多的應用程序需要同時運行,操作系統就需要在剩余資源中尋找合適大小的位置并分配;進程結束時再分別進行回收,因此效率較低。
引入線程的優勢:
- 一個進程創建時可以預先申請一塊較大且合適的資源,進程創建時至少擁有一個線程,當需要完成某個功能時,可以在進程中分配已有資源,直接創建新的線程,其中每個線程擁有各自PCB,包括狀態、優先級、上下文等。當系統進行調度時,不需要切換進程,只需在當前進程保存線程的部分信息,因此大大提高了系統調度的效率。
- 線程間共用進程的內存空間和硬件資源等,創建線程時不需要重新申請,因此創建/銷毀的效率更高。
三. 進程與線程的區別與聯系
概念上:進程是系統資源分配的基本單位,線程是系統調度的基本單位。
包含關系:一個進程可以包含多個線程,而一個線程只能從屬于一個進程。
擁有資源:每個進程擁有獨立的內存空間和其他資源,而多個線程共享進程內的資源。
獨立性:每個進程擁有獨立的資源,因此多個進程間的信息不能被直接訪問,進程間的運行一般不會相互影響;線程共享進程的資源,多個線程可能因為資源的爭搶產生死鎖等問題。
上下文切換:進程間擁有獨立的資源,因為進程間切換需要保存和加載上下文信息,因此系統開銷較大;線程共享進程的內存和資源,因此線程間切換開銷較小。
以上就是本篇文章的全部內容了,如果這篇文章對你有些許幫助,你的點贊、收藏和評論就是對我最大的支持。
另外,文章可能存在許多不足之處,也希望你可以給我一點小小的建議,我會努力檢查并改進。