http://www.bilibili.com/video/av6538245html
本篇博客,旨在記錄視頻學習的要點,因此格式隨意, 方便本人往後自考和回憶,有興趣的朋友能夠評論討論。ios
原文地址http://www.cnblogs.com/clockq/p/10318639.html程序員
OS = Kernel + Shell,是介於底層硬件和應用軟件之間的一層軟件架構。算法
計算機的快速發展與各個底層硬件的快速發展是分不開的(CPU的計算能力,IO的讀寫能力和網絡帶寬)編程
BIOS = Basic Input/Output System數組
graph LR A[BIOS]-->B[Bootloader] B --> C[OS]
POST = Power-On Self-Test緩存
graph LR A[POST]-->B[啓動順序] B-->C[主引導記錄]
主引導記錄(MBR)= Master Boot Record網絡
graph LR A[MBR]-->B[分區表] B-->C[活動分區]
硬盤啓動分爲三種狀況:架構
卷引導記錄(VBR)= Volume boot record併發
graph LR A[活動分區]-->B[VBR] B-->C[OS]
啓動管理器模式:
graph LR A[MBR]-->B[Grub]
graph LR A[Load /boot/kernel]-->B[run /sbin/init]
graph LR A[外設設置中斷標記] --> B[保存現場] B --> C[中斷程序處理] C --> D[清除中斷標記] D --> E[恢復現場]
graph LR A[保存現場] --> B[異常處理] B --> C[殺死異常程序] B --> D[重啓發生異常的程序] C --> E[恢復現場] D --> E[恢復現場]
應用程序沒法直接操做硬件,須要OS提供的服務接口來間接調用,例:
C語言的printf()
函數,執行時會調用OS的write()
接口
參考文章http://www.javashuo.com/article/p-gdeeqtlo-mw.html
計算機基本硬件結構 = CPU + 內存 + 外設
CPU = 運算器 + 寄存器 + 控制器 + Cache(L1 + L2)+ 存儲管理單元(MMU)
越是靠近CPU的內存,讀取速度越快,由近及遠依次是:
CPU寄存器 => Cache => 主存 => 虛擬內存
操做系統在內存管理上要完成的任務:
邏輯地址------(段機制)------->線性地址------(頁機制)------->物理地址。
邏輯地址提供了權限檢查功能:好比咱們設置邏輯地址和物理地址之間的映射關係時,能夠設置某塊地址是隻讀的,只寫的,只有CPU處於管理模式時才能訪問等。這些功能可讓系統的內核,用戶程序的運行空間相互獨立:用戶程序即便出錯,也沒法破壞內核;用戶程序A崩潰了,也沒法影響到用戶程序B。
graph LR A[C程序.c] --> |編譯| B[編譯程序.s] B --> |彙編| C[彙編程序.o] C --> |連接| D[執行程序.exe] D --> |加載| E[應有載入內存]
各個步驟的做用:
邏輯地址
,但該地址對硬件而言是不友好的,所以先通過編譯,將代碼轉爲語法樹,經過符號來描述地址。具體流程以下圖:
graph LR A[CPU加載邏輯地址內容] --> B{查看MMU中是否映射了物理地址} B --> |有| L[得到物理地址] B --> |沒有| C{到主存中查找是否有物理地址映射表} C --> |有| L L--> D[讀取物理地址的內容]
如要分配N byte,在內存中查找第一個可用(>=N)的空閒塊,以知足最快分配。
需求:1. 按照地址排序; 2. 分配須要尋找合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:實現簡單; 易於產生更大數據塊。
劣勢:會產生外部碎片; 不肯定性。
如要分配N byte,在內存中查找第一個可用(>=N)的且最小的空閒塊,以知足最快分配。更大的利用小空間。
需求:1. 按照剩餘空間大小排序; 2. 分配須要尋找 最 合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:實現簡單; 適合大量分配小內存。
劣勢:重分配慢; 易產生大量微小的外部碎片。
如要分配N byte,在內存中查找第一個可用(>=N)的且最大的空閒塊,以知足最快分配。避免出現大量微小空間。
需求:1. 按照剩餘空間大小排序(倒序排列); 2. 分配須要尋找 最 合適的空閒塊; 3. 內存回收後,要將相鄰塊進行合併。
優點:適合大量分配中等大小內存。
劣勢:重分配慢; 易產生外部碎片; 會破壞大的空閒塊,使更大的應用沒法分配。
將非運行時應用佔用的內存移動到相鄰的一處內存,以減小應用間的外部碎片
利用虛擬內存,將非運行時應用佔用的內存移動到虛擬內存,以使的運行時應用有更大的空閒空間使用。
優勢:
缺點:
爲了更好的分離和管理。
使用分斷管理機制後,在邏輯地址層面,地址看上去是連續的,而在物理地址層面,能夠將不一樣的代碼段分離出來管理,從而實現共享,管理,權限保護等。
先劃分物理內存至固定大小的幀(Frame),用二元組(f,o)表示幀號和幀內偏移;劃分邏輯地址空間至相同大小的頁(Page),用二元組(p,o)表示頁號和頁內偏移。幀更像是相框,裏面啥也沒有,放了照片(邏輯頁面)纔有意義。
16-bit的地址空間,512byte大小的頁幀大小,則物理地址爲(3,6)的實際地址是多少?
解:
512 = 2^9 // 頁幀須要使用9bit表示 16-9 = 7 // 頁號須要使用7bit表示 因此實際物理地址的二進制表示爲 0000011 000000110 轉爲十進制爲1542,也能夠用 3 * 512 + 6 = 1542
每一個運行程序都有一個頁表,屬於程序的運行狀態,會動態的發生改變。
上述問題,可使用緩存
和間接訪問
兩種方式解決。
TLB是一塊特殊的快表,能夠更快的得到物理幀號,且TLB的miss概率能夠忽略不計。
頁表有個特殊的概念叫駐留位(上圖標紅的地方),駐留位爲0
的表示物理幀號不存在,也就是本頁映射無效。
頁表反向設計,頁表索引以幀號爲index,由於物理內存是固定的,而邏輯空間是無限增加的,所以大大減小了頁表大小。
優:
弊:
但願有個很大、很快、很便宜的存儲器,最好掉電數據不丟失。所以,貪心的人類想到了利用硬盤。
早期的計算機因爲硬件限制,常常會出現內存不夠的狀況,當時主要經過覆蓋技術(只把須要的指令和數據存在內存中)
和交換技術(把暫時不用的指令和數據存到swap中)
。
產生於20世紀80年代,通常用於多道程序系統的DOS操做系統。當時計算機的內存容量大多隻有640kb。
在較小的內存容量下運行較大的應用程序,與分區存儲管理配合使用。
以下圖所示,A程序爲常駐應用,但BC程序不會相互調用,DEF程序也不會相互調用,因此就可讓以後調用程序內存覆蓋以前調用的內存空間。(以模塊爲粒度覆蓋)
通常用於Unix操做系統。
讓正在運行或須要運行的程序能夠得到更多內存資源。
將暫時沒有運行的程序移到外部swap,從而得到更多的物理內存。(以程序爲粒度交換)
在有限容量的內存中,以更小的頁粒度爲單位裝入更多更大的程序(對覆蓋技術和交換技術的一次融合)。
指程序在執行過程的一個較短期內,所執行的指令地址和指令操做數地址,分別侷限在一小塊區域。
舉例: 對於一個二維數組[1024 * 1024], 對於橫向打印和豎向打印,效率差別仍是至關大的!
這種管理方式,是大多數虛擬存儲設備的選擇,即在頁式存儲的基礎上,增長了請求調頁和頁面置換功能。
請求調頁:應用程序裝入內存時,不是一次性載入所有的頁片到內存,而是用到哪一個頁片載入哪一個幀。(局部加載)
頁面置換:在應用運行過程當中,若是發現須要的頁片不在內存中,就會發生「斷頁中斷請求」,系統處理這個中斷,就會將虛擬內存中的幀加載到物理內存中。(延遲調用)
缺頁中斷髮生時的事件順序以下:
1) 硬件陷入內核,在堆棧中保存程序計數器。大多數機器將當前指令的各類狀態信息保存在特殊的CPU寄存器中。
2) 啓動一個彙編代碼例程保存通用寄存器和其餘易失的信息,以避免被操做系統破壞。這個例程將操做系統做爲一個函數來調用。
3) 當操做系統發現一個缺頁中斷時,嘗試發現須要哪一個虛擬頁面。一般一個硬件寄存器包含了這一信息,若是沒有的話,操做系統必須檢索程序計數器,取出這條指令,用軟件分析這條指令,看看它在缺頁中斷時正在作什麼。
4) 一旦知道了發生缺頁中斷的虛擬地址,操做系統檢查這個地址是否有效,並檢查存取與保護是否一致。若是不一致,向進程發出一個信號或殺掉該進程。若是地址有效且沒有保護錯誤發生,系統則檢查是否有空閒頁框。若是沒有空閒頁框,執行頁面置換算法尋找一個頁面來淘汰。
5) 若是選擇的頁框「髒」了,安排該頁寫回磁盤,併發生一次上下文切換,掛起產生缺頁中斷的進程,讓其餘進程運行直至磁盤傳輸結束。不管如何,該頁框被標記爲忙,以避免由於其餘緣由而被其餘進程佔用。
6) 一旦頁框「乾淨」後(不管是馬上仍是在寫回磁盤後),操做系統查找所需頁面在磁盤上的地址,經過磁盤操做將其裝入。該頁面被裝入後,產生缺頁中斷的進程仍然被掛起,而且若是有其餘可運行的用戶進程,則選擇另外一個用戶進程運行。
7) 當磁盤中斷髮生時,代表該頁已經被裝入,頁表已經更新能夠反映它的位置,頁框也被標記爲正常狀態。
8) 恢復發生缺頁中斷指令之前的狀態,程序計數器從新指向這條指令。
9) 調度引起缺頁中斷的進程,操做系統返回調用它的彙編語言例程。
10) 該例程恢復寄存器和其餘狀態信息,返回到用戶空間繼續執行,就好像缺頁中斷沒有發生過同樣。
摘自[https://blog.csdn.net/qq_22238021/article/details/80192776]
操做系統要在下面的四段時間裏作與分頁相關的工做:進程建立時,進程執行時,缺頁中斷時和進程終止時。
當在分頁系統中建立一個新進程
時,操做系統要肯定程序和數據在初始時有多大,併爲它們建立一個頁表。操做系統還要在內存中爲頁表分配空間並對其進行初始化。當進程被換出時,頁表不須要駐留在內存中,但當進程運行時,它必須在內存中。另外,操做系統要在磁盤交換區中分配空間,以便在一個進程換出時在磁盤上有放置此進程的空間。操做系統還要用程序正文和數據對交換區進行初始化,這樣當新進程發生缺頁中斷時,能夠調入須要的頁面。某些系統直接從磁盤上的可執行文件對程序正文進行分頁,以節省磁盤空間和初始化時間。最後,操做系統必須把有關頁表和磁盤交換區的信息存儲在進程表中。
當調度一個進程執行
時,必須爲新進程重置MMU,刷新TLB,以清除之前的進程遺留的痕跡。新進程的頁表必須成爲當前頁表,一般能夠經過複製該頁表或者把一個指向它的指針放進某個硬件寄存器來完成。有時,在進程初始化時能夠把進程的部分或者所有頁面裝入內存中以減小缺頁中斷的發生,例如,PC(程序計數器)所指的頁面確定是須要的。
當缺頁中斷髮生
時,操做系統必須經過讀硬件寄存器來肯定是哪一個虛擬地址形成了缺頁中斷。經過該信息,它要計算須要哪一個頁面,並在磁盤上對該頁面進行定位。它必須找到合適的頁框來存放新頁面,必要時還要置換老的頁面,而後把所需的頁面讀入頁框。最後,還要備份程序計數器,使程序計數器指向引發缺頁中斷的指令,並從新執行該指令。
當進程退出
時,操做系統必須釋放進程的頁表、頁面和頁面在硬盤上所佔用的空間。若是某些頁面是與其餘進程共享的,當最後一個使用它們的進程終止的時候,才能夠釋放內存和磁盤上的頁面。
在何處保存未加載的幀?
後備存儲能夠有哪些?
有效存儲訪問時間(EAT)= Effective Memory Access Time
EAT = 訪問時間 * 頁表命中率 + 缺頁處理時間 * 缺頁概率
例子:
訪問時間: 10ns 磁盤訪問時間:5ms = 5 * 10^6 ns page fault rate:p dirty page rate(頁內容改變,同步到虛擬內存機率):q EAT = 10 * (1 - p) + 5 * 10^6 * p * (1 + q)
由上述例子能夠看出,變量p對於總體EAT的影響最重要。
缺頁概率,是嚴重影響虛擬內存效率的一個因素,而缺頁概率與頁面置換算法息息相關。
功能:當缺頁中斷髮生,須要加載新的幀頁到內存,但當應用內存已滿時,須要選擇淘汰物理內存中的幀來給新的幀資源。
目標:儘量的減小頁面換進換出次數。
對於常駐內存(如操做系統或其餘關鍵應用)添加鎖定標誌位,避免換出。
分類:分爲局部頁面置換和全局頁面置換兩大類
基本思路:當一個缺頁中斷髮生,須要進行頁面置換時,對於當前內存中的每個邏輯頁面,計算它下一次被訪問時還需等待的時間,從中選擇等待時間最長的頁面,做爲置換頁。
評價:該算法沒法實現或者說很難實現,由於OS沒法預知每一個頁面下次訪問須要的等待時間,但該算法能夠做爲其餘算法評定的依據。
例圖:
基本思路:對於當前內存中的每個邏輯頁面,計算它載入內存的時間,從中選擇駐留時間最長的頁面,做爲置換頁。
評價:利用鏈表實現,載入向鏈尾加,換出刪除鏈表頭便可。
例圖:
基本思路:選擇最久未被使用的幀頁,做爲置換頁。
評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的前後順序,開銷較大,能夠利用鏈表或堆棧實現。
例圖:
基本思路:與LRU類似,是FIFO的一種改進。是兩者之間的一種平衡。實現是在頁面中加入一個訪問位
,一個頁面載入時,由硬件初始化爲0(軟件也能夠),若是頁面被訪問,則相應頁表項置爲1。將各頁表項組成一個環形鏈表,發生缺頁中斷時,指針循環判斷環形鏈表,若判斷的頁表項爲0,選爲置換頁,置換並訪問新頁後,新頁表項置爲1,指針下移;若判斷的頁表項爲1,則改成0,指針下移。
評價:時間軸上與最優算法相反,符合局部性原理。在最近一段區間內,找到最久未使用的幀。對於記錄各頁面調用的前後順序,開銷較大,能夠利用鏈表或堆棧實現。
例圖:
基本思路:對Clock算法的一個改進,優化Clock算法對修改頁面的寫入邏輯,引入新位dirty bit
(髒位)來標識內存修改過與虛存不一致。對於髒位爲0的頁面,沒必要進行同步回虛存的一步。而對於髒位爲1的頁面,多了一次存活機會,與訪問位用法同樣。
評價:優化Clock算法的換出效率,並利用兩個標識位擁有兩條命,來增長存活率,加大命中次數。
例圖:
基本思路:選擇訪問次數最少的頁爲置換頁。因此要維護一張表,對每一個頁都有個訪問計數器。
評價:LRU關注訪問過去時間,久的淘汰;LFU關注訪問次數,少的淘汰。
Belady(筆勒滴,一個科學家名)在採用FIFO算法時,有時會出現分配的物理頁面數增長,缺頁率反而提升(命中率反而降低)的反常現象。
例圖:
解決:LRU算法
對應用分配了固定的物理頁幀,必定程度上限制了系統靈活性,好比同時運行多個程序,但高峯期正好交錯開。因此能夠根據應用運行的不一樣階段,調整分配的物理頁幀,最大化利用系統資源。
工做集:一個進程p當前執行時刻t前,在以前的定長的頁面訪問工做集窗口△階段,使用的邏輯頁面集合,用二元函數 W(t, △)
表示;隨時刻t變化,集合也在變化。 | W(t, △) |
表示集合大小,即頁面數目。(一段時間內訪問的頁面集合)
常駐集:一個進程p在當前時刻t實際駐留在內存中(物理頁面)的頁面集合。(某時刻訪問的頁面集合)
常駐集 <= 工做集。
缺頁率:「缺頁次數」 / 「內存訪問次數」,影響因素:
基本思路:相似LRU最久未用被淘汰,但不一樣的是觸發事件不一樣,當時刻改變時(而非缺頁時)就會清理物理頁面,準備物理頁幀。
例圖:
基本思路:在工做集頁面置換算法基礎上,動態改變時刻窗口(△)大小,即常駐集大小。當缺頁率上升時,提升常駐集大小,反之減小。(淘汰的觸發時間是缺頁時,一次可能淘汰多個頁面)
評價:性能好,開銷大。
例圖:
什麼是抖動?
當分配的常駐集小於工做集,使進程產生不少缺頁中斷,頻繁進行換進換出,從而使運行速度變慢的現象叫作抖動問題。
產生緣由?
隨着駐留內存中應用的增長,分配給每一個應用的物理頁幀(常駐集)持續減小,缺頁率隨之提升。因此OS要選擇運行適當的進程數量,及每一個進程所需頁幀數,使併發水平和缺頁率達到必定平衡。