唯一的一段操作系统的笔记……
背景
- 程式需要載入到內存,才能被運行;
- 幾乎所有的設備操作都需要經過內存;
- CPU只能直接訪問寄存器和內存;
Base and Limit Register
用於標識程式可使用的合法主存空間。
For example:
Base = 304000
Limit = 002000
則程式可以使用304000~306000這段地址空間。
定義了一段邏輯地址空間。
Address Binding
即映射,有三種機制:
– Compile Time 編譯時
– Load Time 即鏈接時
– Execution Time 執行時,需要CPU硬件支持重映射
編譯生成的.o文件中不存在地址,只存在符號地址。
Link之後符號地址轉換爲了Absolute Address。
不過有時即使時鏈接時也找不到地址,這時就需要執行時綁定。
Logical vs. Physical Address Space
Logical Address CPU使用的地址
Physical Address 內存使用的地址
中間要經過MMU,Memory-Management Unit,硬件實現兩個地址間的轉換。
這種情況只發生於運行時綁定,編譯時和鏈接時綁定的邏輯和物理地址是相同的。
Dynamic Loading
老舊作業系統的處理方式,如Windows 3.1。
一部分代碼沒有被載入內存,而是訪問時才裝入進程內存空間。
不需要OS支援,裝入地址是預先決定好的,由程序開發者實現。保存邏輯地址。
Dynamic loading is a mechanism by which a computer program can, at run time, load a library (or other binary) into memory, retrieve the addresses of functions and variables contained in the library, execute those functions or access those variables, and unload the library from memory.
Dynamic Linking
現代作業系統的處理方式。如DLL,需要作業系統的幫助。
存儲的是符號地址。
Swapping
中期調度機制。
Memory Allocation
Contiguous Allocation/空間連續分配
Contiguous強調毗鄰,Continuous強調不可打斷。
使用Base和Limit兩個寄存器。CPU檢查內存訪問地址,如果超出範圍,則觸發Trap。
當一個新的進程進入時,它會被加載到第一個足夠大的“空洞”中。
操作系統需要記錄: 分配過的內存,空閒內存(空洞)。
- First-fit: 找第一個能丟進去的
- Best-fit: 找一個大小最合適的
- Worst-fit: 找最大的空洞
Memory Utilization <===> Memory Consumption
指內存消耗量,顯然越小越好。
Memory footprint 越小越好
會產生很多碎片。
– 內部碎片:進程申請了888K,但系統給了1M。
– 外部碎片:進程和進程之間的碎片。
頁式分配
將內存劃分爲幀(Frames),512Byte~8192Byte之間。
邏輯地址劃分爲兩部分: Page Number + Page Offset,讓Page與Frame有相同的大小。
操作系統維護一張表,記錄頁和幀的映射關係。另外,系統還需要維護一張Free Frame Table。
優點: 徹底消除了External Fragment。
缺點: 還是無法消除Internal Fragment。比如設置Frame爲2M,但某個進程只需要1.5M。
硬件要求:
Page table 儲存與主存中
PTBR – Page-table base Register
PTLR – Page-table length Register
但這樣一來每次訪問內存會造成兩次實際的內存訪問,因此要把Page table部分丟在TLB(Translation Lookaside Buffer)裏面,這樣只會在TLB Miss的時候產生兩次內存訪問。
每個進程都有自己的Page Table,並用valid-invalid bit來標誌。可以共享頁面來共享代碼。
高級形態
- Hierarchical Paging – 2-level Page-table, Page-table太大
- Hashing Paging
- Inverted Page Table
Table[i]存儲PID, Page Number,每次訪問從前往後掃表,第一個匹配上的i就是Frame Number。
Segmentation 段式分配
一個程序由許多段組成,每個段是一個邏輯單元。
每個段擁有一段內存空間。
邏輯地址分爲兩部分<段號,偏移量>
段表:段號 —> [Base, Limit]
保護位
實際上,段式分配於頁式分配經常一起使用,比如奔騰,先將內存分頁,然後將頁分段。
CPU發出的邏輯地址分兩段,Selector + Address
比如Intel Pentium:
Logical Address -> Linear Address -> Pyhsical Address