1. 前言
從宏觀的角度來看,操作系統就是我們日常使用的 Windows、MacOS、Linux 這類的系統,但是這種直觀的用戶交互界面只是操作系統的一小部分功能,操作系統如何決定系統的資源調度、如何處理內存的分配以及如何管理網絡和文件系統,這些都是隱藏在用戶界面之下的內容。
從課程設計的角度來看,操作系統(Operating System)是計算機專業的核心專業課程,所以可以用來衡量候選人的計算機基本功。
對于后端程序員,如果是使用 Java 語言,Java 中的多線程會涉及到進程和線程的關系,這是操作系統中的概念。如果使用 C++ 語言,那么無法避免內存分配和管理,這也是操作系統中的基礎概念,因此操作系統是校招面試中的核心之一。
2. 進程和線程
面試官提問: 操作系統中的進程和線程有什么區別?
題目解析:
進程和線程的區別是操作系統面試相關的出現頻率最高的題目,沒有之一。
在闡述進程和線程的定義之前,最好能夠想清楚在操作系統中為什么會出現進程這個概念。
2.1 進程的產生背景
我們希望操作系統能夠同時處理多個任務,例如在播放網易云音樂的同時,也能在微信上聊天。計算機的核心處理硬件是 CPU,如果計算機只有一個 CPU,那么播放音樂和處理聊天軟件都需要這個 CPU 去執行運算邏輯,那如何做到時間上的同時處理?答案是 CPU 在多個邏輯任務之間來回切換,因為切換速度太快,所以看起來做到了并發執行。
傳統操作系統的任務調度采用時間片輪轉的方式,在執行一個任務達到時間限制時會暫停處理,然后切換到處理下一個任務。每一個任務執行的時間間隔就是一個時間片,被執行的任務處于運行狀態,被暫停的任務處于就緒狀態,如圖所示:
2.2 進程和線程的區別
首先給出進程和線程的基本定義:
- 進程(Process) :是操作系統任務調度的基本單元, 目的是為了實現操作系統的并發。
- 線程(Thread) :線程是進程的子任務,是進程中實際運行的任務,線程是程序執行的最小單元。
然后分析兩者之間的主要區別:
(1)包含關系:一個線程肯定歸屬于一個進程,但是一個進程可以包含多個線程。
(2)內存管理:操作系統會給進程分配獨立的內存空間,但是一個進程下的多個線程共享內存空間。以 Java 編程為例,同一個 main 函數進程下的多個線程共享代碼段(代碼和常量),以及數據段(全局變量和靜態變量),這些都是共享的內存空間,不過需要注意,每個線程會有獨立的運行??臻g。
(3)單元定義:從內存分配的角度就能看出,進程是資源分配的最小單元,線程是 CPU 執行的最小單元。
(4)系統開銷:創建進程和線程的系統開銷是不同的,因為在創建和銷毀進程時,操作系統需要分配和回收內存資源,創建線程不需要切換整體內存空間,所以創建進程的系統開銷遠大于創建線程;在切換進程時需要保存 CPU 運行的上下文,切換線程只需要切換 CPU 中少數寄存器的內容,所以切換進程的系統開銷也遠大于切換線程。
(5)穩定性分析:因為不會共用內存空間,所以一個進程掛了對另外的進程影響很小,但是同一進程下的線程是共享內存的,所以一個線程掛了,會影響到其他線程。
(6)通信:因為不同進程處于不同的內存空間,所以通信方式比較麻煩,具體方式將在之后的小節介紹。同一進程下的線程之間通信方式相對簡單,因為共享內存,可以讀寫相同的內存空間。
3. 小結
本章節介紹了操作系統中進程的起源原因,以及從操作系統內存管理的角度分析了進程和線程之間的區別。