內存


基礎知識

什么是內存?

內存是用於存放數據的硬件,程序執行前需要先放到內存中才能被cpu處理

如何區分各個程序的數據是放在什么地方的呢?

對內存的存儲單元編地址
內存中的一個一個的房間,就是存儲單元
按字節編址,每個存儲單元為1字節,即1b,即8個二進制位
字節位16的計算機按字編址,則每個存儲單元的大小位1個字,每個字的大小為16個二進制位

常用的數量單位

image-20210821085008363

相對地址又稱邏輯地址

絕對地址又稱物理地址

image-20210821085633418

裝入的三種方式

完成邏輯地址到物理地址的轉換

絕對裝入

靜態重定位

動態重定位

絕對裝入

在編譯時,如果知道程序將放到內存中的哪個位置,編譯程序將產生絕對地址的目標代碼。裝入程序按照裝入模塊中的地址,將程序和數據裝入內存。

只適用於單道程序環境

因為單道只能運行一個程序

程序中使用的絕對地址,可在編譯或匯編時給出,也可由程序員直接賦予。通常情況下都是編譯或匯編時再轉換為絕對地址。

靜態重定位

又稱可重定位裝入。編譯、鏈接后的裝入模塊的地址都是從0開始的,指令中使用的地址、數據存放的地址都是相對於起始地址而言的邏輯地址。可根據內存的當前情況,將裝入模塊裝入到內存的適當位置。裝入時對地址進行“重定位”,將邏輯地址變換為物理地址(地址變換是在裝入時一次完成的)。

image-20210821090345139

動態重定位

采用動態重定位允許程序在內存中發生移動

image-20210821090553683

並且可將程序分配到不連續的存儲區中;在程序運行前只需裝入它的部分代碼即可投入運行,然后在程序運行期間,根據需要動態申請分配內存;便於程序段的共享,可以向用戶提供一個比存儲空間大得多的地址空間。

鏈接的三種方式

靜態鏈接

在程序運行之前,先將各目標模塊及它們所需的庫函數連接成一個完整的可執行文件(裝入模塊),之后不再拆開。

要把獨立的邏輯地址合成完整的邏輯地址

image-20210821090845211

裝入時動態鏈接

將各目標模塊裝入內存時,邊裝入邊鏈接的鏈接方式。

image-20210821090934853

運行時動態鏈接

在程序執行中需要該自標模塊時,才對它進行鏈接。其優點是便於修改和更新,便於實現對目標模塊的共享。

image-20210821091059541

image-20210821091121668

內存管理

操作系統負責內存空間的分配與回收

需要提供某種技術從邏輯上對內存空間進行擴充

操作系統需要提供地址轉換功能,負責程序的邏輯地址與物理地址的轉換

image-20210821092001956

操作系統需要提供內存保護功能。保證各進程在各自存儲空間內運行,互不干擾

image-20210821092222269

image-20210821092414139

image-20210821092430500

覆蓋和交換

覆蓋技術

就是解決程序大小超過物理內存總和的問題

覆蓋技術的思想:將程序分為多個段(多個模塊)。常用的段常駐內存,不常用的段在需要時調入內存。

內存中分為一個“固定區”和若干個“覆蓋區”。
需要常駐內存的段放在“固定區”中,調入后就不再調出(除非運行結束)

不常用的段放在覆蓋區”,需要用到時調入內存,用不到時調出內存

image-20210821095045716

必須由程序員聲明覆蓋結構,操作系統完成自動覆蓋。缺點:對用戶不透明,增加了用戶編程負擔。

只用於早期的操作系統

交換技術

交換(對換)技術的設計思想:內存空間緊張時,系統將內存中某些進程暫時換出外存,把外存中某些已具備運行條件的進程換入內存(進程在內存與磁盤間動態調度)

中級調度(內存調度),就是要決定將哪個處於掛起狀態的進程重新調入內存

暫時換出外存等待的進程狀態為掛起狀態(掛起態, suspend)
掛起態又可以進一步細分為就緒掛起、阻塞掛起兩種狀態

image-20210821095431874

image-20210821095826906

image-20210821095846682

連續分配管理方式

連續分配:指用戶進程分配的必須是一個連續的內存空間

單一連續分配方式

image-20210821100316783

固定分區分配方式

image-20210821100558139

操作系統怎樣將記錄內存空閑的分布情況

image-20210821100820179

動態分區分配

動態分區分配又稱為可變分區分配。這種分配方式不會預先划分內存分區,而是在進程裝入內存時,根據進程的大小動態地建立分區,並使分區的大小正好適合進程的需要。因此系統分區的大小和數目是可變的。(eg:假設某計算機內存大小為64MB,系統區8MB,用戶區共56MB.)

系統要用什么的數據結構記錄內存的使用情況

兩種常用的數據結構

空閑分區鏈

空閑分區表

image-20210821101307557

如何對分區的分配和回收操作

image-20210821101456539

回收問題

image-20210821101744792

image-20210821101835555

image-20210821101911025

image-20210821101939963

動態分區分配沒有內部碎片,但由外部碎片

內部碎片:分配給進程的內存區域中,如果沒用上

外部碎片:是指內存中的某些空間分區由於太小而難以利用

如果內存中空閑空間的總和本來可以滿足某進程的要求,
但由於進程需要的是一整塊連續的內存空間,因此這些
“碎片”不能滿足進程的需求。
可以通過緊湊(拼湊, Compaction)技術來解決外部碎片。

image-20210821102447605

動態分區分配算法

如果有很多空閑分區都能滿足,選擇哪個進行分配

首次適應算法

算法思想:每次都從低地址開始査找,找到第一個能滿足大小的空閑分區

如何實現:空閑分區以地址遞增的次序排列。每次分配內存時順序査找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區

image-20210821102918731

最佳使用算法

算法思想:由於動態分區分配是一種連續分配方式,為各進程分配的空間必須是連續的一整片區域。因此為了保證當“大進程”到來時能有連續的大片空間,可以盡可能多地留下大片的家閑區,即,優先使用更小的空閑區。
如何實現:空閑分區按容量遞增次序鏈接。每次分配內存時順序查找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區

image-20210821103343757

最壞適應算法

又稱最大適應算法( Largest Fit)
算法思想:為了解決最佳適應算法的問題ー一即留下太多難以利用的小碎片,可以在每次分配時優先使用最大的連續空閑區,這樣分配后剩余的空閑區就不會太小,更方便使用
如何實現:空閑分區按容量遞減次序鏈接。每次分配內存時順序查找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區。

image-20210821103539077

鄰近適應算法

算法思想:首次適應算法每次都從鏈頭開始査找的。這可能會導致低地址部分出現很多小的空閑分區,而每次分配査找時,都要經過這些分區,因此也增加了査找的開銷。如果每次都從上次査找結束的位置開始檢索,就能解決上述問題
如何實現:空閑分區以地址遞增的順序排列(可排成一個循環鏈表)。每次分配內存時從上次査找結東的位置開始査找空閑分區鏈(或空閑分區表),找到大小能滿足要求的第一個空閑分區。

image-20210821104114693

image-20210821104126836

基本分頁存儲管理的概念

連續分配:為用戶進程分配的必須是一個連續的內存空間。
非連續分配:為用戶進程分配的可以是一些分散的內存空間。

image-20210821110348111

image-20210821110552265

image-20210821110757598

image-20210821111052500

image-20210821111101038

image-20210821111533953

頁表

image-20210821111734139

為什么每個頁表項的長度是相同的,頁號是隱藏的?

image-20210821112021877

image-20210821112037836

基本地址變換機構

基本地址變換機構可以借助進程的頁表將邏輯地址轉換為物理地址。
通常會在系統中設置一個頁表寄存器(PTR),存放頁表在內存中的起始地址F和頁表長度M。進程未執行時,頁表的始址和頁表長度放在進程控制塊(PCB)中,當進程被調度時,操作系統內核會把它們放到頁表寄存器中

image-20210821112949645

image-20210821113315035

image-20210821113726996

每個頁表項的長度是相同的,頁號是“隱含”的

image-20210821113949771

進程頁通常是裝在連續的內存塊中的

image-20210821114042719

具有快表的地址變換機構

是對基本地址變化的改進版本

快表,又稱聯想寄存器(TLB),是一種訪問速度比內存快很多的高速緩沖存儲器,用來存放當前訪問的若干頁表項,以加速地址變換的過程。與此對應,內存中的頁表常稱為慢表。

image-20210821114830823

引入快表,地址變化過程

image-20210821115030458

image-20210821115240441

image-20210821115333582

兩級頁表

image-20210821215656619

image-20210821220412648

image-20210821220527228

image-20210821220631684

基本分段存儲管理方式

分段

進程的地址空間:按照程序自身的邏輯關系划分為若干個段,每個段都有一個段名(在低級語言中,程序員使用段名來編程),每段從0開始編址

image-20210821224412387

段表

image-20210822074743393

地址變化

image-20210822075119971

分段、分頁管理對比

image-20210822075600177

image-20210822075841682

image-20210822080018807

image-20210822080132580

image-20210822080155259

段頁式管理方式

image-20210822080517667

image-20210822080602996

image-20210822080811292

image-20210822081116874

image-20210822081758179

image-20210822081817570


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM