“吳大哥,什麼是操作系統?” 陳小速急切地想知道答案。
吳進并沒有直接回答這個問題,而是問道:“小速,你有沒有想過,如果沒有操作系統,程序會怎麼運行?”
“沒有操作系統?那程序能運行得起來嗎?” 陳小速覺得有些不可思議。
“怎麼不行呢?” 吳進說着笑了起來,“還記得我們讨論CPU的結構與指令嗎,程序不就是一條條指令的集合嗎?”
“啊,對,想起來了。” 陳小速拍了拍腦袋,接着說,“但那樣的話,計算機就很難操作和使用了啊。比方說我要做最簡單的加法運算,就需要把四條指令裝載到内存裡,然後讓CPU去計算。但一次隻能執行一個程序,要執行另一個程序,那還得斷電把數據擦除,再加載新程序。太麻煩了吧。”
“對嘛,你這不是道出了操作系統的一個本質特征嗎?它就是機器與應用之間的界面,也可以叫做接口。當然,還可以看成是機器與人之間的窗口,微軟的Windows可謂取了個很貼切的名字。”
“嘿,吳大哥,我明白你的意思了,” 陳小速興奮起來,“就是說操作系統向用戶屏蔽了對硬件操作的細節,這讓普通用戶可以專注于做自己的工作。那這麼說,操作系統對于計算機的普及來說太重要了啊,沒有它的話,計算機的能力發揮不出來啊。”
“非常正确,接下來我們說一說操作系統的兩大核心功能吧。”
進程管理
“還是先從咱們上面讨論的内容裡,提一個問題吧。就是小速你剛才說的,如果沒有操作系統,那麼程序隻能單獨運行,而且切換也很麻煩。那麼有了操作系統,程序可以怎麼運行呢?” 吳進提出了問題。
這一次,陳小速沒有馬上開口,而是埋頭思考起來,吳進也沒有打擾他。過了十分鐘,陳小速才擡起頭來,有些猶疑地說:“我胡亂說兩句啊。就是操作系統可以先把磁盤上的程序文件加載到内存裡,然後交給CPU去一個接一個地執行,像排隊一樣,是嗎?”
“原理上是沒錯,但小速你用電腦的時候,會不會一邊浏覽網頁,一邊聽音樂呢?”
“肯定的啊。對啦,問題就在這兒了,CPU一次隻能讓一個程序執行,多個程序同時在運行,這是怎麼做到的?” 陳小速馬上意識到了這個問題。
“這就是操作系統的一個基本功能了,就是進程管理。” 吳進開始詳細說明。
程序本身是一組指令的集合,一般是以文件的形式存在磁盤上。當程序被選中執行時,會進入作業狀态。作業過程是指程序被操作系統納入進程管理中,可能是在執行或者待執行狀态,直到程序完全退出,作業過程也就終止了。
作業如果被操作系統選中加載到内存中,那麼此時就可以稱之為進程了。進程顧名思義,就是正在運行中的程序,它要麼是占據CPU在執行,要麼就是等待CPU被釋放。
進程有三個狀态,分别是就緒态、運行态和等待态。就緒态指的是資源都已經得到滿足,就等着占用CPU進行運算了。而在CPU上運行的,則就是運行态。當産生中斷或者有I/O請求時,進程會轉到等待态,一直等到資源滿足了,才再次進入就緒态。
需要注意的是,運行态有可能轉到就緒态或等待态,但等待态隻能轉為就緒态。也就是說,進程必須在就緒态之後,才能進入運行。
有了進程管理,多個程序在宏觀上就可以有同時運行的效果。這還是得益于CPU超快的計算能力,操作系統在一秒内就可以将進程進行億次的切換。那麼對于人類用戶來說,使用計算機的體驗就是并行工作,哪件事都不會耽誤。
吳進說着就畫下了進程調度的流程圖。
進程調度
内存管理看着上面那張圖,陳小速如獲至寶,一直琢磨個不停。吳進說:“好了,小速你回去以後可以有針對性地找資料,去研究進程調度的細節了,我們接下來再讨論操作系統的另一個核心功能吧,就是内存管理。”
“啊,對,内存管理又是幹什麼的?” 陳小速回過神來,提出了這個問題。
“在回答這個問題之前,我先說明一下内存的物理特性。你攢機的時候最關注的内存指标就是容量是吧,例如16G、32G。它的單位是字節,一個G是1024M字節,一M是1024K字節,一K是1024字節,一個字節是8位,你大概可以知道這能容納多少數據。
1G = 1024M
1M = 1024K
1K = 1024Byte
1Byte = 8bit
“内存條本身就像按順序排列的一列水桶,每個桶子都有一個地址,而且可以存放數據。CPU可以通過地址訪問任何水桶,也就是任意一個内存的地址,進行數據的讀取操作。”
陳小速點着頭,這個比方很形象,很好理解。
吳進接着說:“那麼,我就要先提出一個問題了。為了簡化讨論,我們假設現在有一台機器,它的内存空間是1G。而我們這台機器上會同時運行兩個程序,每個程序都要使用1G的内存空間,應該怎麼辦?”
“怎麼辦?這個沒辦法運行吧……” 陳小速脫口而出了這句話,不過看着吳進溫和的笑容,他知道這個回答肯定不對,撓了撓頭,又自己想了會。
陳小速有些信心不足地開口說:“吳大哥,我猜可能也是類似進程管理吧。例如CPU隻有一個,而為了讓多個程序同時運行,就不停地來回切換,像這樣的管理方式?”
“從原理上來看,其實差不多。” 吳進先表示了肯定,“這在操作系統裡,叫做虛拟内存技術。它的原理就是讓每個程序都認為自己可訪問的空間是1G,而且内存地址都是一緻的。隻有在實際運行的時候,才會将程序所需的指令代碼和數據加載至物理内存中。
“當程序要使用内存時,它訪問的是虛拟内存地址,而操作系統會将虛拟内存映射至實際的物理内存。通過這種方式,程序就不必考慮實際運行時,還有多少可用物理内存了,隻要專注于自身的邏輯實現就好。”
“啊,這個原理我弄明白了。” 陳小速一邊點頭一邊說,但他也想到了一個問題,“那操作系統是怎麼把物理内存分配給程序的呢?是一次給一大塊,還是一點一點給?”
“這個問題很好,” 吳進笑着說,“現代操作系統對于内存分配通常都是基于分段與分頁式調度管理。它們也是實現虛拟内存技術的基礎。操作系統會将内存按照固定大小分成塊,這樣的塊被稱為幀。比方說一幀的大小是4KB。”
陳小速在腦海裡浮現出拉開相機膠卷的畫面。
“那麼好了,程序運行需要占用内存,那操作系統就将程序也分片放在4KB的空間中,這稱為頁。借助虛拟内存技術,程序運行時的頁空間是連續的,但映射到幀上是可以不連續的,小速你看下這張圖。” 吳進說着,又畫了一張圖。
分頁管理
陳小速一看就明白了這個意思,吳進接着說:“那分段管理呢,就是将若幹頁合并起來,成為一個段,段的大小也是固定的。邏輯上可以按照子程序劃分,分配段内存給它。然後在子程序内部,又按照分頁方式進行管理。”
陳小速不住地點頭,又問道:“那段大小是固定的,會不會在分配的時候會造成浪費呢?”
“你說得很對,” 吳進發現陳小速果然注意到了這一點,“所以原理說起來簡單,但操作系統在實現的時候就有許多細節要處理好。那就要通過算法來做到,将浪費減小到最少,同時還要保證穩定性和健壯性。”
結語“小速,今天我們學習了操作系統兩個最核心的功能,進程管理與内存管理。其他還有存儲管理的文件系統、IO系統,用戶界面等方面。希望今天給你開這個頭,你回去以後再繼續學習,逐漸理解操作系統的主要功能和設計哲學。”
“好的,吳大哥。這學習理論和編程實現之間,是不是就像是知道牛頓三大運動定律,和造出能飛上天的火箭之間的區别一樣啊?” 陳小速搔着腦袋問。
吳進不由得哈哈大笑,“真的可以這麼說,但任何一個火箭工程師,也必須從學習三大定律開始,對吧?”
“沒錯,那我這就回去好好把基礎理論學好!” 陳小速下定決心要啃下操作系統的知識來。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!