iT邦幫忙

0

【小白馬的OS筆記】(6) 超善良又耐心的助教教學,天剋科目終於要出現轉機了?

之前提到說小白馬修各種資工課程都順利過關,
唯讀「作業系統」這門課是自己的剋星,
然後…經過了多次小考之後,
題目都是慘烈的不會寫。

今天登門拜訪找助教領取自己的考卷,
詢問正確解答以及相關的觀念,
助教大概被觀念不通的小白馬纏著問了一個多小時吧…
還好小白馬的助教是心地非常善良又熱忱教學的助教,
為小白馬講解觀念,將我各個章節破碎的觀念拼湊起來,
讓我心中對作業系統的觀念能漸漸成形,
拼湊為一幅較完整的拼圖。
(不過內容有點多,還需要花時間整理才有辦法完整分享出來xdd)

給助教真誠的感謝,在整理小考題目之前

總之若我的助教有幸看到我的文的話,我想告訴他,
「謝謝助教這麼熱心的教學,觀念講解非常清楚,
也願意讓我嘗試表達自己的觀念,
讓我從互動中學習釐清不懂的地方。
今天第一次對OS有較完整的認識,
我深深感到聽君一席話,勝讀十年書呢。」
當然這番話我也直接告訴本人了,
只是小白馬真誠的想記下這值得感動的時刻。

珍惜學生時光

真的…在學生時代有老師和助教能指導自己是很幸福的一件事,
若是在職場上的話,恐怕有問題只能自己解決了吧?
遑論可能老闆交辦任務給自己,
可能連標準答案都沒有。
如果自己現在不好好珍惜可以跟助教、老師虛心請教學習的機會,
恐怕未來n年已經在職場上工作的自己,
大概會想時空穿越跳回來給自己講這些大道理了…
小白馬是「時間穿越」系列題材的動漫、電影迷,
人們常常想要有後悔藥,好好感受珍惜現在的重要性吧!
雖然小白馬現在寫的OS筆記知識非常零亂還不足以教人,
但小白馬期許自己在學期末時,
這系列可以升級成為【小黑馬超好懂的OS觀念教學】之類的…

小考重點考題整理(標準答案經助教認證過)

  1. Why multi-core processors may have cache(快取記憶體) coherence(一致性) problem?
    【解析】其實一開始小白馬根本連題目在問啥都看不懂。跟助教聊過後知道,core是CPU的核心,比如說我們常說的4核心CPU指的是CPU上面有四個core,而我們寫好的程式(process)會被放在CPU的core執行。那什麼是「cache coherence problem」勒?在電腦可以跑很多支程式情況下,如果process1跑在第一個core上,把資料放在第一個core的cache上,然後另一個程式,process2又跑在第一個core上,拿了process1的資料,那資料就錯掉了。所以其實要把這題答好的關鍵也只要寫幾個關鍵字就好。
    【標準答案】因為每個core有獨立的cache。

  2. What is privileged(特權) instruction?
    【解析】要答這一題,首先要知道我們跑程式的介面有「user mode」、「kernal mode」兩種,kernal是核心的意思,顧名思義,要能跑在「核心」的程式大概是些可能會影響的系統的重要指令吧,也因此要跑在kernal mode的程式是要有較高權限的。
    【標準答案】privileged instruction就是只能在kernel mode下被執行的指令。

  3. What is the interrupt vector?
    【解析】在【小白馬的OS筆記】(2)中,我們談過「interrupt(打斷)」,CPU好比是老師,打斷源好比是學生,老師不會時時刻刻一直問學生作業作好沒,而是當學生要交作業時,自己去打斷老師。懂了「interrupt」,那「interrupt vector」是什麼?你想,既然程式特別去打斷CPU,表示CPU應該是要做一些適當的「處理」。(好比說學生交作業「打斷」老師,可能是要叫老師可以批改作業了) interrupt vector就是用來記錄告訴CPU它要如何處理來自某個地方的interrupt。
    【標準答案】它是存function pointer的vector,記錄當interrupt發生時,應該讓CPU呼叫哪個函數處理該interrupt

  4. What is the memory content in heap and stack, respectively?
    【解析】我們需要知道一支process的資料是如何擺在記憶體裡面的,這邊放個上課投影片精美的示意圖:
    https://ithelp.ithome.com.tw/upload/images/20191106/20117114DfJkKxJdco.png

text指的是程式碼本身。
data區放全域變數,
heap放的是動態配置的記憶體,例如你寫C語言用malloc函數要來的陣列空間。
stack放的是函數內宣告的區域變數,這些變數將隨著函數執行完而消失。

你或許有跟小白馬一樣的疑問,這些資料不能存在同一個地方嗎?
為什麼分這麼多區塊存放資料?
因為資料屬性不同啊,
heap放的資料並不會隨著函數執行結束而消失(除非你自己在程式寫了delete, 或free之類的指令釋放空間)
stack放的資料則隨著函數執行結束而消失。

【標準答案】dynamic allocated memory, local variable.

  1. When will a process change from running state to waiting and ready states? Given an example for each case respectively.

【解析】這題一定要先知道一支程式(process)的生命週期才答的出來了。先上個上課投影片精美的示意圖:
https://ithelp.ithome.com.tw/upload/images/20191106/201171143TFxY6eyEv.png

程式有五大階段:「new」、「ready」、「running」、「waiting」、「terminated」。
有三個階段應該是很好理解的:
new: 程式剛創建的階段
running: 程式正在執行中
terminated: 程式已經執行完畢

令人困惑的是這兩個階段「ready」、「waiting」,
從中文上來說,他們都是在「等待」,他們在等什麼,差別在哪裡?
首先我們記得一個觀念: 「在一台電腦上面可以同時有很多程式一起執行(透過快速交替執行這些程式讓你感覺程式們同時被執行了)」,所以會有一個角色決定現在輪到哪支程式執行,而哪支程式先在旁邊乖乖等待,這個決定排程的角色稱為「scheduler」。

「ready state」指的是這支程式已經隨時可以被執行了,只要scheduler叫那支程式就可以給CPU來執行。
所以「ready state」在等待的是scheduler的安排。
「wait state」等待的事則不同,你會從「running state」去到「wait state」,
是因為你在你的程式裡呼叫了「system call」(比如說printf, sleep,...)
比如說printf,在螢幕上印出東西來,
跟一般的程式指令「加、減、乘、除」相比是超級慢的一件事情,
因此呼叫了「system call」之後,
便會讓這支程式等待這件耗時的事做完(如:在螢幕上印出東西),
然後才回到「ready state」等待程式繼續執行。

那…為什麼你會從「running state」去到「ready state」勒?
當然就是interrupt(打斷)啦,
scheduler為了讓多支程式「同時」執行,
他會打斷現在的程式而換人先執行,
這時程式也只能在旁邊乖乖納涼等待了…

【標準答案】
running state=> waiting: 呼叫system call,比如說IO跟sleep
running states => ready: 來自程式觸發的interrupt,或scheduling timer安排換程式跑,或者使用者透過滑鼠、鍵盤強制打斷程式。

  1. Why TLB has to be flushed after context switch? (熱門考題)

這題是小白馬在【小白馬的OS筆記】(4)TLB介紹中有嗑到的考古題,這邊先跟有看我系列文的讀者說抱歉,在那篇文寫的解答並不完全正確。

【解析】先釐清context switch是什麼?電腦不會只有跑一支程式,而可能會同時跑多支程式(process)輪流交替執行,這樣交換process稱為「context switch」。對不同的process來說,它們有各自的page table,但TLB是共用的,TLB的存在是為了使查找process裡的logical address到physical address的轉換可以快一點。在TLB是共用的狀況下,如果process交換了,那應該先清空TLB,把該process需要的資料(他的page table)跟著拿進來,否則便會讀到別人page table的資訊,而查詢到錯誤的地址。

【標準答案】因為不同process之間的TLB是共用的。如果不刷新TLB,那麼便會錯誤地讀取到其它process的資料。
【補充說明】你會不會有跟小白馬一樣的疑惑?Page Table明明比TLB還大,怎麼可能把Page Table的資料搬進TLB裡面?其實是因為為了有「快速查找」的效果,Page Table的資料不會全部搬到TLB裡面,而是把程式內常用的幾個地址的資料搬進TLB裡面就好了。呃…至於怎麼知道哪些地址是「常用的」?這恐怕是另一個故事了,暫不討論。


尚未有邦友留言

立即登入留言