《操作系統》OS學習(四):計算機體系結構、內存層次和地址生成

計算機除了計算能力之外還有存儲能力,存儲能力即計算機擁有一系列的存儲介質,我們可以在存儲介質上存儲我們的代碼和數據。計算機體系結構中約定了哪些地方可以用來存儲數據:CPU內的寄存器、內存和外存。不同的存儲介質,容量、速度和價格都是不同的。為了建立一個合理的系統,我們將計算機系統中的存儲介質組織成一個層次結構。操作系統針對層次結構下的存儲單元進行管理。操作系統的存儲管理就是用來管理這些存儲介質的。最基本的管理要求就是當一個進程需要使用存儲單元的時候,操作系統能夠分一塊存儲介質給它使用,等它不用的時候還回給操作系統。

計算機體系結構:包括CPU、內存和I/O設備。

CPU中有寄存器和高速緩存。寄存器的空間是非常小的,可能是32位或64位,能存的詩句也就幾十字節或幾百字節。CPU中還有高速緩存,高速緩存僅次于CPU寄存器,處理速度接近CPU頻率,容量遠小于內存,速度遠快于內存,當CPU要讀取的數據存在于高速緩存時(命中),可以直接返回數據而不需要訪問內存,合理利用內存訪問的局部性特點,可以達到極高的命中率。內存也是比較大的能存儲數據的介質,他的最小訪問單位是字節,也就是8bit,通常我們的計算機系統是32位的總線,也就是說可以同時從內存中讀寫32位也就是4字節。一次讀寫32位時牽扯到地址對齊,因此讀寫時不能從任意地方開始讀一個4字節。

內存層次:

了解了上面這些,我們可以看下計算機中內存的層次關系:首先是處理器中有兩級緩存,這一部分內存管理是由硬件實現的,因此用戶或操作系統是無法顯示地進行控制的。再下面一層則是內存,內存再下面一層可以是外存中的虛擬內存,這兩個層次是由操作系統機型管理的。當CPU能層高速緩存中獲取所需讀取的內容無需訪問內存,能夠在內存中獲取的內容無需訪問虛擬內存,內存缺頁時才會從虛擬內存中讀取需要的內容。而這幾個層次上的內存的訪問速度是有這巨大差別的。最快的L1緩存可以達到接近CPU頻率的速度,內存可以達到1.3GHz,外存較慢需要5ms,可以看到最快和最慢能差到百萬數量級,如何將這幾個層次有機地結合到一起,挑戰性還是很大的。

內存管理:

我們希望將內存管理做到什么程度呢?如下圖,系統中有不同的進程,進程通過操作系統內核訪問物理內存,訪問受內存管理單元(MMU)的控制。我們希望每個進程認為它自己獨占內存,因此進程能看到的是邏輯地址空間。MMU負責將邏輯地址空間映射到真實的物理地址空間。而這些都對內存管理提出了很高的要求,主要需要滿足如下幾條:

  1. 抽象,進程使用邏輯地址空間;
  2. 保護,由邏輯地址空間映射到物理地址空間時不同進程之間不能訪問到其他進程的內存;
  3. 共享,所用進程共用操作系統內核;
  4. 虛擬化,進程可以使用比實際內存空間更大的地址空間。

其中的保護性和共享性是相對矛盾的兩個要求,既要保護好各自的空間,又要訪問相同內存。甚至邏輯地址空間中看到的可以存儲數據的空間是大于實際物理內存的。

操作系統為了達到上述效果,具體采用的內存管理方式有以下幾條:

  1. 重定位。在最初的計算機中,是直接使用總線上的物理地址來編寫程序的,程序要讀寫某個內存單元,直接訪問它所在的物理地址。這有很大缺陷,你的程序只能在指定類型的機器上運行。重定位通過將進程中的邏輯地址加上重定位寄存器的值獲得物理地址。這樣通過修改重定位寄存器的值就可以將程序運行下去。為了實現,程序和操作系統里面都需要有相應的支持。
  2. 分段。實際我們在寫程序的時候,邏輯結構并不是必須連成一片的區域,而是把程序分為數據、代碼、堆棧。這三個部分是相對獨立的。這樣每一塊需要的空間就變少了。分段依然需要每一段內的內容是連續的,這個要求依然很高。
  3. 分頁。分頁就是把內存分成最基本的單位,選取合適的大小的連續區域作為一頁,一頁作為內存管理的基本單位。
  4. 虛擬存儲。目前多數系統(如Linux)采用按需頁式虛擬存儲。將不常用內容轉移到外存上存儲,這也使得邏輯地址空間可以大于實際物理內存空間。

上述4條內存管理方式的實現高度依賴硬件。比如與計算機存儲架構緊耦合;MMU的結構是什么樣的,CPU能夠識別的頁表是什么樣的,也就是MMU如何處理CPU存儲訪問請求的硬件。

地址空間

從邏輯地址到最后在總線上出現的物理地址,有一個轉換的過程,在學習具體的轉換算法之前,我們需要學習地址生成的過程。生成過程中并不是所有地址都允許訪問的,因此還需要對地址的合法性進行檢查。

地址空間定義:計算機地址空間有兩種,物理地址空間和邏輯地址空間。

  • 物理地址空間就是硬件支持的真實地址空間,這是受硬件支持的,比如32位的系統,就是從0到4G-1的位置。
  • 邏輯地址空間就是在CPU中運行的進程看到的地址,這個地址是從物理地址空間中分配的一段或幾段子空間。

地址生成及處理過程:

整體可以分為如下幾個步驟,ALU需要邏輯地址中的內容(讀或寫),MMU對邏輯地址進行轉換,轉換為物理地址,CPU控制邏輯給總線發送物理地址請求。內存發送物理地址的內容給CPU或者將CPU給的數據存儲到物理地址。操作系統做的是建立邏輯地址LA和物理地址PA之間的映射。

邏輯地址生成:

生成過程如下圖。比如最開始是高級語言寫了一段代碼,其中有一個函數foo();首先要進行編譯,編譯為機器能夠識別的匯編語言;之后進行匯編,將函數名從字符串變為地址75;而這個函數可能是某個函數庫中的成員,而函數庫的位置程序是不知道的,這就需要鏈接,將需要的文件拼接起來,此時可能在原先的代碼前面插入了一段代碼,比如地址偏移了100,此時函數地址變為了175;最后需要進行程序加載即重定位,因為這段程序不一定是從邏輯地址的0位開始的,比如是從1000開始的,那么函數地址成為1175。經歷了這么多步驟之后,生成的1175才是我們需要的邏輯地址。

那么邏輯地址是在什么時間生成的呢:

  1. 編譯時。假定起始地址已知,也就是我知道我的程序要放在哪,那么編譯時就可以生成邏輯地址。但是當起始地址改變時,比如修改了代碼,必須重新編譯。老舊的功能機買來之后不允許下載軟件,這種情況下地址通常就是寫死的。
  2. 加載時。當你修改了代碼或者安裝了各種新的軟件,寫程序時是無法知道新的代碼存儲在什么地址的。也就是編譯時起始位置未知時,編譯器需生成可重定位的代碼,等到加載時重定位,生成絕對地址。通常在可執行文件的前面有一個重定位表,加載的時候改成絕對地址,程序就可以跑了。
  3. 執行時。執行到這條指令之前一直使用相對地址,當執行到這一條指令的時候,才可以去知道它確切訪問的地址。這種情況出現在使用虛擬存儲的系統里。優點就是在程序執行過程中就可以將代碼移動,而前面兩種生成時機都不可以。但是需要地址轉化硬件支持,相對較麻煩。

地址檢查

CPU執行到某條指令,得到它的邏輯地址,首先根據邏輯地址判斷所在它的偏移量是否在所在段(比如數據段)的長度之內,如果超出了段長度,認為是非法請求,否則認為是合法的。此時加上段基址得到物理地址,進行訪問。在這個過程中操作系統要做的就是設置段起始地址和最大邏輯地址空間(段長度)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GCC中SIMD指令的應用方法

X86架構上的多媒體應用開發,如果能夠使用SIMD指令進行優化, 性能將大大提高。目前,IA-32的SIMD指令包括MMX,SSE,SSE2等幾級。 在GCC的開發環境中,有幾種使用SIMD指令的方式,本文逐一介紹。X86的…

使用angular4和asp.net core 2 web api做個練習項目(二), 這部分都是angular

上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from angular/core; import { Http, Headers } from angular/http; import { Observable } from rxjs/Observable; import { ErrorHandler } from angular/core; import rxj…

leelen可視對講怎么接線_樓宇對講系統怎么布線 樓宇對講系統布線方式【介紹】...

隨著智能小區規模不斷增加,樓宇可視對講系統應用越來越廣泛,因而視頻信號的傳輸方式與布線設計顯得越來越重要。視頻信號與數據和音頻信號不同,可行的一種傳輸方式為視頻信號基帶傳輸,下面小編就簡要介紹一下這種傳輸方式和布線方…

路由匯總實例

5.2.2.2 路由匯總策略 之前提到過,在網絡管理員計劃好子網選擇并進行預期地路由匯總時,手動路由匯總工作能取得最佳效果。例如,之前的例子設定好了一個考慮周全的計劃,管理員只使用遠離Yosemite路由器并以10.2開頭的子網。這個規定…

《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片 在沒有其他方式輔助的情況下,我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢?就是每個進程需要一塊內存,我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統&#…

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下,python是不支持中文的。 如果要實現python支持中文(我是從python3.6開始學習的),只要在python文檔的開頭加入:“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在,可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面,有兩種可供選擇:橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中,大家已經學習了Linux系統的基本管理命令和技巧,為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便,可能所有空閑片區大小都無法滿足需求大小,這個分配就會失敗。基于這種現狀,就有了非連續內存分配的需求。非連續分配成功的幾率更高,但也面對更多的問題,比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

C語言第三次博客作業---單層循環結構

一、PTA實驗作業。 題目1 1.實驗代碼 int n,i; double height1,height2;//1為輸入身高&#xff0c;2為輸出身高。 char sex; //1<height1<3; //N<1; scanf("%d",&n); while(n--){getchar();scanf("%c%lf",&sex,&height1);switch(sex)…

函數和函數式編程

python的過程就是函數&#xff0c;因為解釋器會隱式地返回默認值None。 實際編程中大部分偏函數更接近過程&#xff0c;不顯示地返回任何東西。 當沒有顯示地返回元素或者如果返回None時&#xff0c;python會返回一個None。 * 元組 ** 字典 def子句的剩余部分包括了一個雖…

清華大學《操作系統》(七):虛擬存儲、覆蓋、交換

接下來幾節都是對虛擬存儲的講解。虛擬存儲是非連續存儲管理的擴展。通過將內存中的數據暫存到外存的方式&#xff0c;為進程提供更大的內存空間。虛擬存儲出現的主要原因是因為程序規模的增長速度遠遠大于存儲器容量的增長速度&#xff0c;導致內存空間不夠用。其實針對內存空…

遵義大數據中心項目工程概況_市委書記張新文到曹州云都大數據中心等項目現場調研建設情況...

4月25日&#xff0c;市委書記張新文到曹縣調研重點項目建設情況&#xff0c;研究推進措施。市委常委、秘書長任仲義參加活動。張新文首先來到曹州云都大數據中心項目建設現場&#xff0c;查看項目推進情況。曹州云都大數據中心&#xff0c;是涵蓋云計算區、研發辦公區、公寓生活…

linux 可執行文件的分析(gcc GUN BUILEIN)

1、GCC The History of GCC 1984年&#xff0c;Richard Stallman發起了自由軟件運動&#xff0c;GNU (Gnus Not Unix)項目應運而生&#xff0c;3年后&#xff0c;最初版的GCC橫空出世&#xff0c;成為第一款可移植、可優化、支持ANSI C的開源C編譯器。GCC最初的全名是GNU C Com…

Cassandra 的數據存儲結構——本質是SortedMapRowKey, SortedMapColumnKey, ColumnValue

Cassandra 的數據存儲結構 Cassandra 的數據模型是基于列族&#xff08;Column Family&#xff09;的四維或五維模型。它借鑒了 Amazon 的 Dynamo 和 Googles BigTable 的數據結構和功能特點&#xff0c;采用 Memtable 和 SSTable 的方式進行存儲。在 Cassandra 寫入數據之前&a…

清華大學《操作系統》(八):置換算法

功能&#xff1a;置換算法是指當出現缺頁異常時&#xff0c;需要調入新頁面而內存已滿時&#xff0c;置換算法選擇被置換的物理頁面。 設計目標&#xff1a; 盡可能減少頁面的調入調出次數&#xff1b;把未來不再訪問或短期內不訪問的頁面調出。 頁面鎖定&#xff1a; 了解具…

python email模塊詳解_python模塊之email: 電子郵件編碼解碼 (一、解碼郵件)

python自帶的email模塊是個很有意思的東西&#xff0c;它可以對郵件編碼解碼&#xff0c;用來處理郵件非常好用。處理郵件是一個很細致的工作&#xff0c;尤其是解碼郵件&#xff0c;因為它的格式變化太多了&#xff0c;下面先看看一個郵件的源文件&#xff1a;Received: from …

爛泥:通過vsphere給esxi添加本地硬盤

公司ESXi服務器的硬盤空間不夠使用&#xff0c;現在新加了一塊硬盤在ESxi服務器上。在服務器上添加完硬盤后&#xff0c;在Vsphere上是看不到新加硬盤的。 下面我們來通過虛擬機模擬該情況&#xff0c;先添加一塊硬盤。如下圖&#xff1a; 在Esxi添加完硬盤后&#xff0c;現在通…