最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析操作系統(tǒng)中的虛擬地址與物理地址

 更新時間:2021年06月21日 11:34:45   作者:飛天小牛肉  
本文主要介紹了操作系統(tǒng)中的虛擬地址與物理地址。在早期的計算機(jī)中,要運行一個程序,會把這些程序全都裝入內(nèi)存,程序都是直接運行在內(nèi)存上的,也就是說程序中訪問的內(nèi)存地址都是實際的物理內(nèi)存地址。那當(dāng)程序同時運行多個程序時,操作系統(tǒng)是如何為這些程序分配內(nèi)存的呢

一、前言

先解釋下一個困擾了我很久的問題:虛擬地址(vitural address)和邏輯地址(logical address)的區(qū)別。

大部分操作系統(tǒng)的書籍要么寫的是虛擬地址,要么寫的是邏輯地址,看的我一臉懵逼。

在《深入理解 Linux 內(nèi)核》這本書中終于找到了確切的答案,這里我就不寫出來了,扣概念的話這倆確實是有些區(qū)別的,不過對于我們?nèi)粘J褂靡约袄斫獠僮飨到y(tǒng)來說的話,暫且可以把虛擬地址和邏輯地址理解為同一個意思。

二、你看到的所有地址都不是真的

下面這段 C 代碼摘錄自《操作系統(tǒng)導(dǎo)論 - [美] 雷姆茲·H.阿帕希杜塞爾》,依次打印出 main 函數(shù)的地址,由 malloc(類似于 Java 中的 new 操作)返回的堆空間分配的值,以及棧上一個整數(shù)的地址:

得到以下輸出:

我們需要知道的是,所有這些打印出來的地址都是虛擬的,在物理內(nèi)存中這些地址并不真實存在,它們最終都將由操作系統(tǒng)和 CPU 硬件翻譯成真正的物理地址,然后才能從真實的物理位置獲取該地址的值。

OK,上述就當(dāng)作一個引子,讓各位對物理地址和虛擬地址有個直觀的理解,下面正文開始。

三、物理尋址 Physical Addressing

物理地址的概念很好理解,你可以把它稱為真正的地址?!渡钊肜斫庥嬎銠C(jī)系統(tǒng) - 第 3 版》中給出的物理地址(physical address)的定義如下:

計算機(jī)系統(tǒng)的主存被組織成一個由 M 個連續(xù)的字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個唯一的物理地址。

比如說,第一個字節(jié)的物理地址是 0,接下來的字節(jié)地址是 1,再下一個是 2,以此類推,給定這種簡單的結(jié)構(gòu),CPU 訪問內(nèi)存的最自然的方式就是使用這樣的物理地址。我們把這種方式稱為物理尋址(physical addressing)。

舉個例子,比如說當(dāng)程序執(zhí)行了一條加載指令,指令內(nèi)容是從物理地址 4 中讀取 4 字節(jié)字傳送到某個寄存器中。

物理尋址過程如下:當(dāng) CPU 執(zhí)行到這條指令時,會生成物理地址 4,然后通過內(nèi)存主線,把它傳遞給內(nèi)存,內(nèi)存取出從物理地址 4 處開始的 4 字節(jié)字,并將它返回給 CPU,CPU 會將它存放到指定的寄存器中。看下圖:

其實不難發(fā)現(xiàn),物理尋址這種方式,每一個程序都直接訪問物理內(nèi)存,其實是存在重大缺陷的:

1)首先,用戶程序可以尋址內(nèi)存的任意一個字節(jié),它們就可以很容易地破壞操作系統(tǒng),從而使系統(tǒng)慢慢地停止運行。

2)再次,這種尋址方式使得操作系統(tǒng)中同時運行兩個或以上的程序幾乎是不可能的。

舉個例子,我們打開了三個相同的程序(計算器),都執(zhí)行到某一步。比方說,用戶在這三個程序的界面上分別輸入了 10、100、1000,其對應(yīng)的指令就是把用戶輸入的數(shù)字保存在內(nèi)存中的某個地址中。如果這個位置只能保存一個數(shù),那應(yīng)該保存哪個呢?這不就沖突了嗎?

再舉個例子,摘自《現(xiàn)代操作系統(tǒng) - 第 3 版》:

一個程序給物理內(nèi)存地址 1000 賦值也就是存入了一些數(shù)據(jù)后,另一個程序也同樣給這個地址賦值,那么第二個程序的賦值會覆蓋掉第一個程序所賦的值,這會造成兩個程序同時崩潰。

當(dāng)然了,我們也說了是幾乎不可能,不是完全不可能,還是有一些方法可以在物理尋址這種方式下實現(xiàn)多個程序并發(fā)運行的。

最簡單的方法就是:首先,將空閑的進(jìn)程存儲在磁盤上,這樣當(dāng)它們不運行時就不會占用內(nèi)存,然后,讓一個程序(或者說進(jìn)程)單獨占用全部內(nèi)存運行一小段時間,當(dāng)發(fā)生上下文切換的時候,就停止這個進(jìn)程,并將它所有的狀態(tài)信息保存在磁盤上,再加載其他進(jìn)程的狀態(tài)信息,然后運行一段時間...... 只要在某一個時間內(nèi)存中只有一個程序,那么就不會發(fā)生上述所說的地址沖突。這就實現(xiàn)了一種比較粗糙的并發(fā)。

為什么說他是粗糙的呢,因為這種方法有一個問題:將全部的內(nèi)存信息保存到磁盤太慢了!特別是當(dāng)內(nèi)存增長的時候。

因此,我們考慮把進(jìn)程對應(yīng)的內(nèi)存一直留在物理內(nèi)存中,在發(fā)生上下文切換的時候就切換到特定的區(qū)域。

如下圖所示,有 3 個進(jìn)程(A、B、C),每個進(jìn)程擁有從 512KB 物理內(nèi)存中切出來給它們的一小部分內(nèi)存,可以理解為這 3 個進(jìn)程共享物理內(nèi)存:

顯然,這種方式是存在一定安全隱患的。畢竟如果各個進(jìn)程之間可以隨意讀取、寫入內(nèi)容的話那就亂套了。

那么如何對每個進(jìn)程使用的地址進(jìn)行保護(hù)(protection)呢?繼續(xù)使用物理內(nèi)存模型肯定是不行了,因此操作系統(tǒng)創(chuàng)造了一個新的內(nèi)存抽象,引入了一個新的內(nèi)存模型,那就是虛擬地址空間,很多書中都會直接稱呼為 “地址空間(Address Space)”。

四、虛擬尋址 Virtual Addressing

我先通俗地解釋下虛擬地址空間和虛擬地址的概念,直接上書中的定義讀起來有點生澀。

就是說每個進(jìn)程的棧啊、堆啊、代碼段啊等等它們的實際物理內(nèi)存地址對于這個進(jìn)程來說是不可見的,誰也不能直接訪問這個物理地址。

那我們怎么去訪問這個進(jìn)程呢?

操作系統(tǒng)會給每個進(jìn)程分配一個虛擬地址空間(vitural address),每個進(jìn)程包含的棧、堆、代碼段這些都會從這個地址空間中被分配一個地址,這個地址就被稱為虛擬地址。底層指令寫入的地址也是虛擬地址。

每個進(jìn)程都擁有一個自己的地址空間,并且獨立于其他進(jìn)程的地址空間。也就是說一個進(jìn)程中的虛擬地址 28 所對應(yīng)的物理地址與另一個進(jìn)程中的虛擬地址 28 所對應(yīng)的物理地址是不同的,這樣就不會發(fā)生沖突了。

可以這么理解,物理地址就是一個倉庫,虛擬地址就是一個門牌,比方說一共有三十個門牌,那么所有的進(jìn)程都能看見這三十個門牌,但是他們看見的某個相同門牌,指向的并不是同一個倉庫。

OK,下面再來看《現(xiàn)代操作系統(tǒng) - 第 3 版》書中對于地址空間的解釋,應(yīng)該很容易理解了:

地址空間是一個進(jìn)程可用于尋址內(nèi)存的一套地址集合。每個進(jìn)程都有一個自己的地址空間,并且這個地址空間獨立于其他進(jìn)程的地址空間(除了在一些特殊情況下進(jìn)程需要共享它們的地址空間外)。

地址空間的概念非常通用,并且在很多場合中出現(xiàn)。比如電話號碼,在美國和很多其他國家,一個本地電話號碼通常是一個 7 位的數(shù)字。因此,電話號碼的地址空間是從 0 000 000 到 9 999 999。

地址空間也可以是非數(shù)字的,以 “.com” 結(jié)尾的網(wǎng)絡(luò)域名的集合也是地址空間。這個地址空間是由所有包含 2~63 個字符并且后面跟著 “.com” 的字符串組成的,組成這些字符串的字符可以是字母、數(shù)字和連字符。

到現(xiàn)在你應(yīng)該已經(jīng)明白地址空間的概念了,它是很簡單的。

有了虛擬地址空間后,CPU 就可以通過生成一個虛擬地址來訪問主存,這個虛擬地址在被送到內(nèi)存之前會先被轉(zhuǎn)換成合適的物理地址,這個虛擬地址到物理地址的轉(zhuǎn)換過程稱為 地址翻譯/地址轉(zhuǎn)換(address translation)。

地址翻譯需要 CPU 硬件和操作系統(tǒng)的密切合作:CPU 上的內(nèi)存管理單元(Memory Management Unit,MMU)就是專門用來進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換的,不過 MMU 需要借助存放在內(nèi)存中的查詢表,而這張表的內(nèi)容正是由操作系統(tǒng)進(jìn)行管理的。

那么,上述這一套 CPU 生成虛擬地址并進(jìn)行地址翻譯的流程就是虛擬尋址(virtual addressing)。舉個例子,看下圖:

以上就是淺析虛擬地址與物理地址的詳細(xì)內(nèi)容,更多關(guān)于虛擬地址 物理地址的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C/C++讀寫文本文件、二進(jìn)制文件的方法

    C/C++讀寫文本文件、二進(jìn)制文件的方法

    今天小編就為大家分享一篇C/C++讀寫文本文件、二進(jìn)制文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 完全掌握C++編程中構(gòu)造函數(shù)使用的超級學(xué)習(xí)教程

    完全掌握C++編程中構(gòu)造函數(shù)使用的超級學(xué)習(xí)教程

    這篇文章主要介紹了C++中的構(gòu)造函數(shù),包括C++11標(biāo)準(zhǔn)中的新特性的介紹,十分推薦!需要的朋友可以參考下
    2016-01-01
  • C++實現(xiàn)俄羅斯方塊游戲

    C++實現(xiàn)俄羅斯方塊游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)俄羅斯方塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Qt5連接并操作PostgreSQL數(shù)據(jù)庫的實現(xiàn)示例

    Qt5連接并操作PostgreSQL數(shù)據(jù)庫的實現(xiàn)示例

    本文主要介紹了Qt5連接并操作PostgreSQL數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言判斷字符串是否以str2開頭代碼

    C語言判斷字符串是否以str2開頭代碼

    這里給大家分享的是一個使用C語言實現(xiàn)的判斷字符串中是否以某字符開頭或者結(jié)尾的代碼,非常的簡單實用,希望大家能夠喜歡
    2017-05-05
  • 淺談2路插入排序算法及其簡單實現(xiàn)

    淺談2路插入排序算法及其簡單實現(xiàn)

    這篇文章主要介紹了淺談2路插入排序算法及其簡單實現(xiàn),雖算不上是常用的排序方法,但在數(shù)據(jù)庫等方面依然有用上的機(jī)會,需要的朋友可以參考下
    2015-08-08
  • C++實現(xiàn)小型圖書管理系統(tǒng)

    C++實現(xiàn)小型圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)小型圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 深入探究C語言中的二叉樹

    深入探究C語言中的二叉樹

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個有限結(jié)點組成一個具有層次關(guān)系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。本文將帶你深入探究C語言中的二叉樹,感興趣的同學(xué)跟著小編一起學(xué)習(xí)吧
    2023-05-05
  • C語言排序之?堆排序

    C語言排序之?堆排序

    這篇文章主要介紹了C語言排序之堆排序,文章基于C語言的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考資料,需要的小伙伴可以參考一下
    2022-04-04
  • Qt控件之QLabel用法及技巧

    Qt控件之QLabel用法及技巧

    QLabel是Qt中的一個控件類,用于顯示文本或圖像的控件類之一,本文主要介紹了Qt控件之QLabel用法及技巧,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論

蓝田县| 嘉义县| 万宁市| 丹巴县| 德江县| 宜丰县| 政和县| 汽车| 江华| 安化县| 汾西县| 特克斯县| 如皋市| 石河子市| 惠水县| 河北区| 宜州市| 离岛区| 屏南县| 新野县| 湘潭县| 双柏县| 聂拉木县| 凤城市| 灌南县| 天峻县| 宝应县| 哈尔滨市| 信阳市| 大庆市| 石家庄市| 静乐县| 葵青区| 天柱县| 老河口市| 永康市| 汶川县| 安徽省| 绵竹市| 绥化市| 盱眙县|