操作系統爲什麼這麼難

導讀

對於計算機行業的朋友們來說,操作系統絕對是一門能讓你學吐血的課程,這是爲什麼呢?我認爲有這些原因:第一 ,專業名詞晦澀難懂;第二,它摸不着,你要想看,倒是能看見,但你看的懂嗎?正是這兩個原因讓我們跪倒在了操作系統面前。但彆着急,本文會以一種易理解的描述來給你呈現一個操作系統的真面目,同時讓你理解一些常見的專業名詞和操作系統相關的概念。

一臺電腦的啓動

一臺電腦的啓動大概包含這麼幾個部分:電源 -> BIOS -> 自檢 -> 加載啓動引導程序 -> 執行具體的操作系統啓動程序 -> 啓動完成
BIOS:基本的輸入輸出系統,用來檢測各硬件設備,如沒問題,會到指定的地方加載操作系統啓動難引導程序,它是寫死在硬件上的一個軟件。

主角出現

電腦啓動後,我們的主角也就閃亮登場了,首先要明白我們的主角操作系統也不過就是一個軟件而已
和我們平常看到的軟件沒什麼區別,它不過也是用來完成一些特定功能的程序擺了,只是它功能有點強大,完成的任務有點與衆不同而已。說到它的功能那就是 管理計算機的硬件和應用,可以這麼理解對下管理計算機硬件,對上爲我們的應用服務。
在這裏插入圖片描述

一些專業名詞

操作系統內核

可簡單理解爲管理計算機硬件的代碼部分,是操作系統最關鍵、最核心的部分。

用戶態和內核態

這兩個名詞可理解爲操作系統的兩個不同等級狀態,操作系統在內核態它可以直接訪問一些關鍵的、底層的CPU指令,它的權利更大,更加的核心;而在用戶態,當你需要訪問底層CPU指令時需要經內核的同意,即需要從用戶態切換到內核態來訪問,以此來增加操作系統的健壯性,可以說這是操作系統的兩個權利等級,一個權利大,一個權利小。

進程 線程 纖程(協程)

簡單的理解 進程就是運行中的程序,線程就是進程中的不同執行路徑;專業的說 進程是操作系統資源分配的基本單位,而線程是調度執行的基本單位,進程擁有獨立的內存空間,線程共享進程的內存空間。
舉個簡單的例子:運行中的bilibili爲一個進程,視屏播放 和 發彈幕就是進程中的兩個線程。
協程爲用戶態的線程,線程中的線程,協程間的切換不需要經過操作系統 (切換代價較小 適用於不需要和內核交互 高併發 多計算的場景)
在這裏插入圖片描述

1.在Linux裏進程和線程區別不大,創建線程即創建進程 只是和父進程共享內存空間。
2.資源:獨立的內存空間、內核數據結構(PCB Linux系統爲每個進程維護一個PCB)
在這裏插入圖片描述

殭屍進程 孤兒進程

子進程消亡,但父進程還沒有釋放PCB的進程稱爲殭屍進程
父進程消亡 子進程還存在的進程稱爲孤兒進程 (父進程消亡後會出現新的父進程)

進程調度

涉及的問題
哪個進程運行?什麼時候運行?運行多長時間?
進程分類
IO密集型 CPU密集型
優先級
Linux系統將進程又分爲實時進程和普通進程,二者可這樣理解,實時進程相當於急診,普通進程爲一般情況,實時進程的優先級高於普通進程。
調度策略
不同的操作系統有着不同的調度策略,Linux通常按優先級的時間比分配,其他操作系統通常是按時間片分配。

中斷

中斷是一個信號,可分爲硬中斷和軟中斷,當我們做了一些操作後需要操作系統給予我們一些實時反饋時,計算機採取的一種措施或者說方式,就是中斷機制。如當我們敲擊鍵盤時,此時相當於我們給計算機發送了一箇中斷信號,當計算機收到這種信號後,會做出反饋。

硬中斷

鍵盤、打印進、磁盤等硬件引起的中斷稱爲硬中斷 硬件和操作系統打交道的過程。

過程簡易描述: 敲擊鍵盤 —> 發出中斷信號 —> 中斷到達CPU —> 內核 —> 中斷處理程序 —> 處理 給出反饋。

軟中斷

程序引起的中斷稱爲軟中斷 有系統調用時引發 軟件想要通過操作系統進行硬件方面的操作。

過程簡易描述: 程序發出系統調用 —> 發出80中斷(軟中斷信號)—> 內核 —> 中斷處理(觸發中斷時會傳遞一些參數到達內核 內核根據參數做出反饋 一般 會將參數等數據加載到CPU寄存器中 執行具體的系統調用)
在這裏插入圖片描述

內存管理

操作系統中一個關鍵的部分就是內存管理,那麼操作系統如何進行內存管理,使得各程序能夠井然有序的執行而不發生錯誤呢?

內存管理的發展

對於DOS時代,操作系統一次只允許一個程序運行,也就是說內存中只會加載一個程序進來,因此也不會有太多的問題。隨着計算機和軟件的發展,計算機開始支持多程序運行,此時,內存會加載進多個程序,當多個程序同時進入內存時就會出現內存不夠用、程序間相互影響的問題,這對於操作系統來說就是個噩耗,慢慢的慢慢的 爲了解決這種問題,出現了內存分頁 和 虛擬內存 ,也就是今天的操作系統種內存管理使用的方法,下面我們仔細介紹什麼是內存分頁?什麼是虛擬內存?

內存分頁(解決內存空間不足的問題)

以往人們通常會將程序整個加入內存,但其實我們大多數時間需要的不是一整個程序,而只是程序的一部分,這樣就會出現內存的浪費,而且程序有大有小,這種分配方式將會使得內存出現許多的碎片內存的利用率非常的低。爲了解決上述的兩個問題,人們提出了內存分頁的概念,即 將內存劃分爲一個個的小塊,每塊大小4KB(當然也可劃分其他大小) 同時將我們的程序也劃分爲和內存塊一樣大小的程序段,當我們需要哪段程序時就將哪段加載到內存,這種方式即爲內存分頁。這樣使得內存的利用率顯著提高。

或許這時候有人會問,那麼當我的程序需要新的程序段 而內存已經佔滿時,會如何呢?這個問題就引出了內存分頁中使用的一個著名算法LRU (最近最久未使用) 當上述問題出現時,內存將會根據這種算法找出最近最久沒有使用的內存塊,將該塊程序移到swap分區(專門用來做交換的交換分區 在硬盤中)再將需要加載的程序段加載進來。

虛擬內存(解決程序互相影響問題 同時也保護了物理內存空間)

解決了內存空間不足的問題後,那麼程序互相影響問題又該如何解決呢?這就引出了虛擬內存的概念
虛擬內存 即操作系統爲每個進程都創建了一個虛擬的內存空間(假的,邏輯上的一塊空間,實際並不存在)。
實際上程序段還是在物理內存中放着,只是當我們需要運行該程序時 需要做複雜的地址的轉換,找到真正的物理內存
在這裏插入圖片描述

注:地址轉換的過程極爲複雜,暫時不去了解。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章