




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
上一講,我們看到了如何通過器,把多個文件合并成一個最終可執(zhí)行文件。在運行這些可執(zhí)行文件的時候,我們其實是通過一個裝載器,解析ELF或者PE格式的可執(zhí)行文件。裝載器會把對應的指令和數(shù)據(jù)加載到內(nèi)存里面來,讓CPU去執(zhí)行。說起來只是裝載到內(nèi)存里面這一句話的事兒,實際上裝載器需要滿足兩個要第一,可執(zhí)行程序加載后占用的內(nèi)存空間應該是連續(xù)的。我們在第6講講過,執(zhí)行指令的地在一起。第二,我們需要同時加載很多個程序,并且不能讓程序自己規(guī)定在內(nèi)存中加載的位置。編譯出來的指令里已經(jīng)有了對應的各種各樣的內(nèi)存地址,但是實際加載的時候,我們其實沒有辦法確保,這個程序一定加載在哪一段內(nèi)存地址上。因為我們現(xiàn)在的計算機通常會同時運行很多個程序,可能你想要的內(nèi)存地址已經(jīng)被其他加載了的程序占用了。要滿足這兩個基本的要求,我們很容易想到一個辦法。那就是我們可以在內(nèi)存里面,找到一段連續(xù)的內(nèi)存空間,然后分配給裝載的程序,然后把這段連續(xù)的內(nèi)存空間地址,和整個程序指令里指定的內(nèi)存地址做一個映射。我們把指令里用到的內(nèi)存地址叫作虛擬內(nèi)存地址(VirtualMemoryAddress),實際在內(nèi)存硬件里面的空間地址,我們叫物理內(nèi)存地址(PhysicalMemoryAddress)。這種找出一段連續(xù)的物理內(nèi)存和虛擬內(nèi)存地址進行映射的方法,我們叫分(Segmentation)。這里的段,就是指系統(tǒng)分配出來的那個連續(xù)的內(nèi)存空足之處,第一個就是內(nèi)存碎片(MemoryFragmentation)的問題。我們來看這樣一個例子。我現(xiàn)在手頭的這臺電腦,有1GB的內(nèi)存。我們先啟動一個圖形渲染程序,占用了512MB的內(nèi)存,接著啟動一個Chrome瀏覽器,占用了128MB內(nèi)存,再啟動一個Python程序,占用了256MB內(nèi)存。這個時候,我們關(guān)掉Chrome,于是空閑內(nèi)存還有1024-512-256=256MB。按理來說,我們有足夠的空間再去裝載一個200MB的程序。但是,這256MB的內(nèi)存空間不是連續(xù)的,而是被分成了兩段128MB的當然,這個我們也有辦法解決。解決的辦法叫內(nèi)存交換 Swap)我們可以把Python程序占用的那256MB內(nèi)存寫到硬盤上,然后再從硬盤上讀回來到內(nèi)存里面。不過讀回來的時候,我們不再把它加載到原來的位置,而是緊緊跟在那已經(jīng)被占用了的512MB內(nèi)存后面。這樣,我們就有了連續(xù)的256MB內(nèi)存空間,就可以去加載一個新的200MB的程序。如果你自己安裝過Linux操作系統(tǒng),你應該遇到過分配一個swap硬盤分區(qū)的問題。這塊分出來的磁盤空間,其實就是專門給Linux操作系統(tǒng)進行內(nèi)存交換用的。虛擬內(nèi)存、分段,再加上內(nèi)存交換,看起來經(jīng)解決了計算機同時裝載運行很多個程序的問題。不過,你千萬不要大意,這三者的組合仍然會遇到一個性能瓶頸。硬盤的速度要比內(nèi)存慢很多,而每一次內(nèi)存交換,我們都需要把一大段連續(xù)的內(nèi)存數(shù)據(jù)寫到硬盤上。所以,如果內(nèi)存交換的時候,交換的是一個很占內(nèi)存空間的程序,這樣整個機器都會顯得卡頓。既然問題出在內(nèi)存碎片和內(nèi)存交換的空間太大上,那么解決問題的辦法就是,少出現(xiàn)一些內(nèi)存碎片。另外,當需要進行內(nèi)存交換的時候,讓需要交換寫入或者從磁盤裝載的數(shù)據(jù)更少一點,這樣就可以解決這個問題。這個辦法,在現(xiàn)在計算機的內(nèi)存管理里面,就叫作內(nèi)存分頁(Paging)和分段這樣分配一整段連續(xù)的空間給到程序相比,分頁是把整個物理內(nèi)存空間切成一段段固定尺寸的大小。而對應的程序所需要占用的虛擬內(nèi)存空間,也會同樣切成一段段固定尺寸的大小。這樣續(xù)并且尺寸固定的內(nèi)存空間,我們叫頁(Pae)。從虛擬內(nèi)存到物理內(nèi)存的映射,不再是拿整段連續(xù)的內(nèi)存的物理地址,而是按照一個一個頁來的。頁的尺寸一般遠遠小于整個程序的大小。在Liux下,我們通常只設(shè)置成4KB。你可以通過命令看看你手頭的Linx系統(tǒng)設(shè)置的頁的大小。代1$getconf4KB的頁。即使內(nèi)存空間不夠,需要讓現(xiàn)有的、正在運行的其他程序,通過內(nèi)存交換釋放出一些內(nèi)存的頁出來,寫入磁盤的也數(shù)的一個頁或者幾個頁,不會花太多時更進一步地,分頁的方式使得我們在加載程序的時候,不再需要都把程序加載到物理內(nèi)存中。我們完全可以在進行虛擬內(nèi)存和物理內(nèi)存的頁之間的映射之后,并不真的把頁加載到物理內(nèi)存里,而是只在程序運行中,需要用到對應虛擬內(nèi)存頁里面的指令和數(shù)據(jù)時,再加載到物理內(nèi)存里面去。實際上,我們的操作系統(tǒng),的確是這么做的。當要特定的頁,卻發(fā)現(xiàn)數(shù)據(jù)并沒有加載到物理內(nèi)存里的時候,就會觸發(fā)一個來自于CPU的缺頁錯誤(PaeFat)。我們的操作系統(tǒng)會捕捉到這個錯誤,然后將對應的頁,從存放在硬盤上的虛擬內(nèi)存里出來,加載到物理內(nèi)存里。這種方式,使得我們可以運行那些遠大于我們實際物理內(nèi)存的程序。同時,這樣一來,任何程序都不需要加載完所有指令和數(shù)據(jù),只需要加載當前需要用到就行了。通過虛擬內(nèi)存、內(nèi)存交換和內(nèi)存分頁這三個技術(shù)的組合,我們最終得到了一個讓程序不需要考慮實際的物理內(nèi)存地址、大小和當前分配空間的解決方案。這些技術(shù)和方法,對于我們程序的編寫、編譯和過程都是透明的。這也是我們在計算機的軟硬件開發(fā)中常用的法,就是加入一個間接層。通過引入虛擬內(nèi)存、頁映射和內(nèi)存交換,我們的程序本身,就不再需要考慮對應的真實的內(nèi)存地址、程序加載、內(nèi)存管理等問題了。任何一個程序,都只需要把內(nèi)存當成是一塊完整而連續(xù)的空間來直接使用?,F(xiàn)在回到開頭我問你的問題,我們的電腦只要640K內(nèi)存就夠了嗎?很顯然,現(xiàn)在來看,比爾·的這個判斷是不合理的,那為什么他會這么認為呢?因為他也是一個很優(yōu)秀的程序員啊!在虛擬內(nèi)存、內(nèi)存交換和內(nèi)存分頁這三者結(jié)合之下,你會發(fā)現(xiàn),其實要運行一個程序,“必需”的內(nèi)存是很少的。CPU只需要執(zhí)行當前的指令,極限情況下,內(nèi)存也只需要加載一頁就好了。再大的程序,也可以分成一頁。每次,只在需要用到對應的數(shù)據(jù)和指令的時候,從硬盤上交換到內(nèi)存里面來就好了。以我們現(xiàn)在4K內(nèi)存一頁的大小,640K內(nèi)存也能放下足足160頁呢,也無怪乎在·會說出“640Koughttoeenoughforayoe”這樣的話。不過呢,硬盤的速度比內(nèi)存慢很多,所以我們現(xiàn)在的計算機,沒有個幾G的內(nèi)存都不那么,除了程序分頁裝載這種方式之外,我們還有其他優(yōu)化內(nèi)存使用的方式么?下一講,我們就一起來看看“動態(tài)裝載”,學下讓兩個不同的應用程序,共用一個共享程序庫的辦法。想要更深入地了解代碼裝載的詳細過程,推薦你閱讀《程序員的自我修養(yǎng)——、裝載和庫》的第1章和第6章。請你想,在Java這樣使用虛擬機的編程語言里面,我們寫的程序是怎么裝載到內(nèi)存里面來的呢?它也和我們講的一樣,是通過內(nèi)存分頁和內(nèi)存交換的方式加載到內(nèi)存里面來的么?歡迎你在留言區(qū)寫下你的思考和疑問,和大家一起探討。你也可以把今天的文章給你朋 歸科技所有 不得售賣。頁面已增加防盜追蹤,將依法其下一 10|動態(tài):程序內(nèi)部的“共享單車言精選留言言 曾軾 3展heapsize是確保自己只使用特定規(guī)模的資源啊焰 閆循 1高 展不記 1展 文中提到“我們一個從虛擬地址到物理地址的映射表”,那么這個“我們”是指由展美 A??棟杰 展Mr.鈞
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 進口半掛車轉(zhuǎn)讓合同協(xié)議
- 足浴店內(nèi)部合作合同協(xié)議
- 2024高級會計學應試試題及答案
- 無人機操縱中的倫理問題試題及答案
- 配件維修質(zhì)保合同協(xié)議
- 常用藥物的副作用與護理試題及答案
- 中級審計師考試分析框架試題及答案
- 健身房會籍培訓體系構(gòu)建與實施
- 2025年醫(yī)患溝通技巧重要性及試題及答案
- 旅游退費協(xié)議書
- DL-T 572-2021電力變壓器運行規(guī)程-PDF解密
- 《17 他們那時候多有趣啊》公開課一等獎創(chuàng)新教學設(shè)計及反思
- 2023屆高三物理一輪復習89熱學中的變質(zhì)量問題(解析版)
- 人教版 美術(shù) 三年級下冊全冊表格式教案教學設(shè)計
- 2021年全國高中數(shù)學聯(lián)賽浙江賽區(qū)初賽試題
- 公路工程質(zhì)量檢驗評定標準 第二冊機電工程 JTG 2182-2020
- 住院精神疾病患者自殺風險護理(2023版團標)
- 高血壓危象護理教學查房
- 腳手架工程安全管理風險辨識及防范措施
- 醫(yī)療設(shè)備強檢計量目錄(參考)
- 汽車配件名稱大全全
評論
0/150
提交評論