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