計算機中乙個程序的邏輯位址為什麼往往比實體地址要多?

時間 2021-05-09 13:25:57

1樓:英雄不問出處

有mmu這個東西,可以分配虛擬位址(題中邏輯位址,下同),再加上核心的支援,可以提公升物理記憶體的利用率。

講一下Linux Kernel的處理,當執行乙個程式時,核心並不會把整個程式完全載入到物理記憶體中,而是分配好虛擬位址,載入可執行檔案的部分到物理記憶體,只分配了虛擬位址而程式未載入到物理記憶體的部分,會在頁表上做標記。

當程式執行到只有虛擬位址而沒有對應物理記憶體的地方時,處理器會發生異常,然後核心就分配對應的物理記憶體頁,把磁碟上的資料載入到物理記憶體,再從異常中返回,程式就能繼續執行。這個過程,使用者態的程式是無法感知到的。

這樣,就算分配的虛擬位址大於實際的分配的物理記憶體也是沒有問題的。通過這種機制,假設我有乙個遠大於物理記憶體的程式,也是能執行的。在系統物理記憶體用光的情況下,當程式執行到新的地方,而這部分只分配了虛擬位址,沒有對應物理記憶體時,核心在缺頁異常中搜尋最不常執行的地方,斷開物理記憶體與原來虛擬位址的連線,把這塊物理記憶體分配給當前程式將要執行的新的虛擬位址,然後把磁碟上的程式載入到物理記憶體,這樣程式又能快樂的執行了。

綜上,虛擬位址會比實體地址多,而且也是有必要。計算機裡有乙個重要的情況,基本上很多東西都是區域性的,乙個程式雖大(比如我們的假設,磁碟上的程式遠大於物理記憶體),但經常執行的地方卻不多。cache也是根據這個情況設計出來的,雖然可能只有幾十兆,但是效能提公升非常高。

上面說了單程序的情況,下面說說多程序的情況。多程序時,活躍的程序可能就那麼幾個,其他基本上在睡大覺。32位機上,每個程序都分了4g虛擬位址空間,但是真正需要全部把程式載入到物理記憶體的不多,或者,我乙個程式原來用了很多記憶體,但後面不怎麼執行,核心在記憶體緊張時,會把這部分物理記憶體釋放掉,分配給其他用途。

前面說的是程式部分,現在說說資料部分,或者說是堆記憶體這塊(malloc分配的)。如果這部分記憶體不常使用,核心會把他們丟入交換空間(swap,位於磁碟上)這個冷宮。等到真正需要時,才把資料從交換空間拿到物理記憶體。

綜上,這幾種情形,使用了虛擬位址,可以讓物理記憶體可以使用得更高效。邏輯位址比實體地址多不言而喻了吧。

ps:我深入到細節的這種講述不知道好不好理解,文字又比較多。

2樓:honker

你提的問題本身就有問題,本末倒置了。先好好學學作業系統的儲存管理機制,段式,頁式,段頁式是怎麼回事。你那不是直觀的想,是臆想。

計算機已知乙個位址,得到這個位址指向的內容,時間是常數級的嗎?如何實現的?

對NUMA Non uniform memory access 系統來說,access to local memory 要快一些,祥見 Non uniform memory access 其他的參見 vczh 回答。 Howard Curry 記憶體位址的查詢其實就是乙個二進位制解碼器。考慮閘電路的...

乙個非計算機專業的學生想走上計算機的路,大佬們有什麼推薦的學習過程呀

losermou 先學習計算機學導論。在學語言 程式設計 做些小專案。慢慢就有感覺了。個人想法,只用來參考。我是電腦科學與技術專業的 靖待 既然還是學生,當然是走捷徑呀。捷徑就是 讓自己成為科班出身。轉專業或者深造都行。計算機的路有很多方向,不是說看個C語言或者寫個html就算入行了,除非只是淺嘗輒...

乙個計算機專業的學生資料結構這門課學到什麼程度才能算學的還不錯?

了解常用的資料結構的具體實現和特點。能夠根據需求選擇適合的資料結構。能夠根據需求定義自己的抽象資料結構,給出合適的實現。 資料結構 這門課!是在我的大學生涯裡唯一乙個將我GPA拉低超過0.5的乙個學科!後來我對資料結構耿耿於懷,嚴蔚敏老師和周桂紅老師的教材都翻了無數遍,總結出一點吧,資料結構還想要學...