五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)
一、概述
二、什么是內(nèi)存?有何作用?
內(nèi)存是用于存放數(shù)據(jù)的硬件。程序在執(zhí)行之前,需要先放到內(nèi)存中才能被CPU處理。
平時,我們各種各樣的軟件都是存儲在外存(輔存)里。電腦的話,一般是存儲在硬盤里,但是硬盤是一種慢速的設(shè)備,而CPU是一種超快速的設(shè)備。所以,如果CPU要處理的程序、數(shù)據(jù)直接從硬盤(外存)當(dāng)中存取的話,CPU會有大量的時間在等待外存的存取操作的完成。這里就出現(xiàn)了外存與CPU的速度矛盾,因此引入了內(nèi)存。
三、幾個常用的數(shù)量單位
四、進(jìn)程的運行原理——指令
可見,我們寫的代碼要翻譯成CPU能識別的指令。這些指令會告訴CPU應(yīng)該去內(nèi)存的哪個地址存/取數(shù)據(jù),這個數(shù)據(jù)應(yīng)該做什么樣的處理。在這個例子中,指令中直接給出了變量x的實際存放地址(物理地址)。
但實際在生成機(jī)器指令的時候并不知道該進(jìn)程的數(shù)據(jù)會被放到什么位置。所以編譯生成的指令中一般是使用邏輯地址(相對地址)
五、邏輯地址 VS 物理地址
六、從寫程序到程序的運行流程
編譯:由編譯程序?qū)⒂脩粼创a編譯成若干個目標(biāo)模塊(編譯就是把高級語言翻譯為機(jī)器語言)
鏈接:由鏈接程序?qū)⒕幾g后形成的一組目標(biāo)模塊,以及所需庫函數(shù)鏈接在一起,形成一個完整的裝入模塊
裝入(裝載):由裝入程序?qū)⒀b入模塊裝入內(nèi)存運行
但是,如果我們把裝入模塊放入了起始內(nèi)存地址為100的存儲單元中時,這些指令中包含的地址參數(shù)其實就是錯誤的。比如下圖中的80應(yīng)該該為180。
如何解決這個問題呢?
這里引入了裝入的三種方式(用三種不同的方法完成邏輯地址到物理地址的轉(zhuǎn)換):
絕對裝入:在編譯時,如果知道程序?qū)⒎诺絻?nèi)存中的哪個位置,編譯程序?qū)?strong>產(chǎn)生絕對地址的目標(biāo)代碼。裝入程序按照裝入模塊中的地址,將程序和數(shù)據(jù)裝入內(nèi)存。
靜態(tài)重定位:又稱可重定位裝入。編譯、鏈接后的裝入模塊的地址都是從0開始的,指令中使用的地址、數(shù)據(jù)存放的地址都是相對于起始地址而言的邏輯地址。可根據(jù)內(nèi)存的當(dāng)前情況,將裝入模塊裝入到內(nèi)存的適當(dāng)位置。裝入時對地址進(jìn)行“重定位”,將邏輯地址變換為物理地址(地址變換是在裝入時一次完成的)
動態(tài)重定位:又稱動態(tài)運行時裝入。編譯、鏈接后的裝入模塊的地址都是從0開始的。裝入程序把裝入模塊裝入內(nèi)存后,并不會立即把邏輯地址轉(zhuǎn)換為物理地址,而是把地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時才進(jìn)行。因此裝入內(nèi)存后所有的地址依然是邏輯地址。這種方式需要一個重定位寄存器的支持。
七、鏈接的三種方式
八、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Node 中的开发环境与生产环境 和 使
- 下一篇: 六、操作系统——内存管理的概念(空间的分