確保行程 (Process) 可以獨立執行,並透過 kernel mode 跟 user mode 保護硬體,並提供系統呼叫 (system call) 讓使用者不能直接操作硬體,簡化操作,也更加有效率等。
行程間的通訊 (Interprocess, IPC),是指行程之間的資訊交換。通訊機制可歸結為三大類:
對於單核單執行緒的處理器而言,在某一時刻只能執行一條CPU指令。上下文切換(Context Switch)是一種將CPU資源從一個程式分配給另一個程式的機制。從使用者角度看,計算機能夠並行執行多個程式,這恰恰是作業系統通過快速上下文切換造成的結果。在切換的過程中,作業系統需要先儲存當前程式的狀態(包括記憶體空間的指標,當前執行完的指令等等),再讀入下一個程式的狀態,然後執行此程式。
響應時間: 從使用者輸入到產生反應的時間
週轉時間: 從任務開始到任務結束的時間
CPU任務可以分為互動式任務和批處理任務,排程最終的目標是合理的使用CPU,使得互動式任務的響應時間儘可能短,使用者不至於感到延遲,同時使得批處理任務的週轉時間儘可能短,減少使用者等待的時間。
排程演算法是指:根據系統的資源分配策略所規定的資源分配演算法
當有多個執行緒的時候,經常需要去同步這些執行緒以訪問同一個資料或資源。例如,假設有一個程式,其中一個執行緒用於把檔案讀到記憶體,而另一個執行緒用於統計檔案中的字元數。當然,在把整個檔案調入記憶體之前,統計它的計數是沒有意義的。但是,由於每個操作都有自己的執行緒,作業系統會把兩個執行緒當作是互不相干的任務分別執行,這樣就可能在沒有把整個檔案裝入記憶體時統計字數。為解決此問題,你必須使兩個執行緒同步工作。
死鎖就是兩個執行緒在獲取資源的時候,兩個執行緒互相具有對方所必須的資源,沒有外力的作用將一直持續等待,即為死鎖。
根據死鎖產生的條件,解決死鎖包括預防死鎖,避免死鎖,檢測死鎖,解除死鎖。
預防死鎖,由於死鎖產生需要同時具備四個條件,因此預防死鎖的辦法就是限制其中的一個條件
(1)破壞請求條件:一次性分配所有資源,這樣就不會再有請求了;
(2)破壞請保持條件:只要有一個資源得不到分配,也不給這個程式分配其他的資源:
(3) 破壞環路等待條件:系統給每類資源賦予一個編號,每一個程式按編號遞增的順序請求資源,釋放則相反。
(4)破壞不可剝奪條件:當某程式獲得了部分資源,但得不到其它資源,則釋放已佔有的資源;
虛擬記憶體是作業系統提供的⼀種機制,將不同程序的虛擬地址和不同記憶體的實體地址對映起來。
每個程序都有自己獨立的地址空間,再由作業系統對映到到實際的實體記憶體。
於是,這⾥就引出了兩種地址的概念:
程式所使⽤的記憶體地址叫做虛擬記憶體地址(Virtual Memory Address)
實際存在硬體⾥⾯的空間地址叫實體記憶體地址(Physical Memory Address)。
分段機制下的虛擬地址由兩部分組成,段號和段內偏移量。
虛擬地址和實體地址通過段表對映,段表主要包括段號、段的界限。
我們來看一個對映,虛擬地址:段3、段偏移量500 ––> 段基地址7000+段偏移量500 ––> 實體地址:7500。
分頁是把整個虛擬和實體記憶體空間切成⼀段段固定尺⼨的⼤⼩。這樣⼀個連續並且尺⼨固定的記憶體空間,我們叫頁(Page)。在 Linux 下,每⼀頁的⼤⼩為 4KB。
訪問分頁系統中記憶體資料需要兩次的記憶體訪問 :一次是從記憶體中訪問頁表,從中找到指定的物理頁號,加上頁內偏移得到實際實體地址,第二次就是根據第一次得到的實體地址訪問記憶體取出資料。
作業系統可能會有非常多程序,如果只是使用簡單分頁,可能導致的後果就是頁表變得非常龐大。
所以,引入了多級頁表的解決方案。
所謂的多級頁表,就是把我們原來的單級頁表再次分頁,這裡利用了區域性性原理,除了頂級頁表,其它級別的頁表一來可以在需要的時候才被建立,二來記憶體緊張的時候還可以被置換到磁碟中。
在分頁系統裡,一個虛擬的頁面可能在主存裡,也可能在磁碟中,如果CPU發現虛擬地址對應的物理頁不在主存裡,就會產生一個缺頁中斷,然後從磁碟中把該頁調入主存中。
如果記憶體裡沒有空間,就需要從主存裡選擇一個頁面來置換。
常見的頁面置換演算法: