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