操作系统 内存管理相关知识
生活随笔
收集整理的這篇文章主要介紹了
操作系统 内存管理相关知识
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
cpu執(zhí)行程序的基本過(guò)程
- 譯碼器 輸入為n管腳,輸出為2^n根管腳,編號(hào)為從0到2^(n-1),用少的輸入端控制更多的輸出端
- 最常用的是三八譯碼器
- AD(Address bus)地址總線: 選中一行數(shù)據(jù)
- 每一行 8bit 組成8吧B cpu輸入端32根線,輸出端就可以控制 2^32 ,因此可以控制4G內(nèi)存
- DB(Data bus)數(shù)據(jù)總線: 8根數(shù)據(jù)線組成數(shù)據(jù)總線,確定了每一列,通過(guò)行和列將1B數(shù)據(jù)數(shù)據(jù)通過(guò)數(shù)據(jù)總線傳輸?shù)絚pu內(nèi)部的寄存器里面,使用R表示寄存器
- 程序最終是一條一條被讀入寄存器內(nèi)執(zhí)行的(有限 ,且按照功能進(jìn)行分類(lèi),有通用寄存器和特殊寄存器,特殊寄存器只能被特殊的指令訪問(wèn),)用戶(hù)態(tài)(訪問(wèn)通用寄存器) <=> 內(nèi)核態(tài)(訪問(wèn)特殊寄存器和通用寄存器)
- 內(nèi)存條是一個(gè)臨時(shí)的保存中介
- 磁盤(pán)是一個(gè)永久的保存中介
- 地址總線的選中原理 (譯碼器原理)
- 了解四大類(lèi)存儲(chǔ)器的速度和所處的位置? 容量大小
- 寄存器 (cpu內(nèi)部)> cache(cpu內(nèi)部) > 內(nèi)存卡 (cpu外部)> 磁盤(pán)(cpu外部)
- 寄存器只會(huì)保存數(shù)據(jù);cache也需要將數(shù)據(jù)拷貝到寄存器里面執(zhí)行
- ALU 算數(shù)邏輯運(yùn)算單元 負(fù)責(zé)運(yùn)算
- 舉一個(gè)例子 計(jì)算機(jī)計(jì)算 3+2 計(jì)算器讀取3 將3讀到R1寄存器,然后讀+,ALU會(huì)讀+,因?yàn)?#43;需要兩個(gè)數(shù),因此通過(guò)地址總線形成地址,將2讀到R2寄存器,計(jì)算,通過(guò)R1和R2取數(shù)據(jù),然后將數(shù)據(jù)計(jì)算結(jié)果存到寄存器R3,然后找地址,將數(shù)據(jù)結(jié)果存儲(chǔ)到內(nèi)存的一個(gè)位置,(寫(xiě)回內(nèi)存)。
CPU位數(shù) OS位數(shù) 內(nèi)存地址總線數(shù) 內(nèi)存數(shù)據(jù)總線數(shù) 邏輯地址位數(shù) 物理地址位數(shù)
- cpu位數(shù) 和 寄存器的位數(shù)相關(guān),如果寄存器的個(gè)數(shù)是32則cpu是32位;如果寄存器個(gè)數(shù)是64則cpu是64位。
- 32位的寄存器可以處理2^32大小的數(shù)據(jù);64位的寄存器可以處理2^64大小的數(shù)據(jù)
- os位數(shù)(操作系統(tǒng)的位數(shù)):硬件限制軟件;軟件可以自定義(軟件分成32位或者64位);os位數(shù)等價(jià)于邏輯地址的位數(shù),二者相等。也等價(jià)于虛擬內(nèi)存的理論大小。
- 32位cpu只可以安裝32位操作系統(tǒng);64位cpu既可以安裝32位也可以安裝64位操作系統(tǒng)
- 數(shù)據(jù)總線數(shù) 如果是8根 如果傳輸32位數(shù)據(jù),需要傳輸4次;64位 傳輸數(shù)據(jù) 需要8次;現(xiàn)實(shí)生活中有 8 、16 、32 和 64根數(shù)據(jù)總線
- 數(shù)據(jù)總線:一般考研常規(guī)使用的是8根數(shù)據(jù)總線 ,每次可以傳輸8位數(shù)據(jù),如果寄存器的大小是32,需要傳輸4次將數(shù)據(jù)填滿(mǎn)一個(gè)寄存器;如果是64位寄存器,需要傳輸8次將數(shù)據(jù)填滿(mǎn)一個(gè)寄存器
- 可訪問(wèn)內(nèi)存的大小 + 磁盤(pán)大小 大于等于 虛擬內(nèi)存的實(shí)際大小
- 虛擬內(nèi)存理論大小 大于等于 虛擬內(nèi)存實(shí)際大小
- 但是現(xiàn)實(shí)生活中有 16位 32位 64位數(shù)據(jù)總線
- 物理地址總線數(shù) (物理地址總線數(shù)):比如上面的例子中,地址總線有32位,每一個(gè)地址是由32位0或者1組成,從硬件限制可訪問(wèn)內(nèi)存的大小。這里屬于1,硬件限制,限制了可訪問(wèn)內(nèi)存的大小。比如電腦是32位的,那么根據(jù)可以訪問(wèn)的物理地址總線,有0-2^32-1,也就是4G的內(nèi)存,即使安裝8G的內(nèi)存條,剩余的空間是無(wú)法訪問(wèn)的。
- 或者2,內(nèi)存卡限制,比如32位機(jī)器安裝2G內(nèi)存卡,剩余的空間無(wú)法訪問(wèn)
- 或者3,軟件限制,比如譯碼器原理,限制輸入端輸入的位數(shù),限制輸出端可以訪問(wèn)的地址
- 三個(gè)限制 ,取最小值作為可訪問(wèn)的內(nèi)存大小
- 邏輯地址 是將程序從磁盤(pán)拷貝到內(nèi)存,可以拷貝最大的行數(shù),這個(gè)和操作系統(tǒng)的位數(shù)有很大的關(guān)系
內(nèi)存管理邏輯圖
- 程序經(jīng)過(guò)編譯和鏈接形成exe程序,從磁盤(pán)將程序裝入內(nèi)存執(zhí)行,進(jìn)行程序的運(yùn)行
- 裝入?1,如何裝入?2,裝在哪里?(1)記錄 (表格)? (2) 查詢(xún) (表格)
編譯和鏈接
- 編譯,將C語(yǔ)言轉(zhuǎn)化為匯編語(yǔ)言,機(jī)器語(yǔ)言
- 各個(gè)模塊的邏輯地址,邏輯地址也叫做相對(duì)地址
- 鏈接 ,將多個(gè)有交集的匯編語(yǔ)言、機(jī)器語(yǔ)言合并到一起,會(huì)改變先前的邏輯地址,經(jīng)過(guò)編譯鏈接之后形成可執(zhí)行文件
- LOAD 1,6? 將第六行的變量加到寄存器1里面;ADD 1,8 將第8行變量和寄存器1里面的數(shù)據(jù)相加;STORE 1,10 將計(jì)算的結(jié)果(寄存器1中的數(shù)據(jù))存儲(chǔ)到第10行變量C
- 匯編 每一行指令占據(jù)兩行,匯編使用邏輯地址指向變量
裝入
- 如果隨意裝入程序,cpu可能無(wú)法找到每一條執(zhí)行程序。因?yàn)榫幾g的代碼所使用的的指令是相對(duì)本程序而言的,比如 LOAD 1,6;是將第六行的變量放入到寄存器1里面,而cpu會(huì)將整個(gè)內(nèi)存條的起始位置作為程序的開(kāi)始位置,因此,對(duì)這個(gè)命令使用的位置6和整個(gè)內(nèi)存條的位置6是沖突的,形成地址錯(cuò)位。
- 地址錯(cuò)位 本質(zhì)上是由于 邏輯地址和物理地址不匹配 造成的沖突;
- 物理地址是絕對(duì)的;邏輯地址是相對(duì)的
- 將程序從磁盤(pán) 拷貝到 內(nèi)存 ,其邏輯地址會(huì)發(fā)生變化,指令后面所使用的相對(duì)地址也要隨之變化,才可以運(yùn)行。
- 程序編譯使用的是邏輯地址(相對(duì)地址);內(nèi)存卡使用的是物理地址(絕對(duì)地址)。
- OS位數(shù)和邏輯地址的位數(shù) 是等價(jià)的。如果程序編譯很長(zhǎng),超出位數(shù)的代碼無(wú)法識(shí)別,不可以超過(guò)機(jī)器程序(2^操作系統(tǒng)的位數(shù))的大小。
- C語(yǔ)言中 函數(shù)名字和變量名字本質(zhì)上都是地址
- 解決方案 :1,絕對(duì)裝入;2,靜態(tài)重定位裝入;3,動(dòng)態(tài)重定位裝入
解決虛擬地址和物理地址錯(cuò)位的三種方法
1,絕對(duì)裝入
- 裝入前就確定好程序的裝入位置,使得程序邏輯地址和物理地址對(duì)齊,不錯(cuò)位
- 開(kāi)發(fā)程序的時(shí)候就指定我要從? 指定的位置上編譯程序,比如我的程序執(zhí)行需要將程序拷貝到內(nèi)存的第1000行以后,這樣內(nèi)存地址和物理地址一一對(duì)齊,不會(huì)錯(cuò)位
- 那么這個(gè)程序每次運(yùn)行永遠(yuǎn)拷貝到指定的位置
2,靜態(tài)重定位裝入
- 裝入時(shí)候,動(dòng)態(tài)指定將程序裝入的位置,由裝入程序的邏輯地址進(jìn)行一次性修改,從而避免錯(cuò)位。每拷貝一行就改變一行中的地址,從而避免錯(cuò)位(邊裝入邊修改)
- 如果不指定,都是默認(rèn)從0開(kāi)始作為起始地址
- 那么每次執(zhí)行的程序的邏輯地址都是不同的,這個(gè)地址是裝入前動(dòng)態(tài)設(shè)置的,因此是 重定位 的概念
- 靜態(tài)是指,這個(gè)程序一旦加載到內(nèi)存,地址就指定了,就不可以改變了;要想移動(dòng),只可以關(guān)閉程序,重新指定程序的起始位置
3,動(dòng)態(tài)重定位裝入
- 程序運(yùn)行的時(shí)候,利用重定位寄存器來(lái)彌補(bǔ)作用,讓cpu認(rèn)為邏輯地址和物理地址是對(duì)齊的,不錯(cuò)位
- 將程序原封不動(dòng)拷貝到內(nèi)存,此時(shí)邏輯地址和物理地址是存在一個(gè)錯(cuò)位。程序拷貝到內(nèi)存會(huì)創(chuàng)建一個(gè)pcb,存儲(chǔ)相關(guān)信息,其中入口地址,指定程序拷貝到內(nèi)存的位置。
- 利用CPU內(nèi)部的重定位寄存器,存儲(chǔ)上述提到的內(nèi)存位置。每次運(yùn)行的時(shí)候,會(huì)在指令的后面 異步加上內(nèi)存的位置,補(bǔ)齊邏輯地址和物理地址之間的錯(cuò)位。
- 如果程序變化,程序直接移動(dòng),直接修改pcb和重定位寄存器里面數(shù)值就可以讓邏輯地址和程序地址對(duì)齊
內(nèi)存保護(hù)
- 也叫做越界保護(hù)
- 內(nèi)存保護(hù) 由 硬件和os操作系統(tǒng)共同保障
- 實(shí)現(xiàn)方法:
- 1,上下限寄存器,比如木馬程序拷貝到內(nèi)存中的1000到2000行,那么下限是1000,上限是2000,如果內(nèi)部程序想訪問(wèn)3500,和上下限對(duì)比,不符合,因此報(bào)錯(cuò)
- 2,基址寄存器(重定位) + 限長(zhǎng)寄存器(界地址);告訴首地址,通過(guò)限長(zhǎng)寄存器得到程序的占用空間,因此得到程序的上限
單一連續(xù)內(nèi)存分配
- 內(nèi)存卡分為系統(tǒng)區(qū)(os操作系統(tǒng))和用戶(hù)區(qū)(操作軟件)
- 用戶(hù)區(qū)每次只可以裝入一個(gè)程序
- 特點(diǎn):
- 1,單用戶(hù) 單任務(wù)
- 2,內(nèi)存卡利用率極低 因?yàn)橛袃?nèi)部碎片,程序只用到了一部分
- 3,通常采用絕對(duì)裝入的方式
固定分區(qū)分配
- 裝入多道程序?
- 克服單一連續(xù)分配只可以裝入一個(gè)程序的缺點(diǎn),在用戶(hù)區(qū)進(jìn)行劃分,每個(gè)區(qū)塊分配不同的程序
- 劃分可以都相等 或者 每個(gè)區(qū)塊的大小不一樣,減少浪費(fèi)
- 特點(diǎn):
- 1,用戶(hù)區(qū)分成很多小的分區(qū),每個(gè)分區(qū)只裝入一道程序
- 2,分區(qū)的大小很有講究,太小裝不進(jìn)程序;太大內(nèi)存利用率低
- 3,有內(nèi)部碎片(內(nèi)部碎片:內(nèi)存分給你了,你沒(méi)有合理使用內(nèi)存,就叫內(nèi)部碎片)
- *外部碎片:內(nèi)存空間除去分給程序的各個(gè)分區(qū)之后,剩余的空間不足以放下任何程序,這個(gè)剩余的空間不屬于任何程序,叫做外部碎片
- 需要分區(qū)說(shuō)明表 記錄分區(qū)號(hào) 分區(qū)的大小 起始位置 狀態(tài)
- 提交程序的時(shí)候,查看哪一塊內(nèi)存是空閑的
- 一般使用靜態(tài)重定位技術(shù)
動(dòng)態(tài)程序分配
- 解決固定固定分區(qū)提前設(shè)定分區(qū)大小的弊端,進(jìn)程程序要多少給你多少,不多分配不少分配。
- 如果用戶(hù)區(qū)間只剩下2MB不足以分配程序,那么需要等待先前程序釋放資源,比如qq退出,釋放了8MB的內(nèi)存空間,lol立刻占用這8MB中的6MB,剩余2MB,這2MB就是外部碎片
- 由于程序的進(jìn)進(jìn)出出,導(dǎo)致的碎片數(shù)量越來(lái)越多,空間越來(lái)越小。進(jìn)行碎片合并。將很多碎片合并在一起,形成一個(gè)大的區(qū)間,這個(gè)合并過(guò)程是一個(gè)隨機(jī)的事件
- 需要使用緊湊的技術(shù),較少外部碎片,碎片的 移動(dòng)? 合并,這個(gè)移動(dòng)就涉及到了動(dòng)態(tài)重定位
- 動(dòng)態(tài)分區(qū) 需要分區(qū)說(shuō)明表,每一塊分區(qū)的大小不確定,動(dòng)態(tài)變化
- 如果一個(gè)程序加入內(nèi)存,但是有很多區(qū)塊都可以存放數(shù)據(jù),那么這個(gè)這個(gè)程序如何存放呢??
- 動(dòng)態(tài)分區(qū)算法:
- 1,首次適應(yīng):從內(nèi)存區(qū)間頭部開(kāi)始,第一次可以存放的位置
- 2,最佳適應(yīng):從內(nèi)存區(qū)間頭部開(kāi)始,找一個(gè)盡可能不浪費(fèi)的區(qū)塊;但這個(gè)并不是最佳的,反而會(huì)產(chǎn)生更多小的碎片,不可用,只能使用緊湊技術(shù)合并更多的碎片
- 3,最壞適應(yīng):從內(nèi)存區(qū)間頭部開(kāi)始,找一個(gè)最大的區(qū)塊;產(chǎn)生的碎片不會(huì)很小,反而可以給其他程序使用,因此不一定是最壞適應(yīng)
- 4,鄰邊適應(yīng):每次找合適的區(qū)塊不是從頭開(kāi)始,而是從上一次的位置開(kāi)始往下找
覆蓋技術(shù)
- 軟件運(yùn)行有128kb,要在64kb的內(nèi)存上運(yùn)行,覆蓋技術(shù)要求程序員在設(shè)計(jì)程序的時(shí)候,設(shè)計(jì)每個(gè)程序的啟動(dòng)的先后順序,將內(nèi)部分區(qū)分為固定區(qū),存儲(chǔ)主程序;覆蓋區(qū)用于代碼之間的運(yùn)行、覆蓋。
- 特色:
- 1,用在同一個(gè)程序進(jìn)程中
- 2,覆蓋技術(shù)實(shí)現(xiàn)了小內(nèi)存運(yùn)行大程序,但是這不是萬(wàn)能的
- 3,對(duì)程序員要求高 ,考慮性能
交換技術(shù)
- 交換技術(shù)發(fā)生在內(nèi)存緊張的情況下
- 交換技術(shù)主要用于不同進(jìn)程(程序)之間
- 覆蓋技術(shù)已經(jīng)過(guò)時(shí),交換技術(shù)仍然存在
- 將處于阻塞狀態(tài)下的程序拷貝到交換區(qū)域,將需要運(yùn)行的程序拷貝進(jìn)入內(nèi)存區(qū),交換是指內(nèi)存和磁盤(pán)之間的交換
分頁(yè)
基本分頁(yè)存儲(chǔ)
- 先前使用的固定分區(qū)分配產(chǎn)生內(nèi)部碎片,動(dòng)態(tài)分區(qū)分配會(huì)產(chǎn)生外部碎片。
- 每個(gè)碎片可能很小,但是積少成多,總和是一個(gè)不小的浪費(fèi)
- 分散分配:將大的程序進(jìn)行拆分變成很多的小的碎片,每個(gè)碎片分別拷貝到內(nèi)部或者外部產(chǎn)生的碎片中。
- 但是以什么作為標(biāo)準(zhǔn)進(jìn)行切分呢??大小不等,切片很難。因此引入分頁(yè)思想,都切成一樣大小的
- 特色:
- 1,程序可以被切塊
- 2,內(nèi)存也可以被切塊
- 3,切塊越小,浪費(fèi)越小
- 因?yàn)樗槠拇笮∈请S機(jī)產(chǎn)生的,因此對(duì)程序的切片不好處理,思路很簡(jiǎn)單,實(shí)現(xiàn)很難
如何分頁(yè)
- 將內(nèi)存卡(物理地址)和軟件程序(邏輯地址)都等分成4kb,然后將軟件程序的拷貝到內(nèi)存卡上面執(zhí)行,程序的大小和物理內(nèi)存的分塊大小都一致,但是如果不可以整除,會(huì)有部分浪費(fèi),但是這種浪費(fèi)很小。
- 內(nèi)存、磁盤(pán)、程序都會(huì)被切塊,內(nèi)存卡的一塊叫做 頁(yè)框(頁(yè)幀)
- 程序的片段叫做頁(yè)面,頁(yè)面可以被裝入頁(yè)框中
- 磁盤(pán)的分塊叫做 磁盤(pán)塊
- 磁盤(pán) 程序 和 內(nèi)存 都按照4kb進(jìn)行切割,這樣程序?qū)?磁盤(pán)和內(nèi)存都很方便;切片的大小需要符合2的指數(shù),2^0 = 1; 2^2 = 4;? 2^4 = 16;
- 為什么分塊使用4kb??這個(gè)不確定,有1Kb、16kb和32kb,4kb最常用,都是2的n次方的整數(shù)倍
- 設(shè)置mmu,就可以實(shí)現(xiàn)對(duì)內(nèi)存、程序和磁盤(pán)的kb大小的選擇,切換1kb、4kb和16kb
頁(yè)表
- 內(nèi)存卡的分塊編號(hào),從0開(kāi)始排序,其編號(hào)也叫做物理塊號(hào)、頁(yè)框號(hào)、頁(yè)幀號(hào)
- 程序 切分,也會(huì)進(jìn)行編號(hào),從0開(kāi)始,其編號(hào)叫做頁(yè)號(hào)、頁(yè)面號(hào)
- 將內(nèi)存卡切分的編號(hào)和程序切分的編號(hào)對(duì)應(yīng)起來(lái),叫做頁(yè)表。這個(gè)頁(yè)表存儲(chǔ)在內(nèi)存中,每個(gè)進(jìn)程都有自己的頁(yè)表。創(chuàng)建進(jìn)程的同時(shí)會(huì)創(chuàng)建pcb,pcb會(huì)存儲(chǔ)這個(gè)頁(yè)表的信息,從而讓操作系統(tǒng)找到這個(gè)頁(yè)表
- 頁(yè)表有倆列,好多行,第一列存儲(chǔ)頁(yè)號(hào),存儲(chǔ)邏輯地址;第二列存儲(chǔ)物理塊號(hào),也是物理地址
- 頁(yè)表項(xiàng) 是 頁(yè)表的一行
- 頁(yè)表 通過(guò)pcb被查詢(xún)到
- 頁(yè)表只能記錄塊和塊之間的映射關(guān)系,4kb 可以存儲(chǔ)很多的代碼,因此不會(huì)得到每一行代碼在哪一塊中的哪一行等相關(guān)信息
頁(yè)表、物理地址、邏輯地址三者之間的關(guān)系
- 數(shù)學(xué)關(guān)系
- 二進(jìn)制向左移1位表示十進(jìn)制除以2
- 人類(lèi)視角? 十進(jìn)制 整除取整為頁(yè)號(hào);求余為業(yè)內(nèi)偏移
- 機(jī)器視角? 二進(jìn)制 高位為頁(yè)號(hào);低位為業(yè)內(nèi)偏移
- 32位 以4k作為一個(gè)頁(yè),4k = 2^12 因此,低12位作為頁(yè)內(nèi)偏移,12到32位作為頁(yè)號(hào);讀高20位得到哪一頁(yè)(頁(yè)號(hào)),讀低12位知道屬于哪一行(業(yè)內(nèi)偏移)
- ?通過(guò)邏輯地址 -> 頁(yè)表(頁(yè)號(hào)) -> 通過(guò)頁(yè)表里面的邏輯地址和物理地址的對(duì)應(yīng)關(guān)系,找到物理塊號(hào),將物理塊號(hào) 和 業(yè)內(nèi)偏移合并在一起就得到了物理地址
- 邏輯地址和物理地址里面的業(yè)內(nèi)偏移 是一一對(duì)應(yīng)的,因?yàn)榘殉绦蚯衅截惖絻?nèi)存,代碼里面的地址是相對(duì)的,起始到終止的差距就是業(yè)內(nèi)偏移。物理塊號(hào)代表這個(gè)物理塊開(kāi)始的地址,加上這個(gè)代碼的業(yè)內(nèi)偏移,也就是物理塊結(jié)束的地址。
- 編號(hào)為何從0開(kāi)始?整除取整直接得到頁(yè)號(hào)
基本分頁(yè) 基本地址變換機(jī)構(gòu)
- 對(duì)邏輯地址進(jìn)行上面的操作,就可以得到頁(yè)號(hào),通過(guò)頁(yè)號(hào)查詢(xún)頁(yè)表,查詢(xún)到某一頁(yè)程序被裝載到內(nèi)存中哪一個(gè)物理塊里面,查詢(xún)到物理塊之后和業(yè)內(nèi)偏移量拼接在一起,構(gòu)成一個(gè)物理地址
- 上面這些需要使用到地址變換機(jī)構(gòu),才可以得到業(yè)內(nèi)偏移等信息
- 邏輯地址 前20位表示頁(yè)號(hào),后12位表示業(yè)內(nèi)偏移量。 通過(guò)頁(yè)號(hào) 和 匹配的物理塊號(hào)對(duì)應(yīng),
- 頁(yè)表存儲(chǔ)在內(nèi)存里邊,頁(yè)表記錄的是頁(yè)號(hào)和物理塊號(hào)(頁(yè)框號(hào))的對(duì)應(yīng)信息
- 頁(yè)表寄存器,存儲(chǔ)在cpu里面,前半段存儲(chǔ)頁(yè)表的起始地址,后半段存儲(chǔ)存儲(chǔ)頁(yè)表長(zhǎng)度(程序放到內(nèi)存里邊執(zhí)行的時(shí)候最大的長(zhǎng)度)。這個(gè)是唯一的,一級(jí)頁(yè)表,后面會(huì)有多級(jí)頁(yè)表,動(dòng)態(tài)通過(guò)pcb進(jìn)行更新
- 頁(yè)表寄存器 相當(dāng)于給定指針 + 數(shù)據(jù)長(zhǎng)度,得到的這一塊內(nèi)存就是存儲(chǔ)的頁(yè)表信息
- 頁(yè)表長(zhǎng)度 存儲(chǔ)的是所有頁(yè)號(hào)的信息
- 頁(yè)表長(zhǎng)度 *? 4KB = 程序的大小
- 頁(yè)號(hào) 大于 頁(yè)表長(zhǎng)度,說(shuō)明這個(gè)程序不屬于當(dāng)前程序,產(chǎn)生 越界中斷。如果小于 則屬于合法的,就可以進(jìn)行查表,CPU先根據(jù)頁(yè)表寄存器里邊存儲(chǔ)的頁(yè)表起始地址找到 頁(yè)表開(kāi)始的地方,根據(jù)頁(yè)表存儲(chǔ)的頁(yè)號(hào),在頁(yè)表里面查詢(xún)。通過(guò)頁(yè)號(hào)找到后面存儲(chǔ)的頁(yè)框號(hào)(物理塊號(hào)),將頁(yè)框號(hào)(物理塊號(hào)) 和 業(yè)內(nèi)偏移量拼接在一起,就形成了物理地址
- pcb更新頁(yè)表寄存器的數(shù)值
考點(diǎn)
- 執(zhí)行一條指令一共會(huì)訪問(wèn)幾次內(nèi)存?
- 執(zhí)行指令,需要物理地址,1,尋找物理地址,2,讀入cpu內(nèi)部,3,執(zhí)行指令
- 1,尋找物理地址:利用頁(yè)號(hào)到內(nèi)存里邊的頁(yè)表查詢(xún)物理塊號(hào),拼接形成物理地址,一次訪問(wèn)內(nèi)存
- 2,讀入cpu內(nèi)部,找到物理地址需要將指令拷貝到CPU的內(nèi)部,一次訪問(wèn)內(nèi)存? ?然后執(zhí)行命令,一級(jí)頁(yè)表的前提下,需要訪問(wèn)兩次內(nèi)存
- 如果是兩條指令 則是4次
具有快表的地址變換機(jī)構(gòu)
- 快表也是頁(yè)號(hào)和物理塊號(hào)的拼接,相對(duì)存儲(chǔ)在內(nèi)存中的頁(yè)表,快表存儲(chǔ)在頁(yè)表寄存器,是比頁(yè)表先一步被訪問(wèn)。主要的目的是記錄先前曾經(jīng)訪問(wèn)過(guò)的歷史記錄,類(lèi)似于電腦的快捷訪問(wèn),為了減少訪問(wèn)內(nèi)存的次數(shù),但是存儲(chǔ)的條數(shù)很少。因?yàn)榇鎯?chǔ)在寄存器,因此CPU先調(diào)用寄存器很快,如果找不到才會(huì)訪問(wèn)內(nèi)存。
- 因?yàn)榭毂頃?huì)保存最新的訪問(wèn)記錄,是一個(gè)動(dòng)態(tài)更新的過(guò)程,因此在訪問(wèn)內(nèi)部指令的時(shí)候有可能會(huì)查到有可能查不到,有一定的概率。這個(gè)叫做命中率,局部性原理 時(shí)間 + 空間
- 問(wèn)題:執(zhí)行1條指令,命中率是90%,那么需要訪問(wèn)幾次內(nèi)存?如果快表存在 1次;如果快表不存在需要兩次;乘上對(duì)應(yīng)的概率 總的訪問(wèn)內(nèi)存次數(shù) = 0.9 * 1 + 2 * 0.1 = 1.1
- 因此:執(zhí)行10條指令,命中率是90%,那么需要訪問(wèn)幾次內(nèi)存? 10 * 1.1 = 11次,相較于沒(méi)有快表,2 * 10 = 20次
- 快表 命中率很高 是因?yàn)槌绦虻木植啃栽?#xff0c;也就是for等循環(huán),在這個(gè)地方執(zhí)行很多次,局部原理 體現(xiàn)在時(shí)間和空間局部性
兩級(jí)頁(yè)表
- 引入兩級(jí)頁(yè)表的原因?
- 一級(jí)頁(yè)表 頁(yè)號(hào) + 物理塊號(hào) 組成的頁(yè)表項(xiàng),一共有n個(gè)頁(yè)表項(xiàng)
- 一個(gè)頁(yè)表項(xiàng)有多大?估計(jì)
- 估計(jì)的邏輯:1,邏輯地址 (程序最大空間) -> 2,頁(yè)面大小 (視情況而定,4kb、16kb) 3,做多分幾頁(yè);4,頁(yè)號(hào)位數(shù);5,估計(jì)頁(yè)表大小項(xiàng)?補(bǔ)充
- 頁(yè)表項(xiàng)確定之后,一個(gè)頁(yè)表項(xiàng)有多大 ,因?yàn)橐粋€(gè)頁(yè)表很大,如果多個(gè)頁(yè)表進(jìn)入內(nèi)存,會(huì)很卡,考慮到分頁(yè)的時(shí)候,程序和內(nèi)存都可以被分塊,頁(yè)表是不是也可以分塊??
- 發(fā)明一個(gè)頁(yè)表,記錄頁(yè)表的切塊,變成了兩級(jí)頁(yè)表的概念
如何設(shè)計(jì)兩級(jí)頁(yè)表
- 條件:32位操作系統(tǒng) 4kb頁(yè)面大小 4B頁(yè)表項(xiàng)大小
- 設(shè)計(jì)
- 1,按照最大程序進(jìn)行切割
- 2,頁(yè)表切塊,塊大小 = 頁(yè)面大小
- 3,當(dāng)一個(gè)頁(yè)表可以裝在一個(gè)頁(yè)面之內(nèi)時(shí),多級(jí)頁(yè)表就設(shè)計(jì)結(jié)束
- 4,邏輯地址切塊,塊位數(shù) = 該級(jí)頁(yè)表每塊容納的頁(yè)表項(xiàng)
如何設(shè)計(jì)多級(jí)頁(yè)表
- 條件:64位操作系統(tǒng) 4kb頁(yè)面大小 4B頁(yè)表項(xiàng)大小
- 設(shè)計(jì)
- 1,按照最大程序進(jìn)行切割
- 2,頁(yè)表切塊,塊大小 = 頁(yè)面大小
- 3,當(dāng)一個(gè)頁(yè)表可以裝在一個(gè)頁(yè)面之內(nèi)時(shí),多級(jí)頁(yè)表就設(shè)計(jì)結(jié)束
- 4,邏輯地址切塊,塊位數(shù) = 該級(jí)頁(yè)表每塊容納的頁(yè)表項(xiàng)
虛擬內(nèi)存
引入請(qǐng)求分頁(yè)的原因
- 將QQ程序拷貝到磁盤(pán),由于文件管理,將qq程序在磁盤(pán)上進(jìn)行存儲(chǔ)。運(yùn)行的時(shí)候,將QQ程序從磁盤(pán)拷貝到內(nèi)存,QQ程序的登錄界面只會(huì)執(zhí)行一次,體現(xiàn)了一次性,如果他只執(zhí)行一次卻一直留在內(nèi)存會(huì)導(dǎo)致內(nèi)存的浪費(fèi),駐留性。因此 需要優(yōu)化一次性和駐留性,
- 優(yōu)化的依據(jù),程序的局部性原理,程序中有太多的循環(huán),太多的模塊
- 如何優(yōu)化,按照需要分批裝入、調(diào)出? ->? 請(qǐng)求分頁(yè)存儲(chǔ)管理? (虛擬內(nèi)存)
- 請(qǐng)求分頁(yè)管理的操作流程? ->? 運(yùn)行程序之前,為程序分配小于整體大小的內(nèi)存空間,比如先裝入登錄模塊的程序,登錄完成之后,將登錄模塊的程序調(diào)出,將需要的程序按照需要逐個(gè)裝入。
請(qǐng)求分頁(yè)的工作原理
- 在內(nèi)存的一個(gè)地方存儲(chǔ)一個(gè)QQ程序的頁(yè)表,查詢(xún)頁(yè)表實(shí)現(xiàn)邏輯地址和物理地址的轉(zhuǎn)換,從而得到程序的片段存儲(chǔ)到物理磁盤(pán)的哪一個(gè)塊里面,以及存儲(chǔ)在物理塊里面的哪一行
- 在cpu的內(nèi)部存儲(chǔ)一個(gè)快表,快表是程序的頁(yè)表歷史記錄的備份。因?yàn)榛痉猪?yè),頁(yè)表是存儲(chǔ)的QQ程序切割之后存儲(chǔ)到內(nèi)存中物理塊的對(duì)應(yīng)的邏輯信息
- 請(qǐng)求分頁(yè)的工作原理:1,大致的流程一致,但是頁(yè)表記錄的信息不一樣。因?yàn)榘凑招枨?#xff0c;需要將文件切片動(dòng)態(tài)的植入換出,這就需要記錄哪些頁(yè)面已經(jīng)在內(nèi)存中,頁(yè)面執(zhí)行的次數(shù)等信息,因此引出了(置換算法),動(dòng)態(tài)將需要的頁(yè)面放入內(nèi)存中,替代先前的使用過(guò)的,不需要的頁(yè)面
- 基本分頁(yè)頁(yè)表 記錄了每一塊的邏輯地址和物理地址的對(duì)應(yīng)關(guān)系;但是 對(duì)請(qǐng)求分頁(yè)頁(yè)表而言,有的時(shí)候找不到,這個(gè)塊還沒(méi)有裝載到內(nèi)存中,需要將這個(gè)塊替換到內(nèi)存中分配的駐留集里面來(lái)使用。
- 相較于基本分頁(yè),請(qǐng)求分頁(yè)對(duì)邏輯地址和物理地址的對(duì)應(yīng)關(guān)系雖然也需要通過(guò)頁(yè)表,但是并不簡(jiǎn)簡(jiǎn)單單,期間多了mmu,虛擬地址到物理地址翻譯
助留集 和 工作集是一個(gè)意思
- 二者是一個(gè)概念,就是操作系統(tǒng)給單個(gè)進(jìn)程分配的幾個(gè)物理框所裝的頁(yè)面的集合
- 每次程序運(yùn)行的時(shí)候需要將程序從磁盤(pán)拷貝到內(nèi)存,根據(jù)生存時(shí)間的不同分為主程序頁(yè)面 (常駐內(nèi)存的頁(yè)面)? 和? 子程序頁(yè)面
- 比如 主程序界面作為一個(gè)界面UI,這個(gè)常駐內(nèi)存,除非程序退出或者異常退出;而不同的功能就是子程序,需要的時(shí)候調(diào)入內(nèi)存執(zhí)行,使用完之后調(diào)出內(nèi)存
- 駐留集的大小:不能過(guò)大,如果過(guò)大,退化為基本頁(yè)表,浪費(fèi)內(nèi)存;如果過(guò)小,置換頁(yè)面發(fā)生頻繁,運(yùn)行程序的時(shí)候會(huì)很卡;要適中,相對(duì)的概念
三種策略? 分配助留集的大小的策略
- 固定分配局部置換:計(jì)劃經(jīng)濟(jì)策略,非常死板,計(jì)劃趕不上變化,程序是變化的;局部是指按照需求,所需的只可以替換自己事先分配好的頁(yè)面
- 可變分配全局替換:低級(jí)的市場(chǎng)經(jīng)濟(jì)策略,盲目擴(kuò)大生產(chǎn),產(chǎn)業(yè)泡沫;如果程序需要更大的內(nèi)存空間,會(huì)進(jìn)一步動(dòng)態(tài)增加駐留集的大小,但是會(huì)導(dǎo)致裝入程序的數(shù)量下降,先前分配給程序的駐留集不會(huì)減少;
- 可變分配局部替換:高級(jí)的市場(chǎng)經(jīng)濟(jì)策略,抽肥補(bǔ)瘦,動(dòng)態(tài)調(diào)整,十分靈活;減少缺頁(yè)率。每個(gè)程序所需要的駐留集的大小是動(dòng)態(tài)調(diào)整的
- 缺頁(yè)率 :當(dāng)分配的物理塊(駐留集)一定的時(shí)候,調(diào)入和調(diào)出的頻率是成正比
- 可變分配局部替換在n1 n2之間動(dòng)態(tài)變化,協(xié)調(diào)缺頁(yè)率和物理塊數(shù)量之間的關(guān)系
頁(yè)表改進(jìn) 和 缺頁(yè)中斷
- 基本分頁(yè)是將程序所有的內(nèi)容拷貝到內(nèi)存中;請(qǐng)求分頁(yè)是按照需要將需要的裝入內(nèi)存,動(dòng)態(tài)裝載調(diào)出
- 請(qǐng)求分頁(yè)頁(yè)表 具體列(字段)如下
- 頁(yè)號(hào) 0 - n
- 物理塊號(hào)?
- 狀態(tài)位 有效位,標(biāo)志是否在內(nèi)存中,否則缺頁(yè)中斷,并且進(jìn)入阻塞狀態(tài);如果物理塊有數(shù)據(jù),但是狀態(tài)為0,表示并沒(méi)有被裝入,狀態(tài)位控制物理塊是否有效;有效的位數(shù)要小于駐留集的大小;如果產(chǎn)生缺頁(yè)中斷,利用調(diào)度算法從磁盤(pán)將需要的頁(yè)拷貝到內(nèi)存
- 外存地址 磁盤(pán)塊號(hào),如果需要的頁(yè)不在內(nèi)存,需要從磁盤(pán)塊導(dǎo)入頁(yè)
- 為置換算法提供參考使用的參數(shù) 訪問(wèn)字段(統(tǒng)計(jì)使用,區(qū)分程序是長(zhǎng)期使用還是短期使用,執(zhí)行次數(shù)越少的越容易被調(diào)出)、修改位(對(duì)于變量的數(shù)值修改需要從內(nèi)存改回磁盤(pán))、使用位(clock算法使用)等
- 如果需要的頁(yè)不在內(nèi)存中 就會(huì)產(chǎn)生缺頁(yè)中斷,然后從磁盤(pán)里面取頁(yè)面到內(nèi)存中,替換
頁(yè)面調(diào)度時(shí)機(jī)
- 程序開(kāi)始運(yùn)行的時(shí)候,使用預(yù)調(diào)頁(yè)策略(局部性原理),程序員指定的,main函數(shù),操作系統(tǒng)底層將其作為程序的入口
- 程序的運(yùn)行過(guò)程中 修改請(qǐng)求頁(yè)表相關(guān)信息
- 程序運(yùn)行中,發(fā)生缺頁(yè)時(shí),比如程序啟用不同的功能;調(diào)入一頁(yè)頁(yè)面,請(qǐng)求調(diào)頁(yè)策略,(頁(yè)面置換算法),使用硬件中斷,中斷處理程序,啟用頁(yè)面置換算法,將新的頁(yè)面替換舊的頁(yè)面
置換算法
OPT頁(yè)面置換算法 最佳? 向未來(lái)看
- 算法思想:淘汰以后永不訪問(wèn) 或者 將來(lái)最長(zhǎng)時(shí)間不再訪問(wèn)的頁(yè)面
- 算法特點(diǎn):不可以預(yù)測(cè)未來(lái),因此這個(gè)算法不能實(shí)現(xiàn)
- 推斷出? ?缺頁(yè)中斷次數(shù) / 頁(yè)面置換次數(shù)? ?
- 缺頁(yè)次數(shù) -? 頁(yè)面置換? =? 工作集(駐留集)
- 理想化,很難實(shí)現(xiàn),因此其余算法是不可能超過(guò)他的
- 發(fā)生缺頁(yè)中斷的時(shí)候 除了剛開(kāi)始沒(méi)有數(shù)據(jù),剩余的都會(huì)發(fā)生頁(yè)面置換
- 下面的例子 發(fā)生了9次缺頁(yè)中斷
FIFO頁(yè)面置換算法
- 算法思想:淘汰先調(diào)入的頁(yè)面,隊(duì)列實(shí)現(xiàn)?
- 算法特點(diǎn):簡(jiǎn)單、性能差、且有belady異常
- 推斷出 缺頁(yè)中斷次數(shù)/頁(yè)面置換次數(shù)
- 15次中斷 15-3 = 12次 頁(yè)面置換
LRU算法 最近未使用算法? 向歷史看
- 算法思想:淘汰最近未使用的頁(yè)面 (使用過(guò)去來(lái)預(yù)測(cè)未來(lái))
- 算法特點(diǎn):性能優(yōu)異,接近最佳置換算法,需要硬件棧的支持,開(kāi)銷(xiāo)極大
- 推斷出?缺頁(yè)中斷次數(shù) / 頁(yè)面置換次數(shù)
CLOCK算法 又叫NRU(Not recently used)
- 算法思想:通過(guò)鐘表掃描法,淘汰最近未使用的頁(yè)面(頁(yè)表增加一個(gè)使用位)首次裝入置1;再次訪問(wèn)置1;掃描時(shí)將1變?yōu)?
- 算法特點(diǎn):由于最近未使用和最久未使用的思想接近,因此CLOCK 算法和LRU算法性能很接近
- 推斷出?缺頁(yè)中斷次數(shù) / 頁(yè)面置換次數(shù)
- 但是CLOCK算法性能更高,不需要硬件,而LRU算法需要硬件棧的支持
改進(jìn)CLOCK算法
- 算法思想:通過(guò)鐘表掃描法,淘汰最近未使用的頁(yè)面中未修改頁(yè)面
- (u,m) use modify
- (0,0) 未使用未修改
- (0,1) 未使用已修改
- (1,0) 已使用未修改
- (1,1) 已使用已修改
- 算法特點(diǎn):相比CLOCK算法,減少了頁(yè)面回寫(xiě)磁盤(pán)的概率,從而省卻了回寫(xiě)的時(shí)間 (I/O時(shí)間)
- 對(duì)變量的數(shù)值修改會(huì)導(dǎo)致內(nèi)存和磁盤(pán)數(shù)據(jù)的不一致,因此要根據(jù)修改的內(nèi)容更改磁盤(pán)數(shù)據(jù);先淘汰未使用的,就減少更新數(shù)據(jù)所帶來(lái)的IO操作
- 算法步驟:1,按照鐘表掃描法,尋找(0,0)用于替換,找不到就進(jìn)行第二步;2,重新執(zhí)行鐘表掃描算法,尋找(0,1)用于替換,在掃描中,將(1,0)改為(0,0),(1,1)改為(0,1),找不到回到第1步
- 注意事項(xiàng):第1步只查不修改;第二步邊查邊修改
- 改進(jìn)CLOCK算法更加細(xì)膩
從何處調(diào)入頁(yè)面,調(diào)出的頁(yè)面存放在哪里?
- 臨時(shí)存放程序的副本 -> 磁盤(pán)必須要有一塊對(duì)換區(qū)(swap)
- 可修改程序 ->? 變量 (已修改 / 未修改);可修改程序如果已經(jīng)修改,回寫(xiě)磁盤(pán),寫(xiě)到對(duì)換區(qū)里面的程序副本里面
- 不可修改程序 常量
- 如果對(duì)換區(qū)很大的時(shí)候,每次運(yùn)行的時(shí)候,將程序拷貝到對(duì)換區(qū),程序運(yùn)行的時(shí)候,是將對(duì)換區(qū)里面的程序拷貝到內(nèi)存
- 對(duì)換區(qū)大小問(wèn)題(運(yùn)行程序,將程序從文件夾拷貝一份到磁盤(pán)的對(duì)換區(qū),然后從兌換區(qū)拷貝程序到內(nèi)存區(qū))
- 對(duì)換區(qū)足夠大,從磁盤(pán)的對(duì)換區(qū)將數(shù)據(jù)文件拷貝到內(nèi)存
- 對(duì)換區(qū)不夠大,對(duì)換區(qū)只裝入可修改程序,不裝入不修改程序,不可修改程序從程序安裝文件夾讀取
- unix 方式:讀取文件都是從程序安裝文件里面,但是回調(diào)的時(shí)候,無(wú)論是可修改程序還是不可修改程序都寫(xiě)到對(duì)換區(qū)里面;然后第二次以后就會(huì)從對(duì)換區(qū)進(jìn)行數(shù)據(jù)交互
- 1,從何處調(diào)入頁(yè)面?從磁盤(pán)的對(duì)換區(qū)將數(shù)據(jù)文件拷貝到內(nèi)存
- 2,調(diào)出的頁(yè)面存放在哪里?將修改的內(nèi)容回寫(xiě)到對(duì)換區(qū),不可修改程序不會(huì)回寫(xiě)到文件夾
- 不對(duì)源文件進(jìn)行操作,防止不同用戶(hù)之間的數(shù)據(jù)干擾
- 程序安裝目錄是原件,對(duì)換區(qū)拷貝的是程序的副本
虛擬內(nèi)存的大小
- 虛擬內(nèi)存 小于等于 邏輯地址支持的最大空間(軟件限制) 軟件支持的容量很大,不需要考慮,一般硬件限制就是虛擬內(nèi)存可以支持的最大內(nèi)存
- 磁盤(pán)裝載大程序的一部分 + 內(nèi)存裝載大程序的一部分,合起來(lái)使大程序在小內(nèi)存內(nèi)運(yùn)行,通過(guò)對(duì)換區(qū),實(shí)現(xiàn)數(shù)據(jù)的交互
- 64位OS -> 2^32 * 4GB
- 32位OS -> 4GB
- 虛擬內(nèi)存 小于等于 (內(nèi)存卡 + 磁盤(pán))硬件限制
- 用小內(nèi)存運(yùn)行大程序
- 考題形式:在一臺(tái)實(shí)現(xiàn)了虛擬內(nèi)存技術(shù)的計(jì)算機(jī)里面,最大支持運(yùn)行多大的軟件
- 游戲由程序、數(shù)據(jù)、模型(人物)、過(guò)渡動(dòng)畫(huà)等組成
抖動(dòng)現(xiàn)象
- 發(fā)生時(shí)間:如果駐留集不夠大的話,置換頁(yè)面時(shí)就可能會(huì)產(chǎn)生抖動(dòng)現(xiàn)象(對(duì)換區(qū) 和 內(nèi)存區(qū) 之間交換數(shù)據(jù)),又叫顛簸
- 特點(diǎn):1,頻率高;2,來(lái)來(lái)回回
虛擬地址和物理地址之間的翻譯
CPU執(zhí)行一條指令的過(guò)程
- 通過(guò)地址翻譯,由虛擬地址得到物理地址(先查快表,再查頁(yè)表)
- 通過(guò)物理地址,將指令讀到CPU內(nèi)的寄存器(ALU)里面執(zhí)行
- 頁(yè)表 :頁(yè)號(hào)、物理塊號(hào)、有效位 三個(gè)最關(guān)鍵
- 快表查詢(xún):直接映射(Hash查找)、全相聯(lián)映射、組相聯(lián)映射
- 全相聯(lián)映射:快表和頁(yè)表一樣,查詢(xún)的時(shí)候需要從頭查到尾
- 因?yàn)?全相聯(lián)映射 內(nèi)部存儲(chǔ)的條目是無(wú)序的,查詢(xún)比較浪費(fèi)時(shí)間,因此改進(jìn)為組相聯(lián)映射
- 2路組相聯(lián)映射,是指將先前的兩個(gè)條目組合在一起,形成一組,相較于先前的全相聯(lián)映射多了組索引、TLB索引,他倆是通過(guò) 頁(yè)號(hào) 進(jìn)行分解得到的。
- 虛擬地址(邏輯地址結(jié)構(gòu)):將先前全相聯(lián)映射中的頁(yè)號(hào)p化為T(mén)LB標(biāo)記和組索引、業(yè)內(nèi)偏移w不變;
- 如果是8條目2路組相聯(lián),分成四組,將頁(yè)號(hào)的后兩位(00,01,10,11表示組號(hào))作為組索引,剩余的作為T(mén)LB,在組索引唯一的條件下,TLB是唯一的標(biāo)識(shí)
- 只有地位作為組索引,高位仍然滿(mǎn)足遞增序列,且唯一
虛擬內(nèi)存-虛擬地址到物理地址的翻譯 例題
系統(tǒng)滿(mǎn)足如下條件,
- 有一個(gè)TLB與一個(gè)datacahe
- 存儲(chǔ)器以字節(jié)為單位進(jìn)行編址 ;以字節(jié)為單位進(jìn)行編址,一行8bit作為一個(gè)地址,一行作為0;兩個(gè)字節(jié)為單位進(jìn)行編址,將先前的兩行編為0;全字,四個(gè)字節(jié)編址
- 虛擬地址14位
- 物理地址12位
- 頁(yè)面大小64B
- TLB四路組相聯(lián),共16個(gè)條目
- data cache是物理地址,直接映射,行大小為4字節(jié),總共16組
- 請(qǐng)翻譯虛擬地址
- 0x03d4 ;
- 0x00f1 ;
- 0x0229;
- 有快表,先到快表里面查詢(xún),將虛擬地址按照快表的格式進(jìn)行切分
?
基本分段管理
- 基本分頁(yè)是將程序所有文件以4kb作為一個(gè)切塊,存儲(chǔ)在磁盤(pán)的一段空間;基本分段是按照功能或者模塊將相關(guān)聯(lián)的代碼作為一個(gè)整體,分散存儲(chǔ)在磁盤(pán)中
- 分段的好處:程序多開(kāi)時(shí)可以共享數(shù)據(jù);分段可以實(shí)現(xiàn)程序多開(kāi),或者多個(gè)程序公用一個(gè)程序段
- 比如qq程序開(kāi)了兩個(gè),登錄不同的qq號(hào),但是有些功能是共享的,比如網(wǎng)絡(luò),因此將網(wǎng)絡(luò)的代碼進(jìn)行復(fù)用
如何進(jìn)行程序分段
- 按照程序(進(jìn)程)自然段進(jìn)行劃分,這個(gè)流程是由編譯器決定的
- 段長(zhǎng):每段段長(zhǎng)都可能不一樣,和程序本身的結(jié)構(gòu)相關(guān)
- 分頁(yè)有頁(yè)表,記錄程序轉(zhuǎn)入到內(nèi)存的位置,那么分段也應(yīng)該有段表,功能一致,記錄
- 頁(yè)表:記錄程序的哪一頁(yè)被記錄到內(nèi)存中的哪一塊
- 段表:記錄程序的哪一段被記錄到內(nèi)存中的哪一塊
段表
- 基本分段的段表,每個(gè)進(jìn)程都有自己的段表
- 段號(hào)、段長(zhǎng)、內(nèi)存起始地址(因?yàn)槎伍L(zhǎng)不一樣,不可以向頁(yè)表一樣,使用物理塊號(hào)(等分),因?yàn)槊恳粔K大小都是4kb,因此可以通過(guò) 物理塊號(hào) * 4kb 計(jì)算得到物理地址)
- 通過(guò)段表 共享數(shù)據(jù)
- 分頁(yè)存儲(chǔ)管理通過(guò)查詢(xún)快表和頁(yè)表,將邏輯地址翻譯為物理地址,從而cpu可以到具體的位置執(zhí)行指令
物理地址、邏輯地址和段表之間的關(guān)系
- 段號(hào)、段內(nèi)偏移
- 段內(nèi)偏移w:由于每一個(gè)程序段的大小不一樣,以最大的作為段內(nèi)偏移
- 到段表查詢(xún),得到物理的起始地址b,則物理地址等于b + w
- 低16位表示段內(nèi)偏移 請(qǐng)翻譯邏輯地址 0x000301F4
分段地址變換機(jī)構(gòu)
- 計(jì)算機(jī)步驟
- 1,根據(jù)邏輯地址的前幾位得到段號(hào),如果段號(hào)大于段表存儲(chǔ)的最大長(zhǎng)度(段表長(zhǎng)度),則產(chǎn)生越界中斷,否則合法
- 2,如果合法 通過(guò)起始位置 + 段號(hào) * 段表項(xiàng)長(zhǎng)度 =? 段表項(xiàng)地址? ?得到段表項(xiàng)地址b
- 3,通過(guò) E=b+w? 段表項(xiàng)地址 + 段內(nèi)偏移 = 物理地址
- cpu執(zhí)行一條指令 需要訪問(wèn)幾次內(nèi)存?兩次? 1,地址翻譯,需要查詢(xún)段表,得到物理地址;2,通過(guò)物理地址到內(nèi)存讀取cpu指令到cpu內(nèi)部執(zhí)行
分頁(yè)和分段的地址空間維度
- 分頁(yè)的地址空間是一維的,因?yàn)橹灰o定頁(yè)面大小這一個(gè)參數(shù)就可以劃分邏輯地址的結(jié)構(gòu),比如每個(gè)大小都是4kb,(4kb = 2^12B)因此業(yè)內(nèi)偏移是12位,頁(yè)號(hào)占了20位
- 分段的地址空間是二維的,不可以通過(guò)段長(zhǎng)計(jì)算段號(hào)和段內(nèi)偏移的位數(shù),因?yàn)槊慷蔚拈L(zhǎng)度都不一樣,因此需要給出這兩個(gè)參數(shù)
基本段頁(yè)式管理(綜合段式 和 頁(yè)式)
引入段頁(yè)式原因
- 頁(yè)式存儲(chǔ)管理:通過(guò)程序與內(nèi)存的切成小塊,分散和分配內(nèi)存,減少內(nèi)存碎片,提高內(nèi)存利用率。機(jī)器的角度
- 段式存儲(chǔ)管理:通過(guò)將程序先按照自然段(模塊)進(jìn)行分段,達(dá)到通用段可以共享的目的。從人類(lèi)的角度出發(fā)
- 段頁(yè)式存儲(chǔ)管理:先將程序按照自然段進(jìn)行分段,再將每個(gè)自然段切成等大的頁(yè)。從而匯聚兩者的優(yōu)勢(shì)
如何分段和如何分頁(yè)
- 先分段 再分頁(yè)
- 分段,由編譯器完成,將自然段進(jìn)行分段
- 分頁(yè),將分號(hào)的段按照4kb進(jìn)行切分,每4kb作為一個(gè)頁(yè),不足4kb的碎片,會(huì)出現(xiàn)不足一頁(yè)的情況 ,這樣的內(nèi)部碎片很小且很少
- 因?yàn)榉殖啥蔚臄?shù)量就很少,而且僅僅在最后的時(shí)候會(huì)產(chǎn)生碎片,因此碎片很小且很少
段表和頁(yè)表
- 段表和頁(yè)表配合使用之后,先前的段表記錄段號(hào)、段長(zhǎng)和段起始地址變成了,段號(hào)、段長(zhǎng)(頁(yè)表長(zhǎng)度)和頁(yè)表起始地址
- 因?yàn)閷?duì)每個(gè)段進(jìn)行分頁(yè),因此每個(gè)段都有自己的頁(yè)表起始地址
- 只有一個(gè)段表,段表中的每個(gè)段表項(xiàng)都有自己對(duì)應(yīng)的頁(yè)表
- 還實(shí)現(xiàn)不了邏輯地址和物理地址的轉(zhuǎn)換,需要更進(jìn)一步操作
物理地址、邏輯地址、段表、頁(yè)表之間的關(guān)系
- 頁(yè)號(hào)p 業(yè)內(nèi)偏移w : 分頁(yè)的邏輯結(jié)構(gòu)? -> 查詢(xún)頁(yè)表? 得到物理地址?物理塊號(hào)b b|w
- 段號(hào)s 段內(nèi)偏移w :?分段的邏輯結(jié)構(gòu)? -> 查詢(xún)段表??得到物理地址?物理塊號(hào)b b+w
- 段號(hào)s 頁(yè)號(hào)p 業(yè)內(nèi)偏移w : 段頁(yè)式邏輯結(jié)構(gòu) ->? 先查段表再查頁(yè)表(因?yàn)橄确侄卧俜猪?yè))
段頁(yè)式地址變換機(jī)構(gòu)
- 將邏輯地址變換成物理地址
- 1,取出段號(hào)S和段號(hào)表存儲(chǔ)的段號(hào)比較,如果大于等于最大段表長(zhǎng)度,則報(bào)越界中斷錯(cuò)誤;如果小于等于段表長(zhǎng)度,查詢(xún)頁(yè)表;通過(guò)起始地址 + 段號(hào) *? 段表項(xiàng)長(zhǎng)度 計(jì)算得到頁(yè)表
- 頁(yè)表的計(jì)算方式一樣,得到物理塊號(hào)
- 物理塊號(hào)b 和 段內(nèi)偏移w 得到物理地址 b|w
- cpu執(zhí)行一條指令需要執(zhí)行幾次內(nèi)存?一共需要三次
- 1,地址翻譯,需要查詢(xún)段表,查詢(xún)頁(yè)表,得到物理地址;兩次
- 2,通過(guò)物理地址到內(nèi)存讀取cpu指令到cpu內(nèi)部執(zhí)行? ?一次
?
總結(jié)
以上是生活随笔為你收集整理的操作系统 内存管理相关知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring 完成自动注入(autowi
- 下一篇: 运维的目标价值体系