<bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>

    操作系統中的重要角色--內存管理

    在開發工作中,雖然CPU,內存和硬盤都是必不可少的硬件,不過,編程中,我們常常受到困擾的往往是內存相關的bug(編程中遇到CPU和硬盤相關的bug極少)。

    這是因為我們的程序和數據雖然是存放在硬盤上的,但是運行時,CPU并不是直接從硬盤加載程序和數據的。
    直接從硬盤讀取指令非常慢,會成為整個系統的嚴重瓶頸,因此,程序及其數據首先被復制到內存(比硬盤驅動器小,但速度快得多)中,CPU從內存讀取指令速度會快很多。

    內存可以看作是一長串單元,每個單元都包含一些二進制數據,并標有一個稱為存儲器地址的數字。
    內存地址的范圍從0到N,取決于系統中可用的主內存量。
    程序使用的地址范圍稱為地址空間。

    如下圖,兩個加載到內存空間中的程序Program-1Program-2,
    它們分別占用了內存地址0~25~8的位置。
    image.png

    1. 早期的內存管理

    在操作系統的早期,程序可以直接訪問整個主存儲器,如何管理內存是程序員的工作之一。
    當時編寫軟件的一大挑戰性就在于開發人員需要設計一種管理RAM訪問的好方法,并確保整個程序不會溢出可用內存。

    后來,隨著多任務處理的出現,當多個程序可以在同一臺計算機上運行時,內存管理變得越來越棘手。
    程序員不得不面對自己管理內存帶來的主要問題:

    1. 內存布局問題:位于RAM中的第一個程序之后的程序將有一定量的地址空間偏移,不再是初始范圍0到N(比如上面圖片中的Program-2)。多個程序加載內存時,極大增加管理難度。
    2. 內存碎片問題:當程序或數據在內存中來回移動時,可用空間會被碎片化為越來越小的塊。這將使它更難找到可用的空間來加載新的程序和內存中的數據
    3. 安全性問題:如果程序A不小心覆蓋了程序B的內存怎么辦?或者,更糟糕的是:如果它故意從另一個程序中讀取敏感數據,如密碼或信用卡信息,該怎么辦?

    因此,對于20世紀60年代早期的硬件架構師來說,急需一種自動化的內存管理形式,這樣可以顯著簡化編程并解決更關鍵的內存保護問題。
    最后,他們想出了今天被稱為虛擬內存的東西。

    2. 虛擬內存管理

    虛擬內存中,程序不能直接訪問物理RAM。相反,它與一個名為虛擬內存的空間交互。
    操作系統與CPU一起提供這樣的虛擬地址空間,并遲早將其轉換為物理地址空間。

    每個內存訪問都是通過一個虛擬地址來執行的,該地址并不指向內存中的實際物理位置。
    程序總是讀取或寫入虛擬地址,它完全不知道底層硬件中發生了什么。

    比如,仍然是上面的Program-1Program-2,對于這兩個程序來說,開發人員可以假定它們的地址都是從0開始。
    而它們實際在物理內存中的位置開發人員不用關心,交給操作系統來負責就可以了。
    image.png

    2.1. 虛擬內存的優勢

    從上面的圖中,我們可以看出虛擬內存的明顯好處:

    1. 每個程序都有一個從0開始的虛擬地址空間,大大簡化了程序員的負擔,不再需要手動跟蹤內存偏移
    2. 虛擬內存總是連續的,即使底層的物理內存不是連續的。操作系統完成了將可用內存塊聚集到一個單一的、統一的虛擬內存塊中的艱巨任務
    3. 虛擬內存機制還解決了內存有限的問題,開發時給人一種印象,不用擔心物理內存還有多少(當然實際運行時,如果內存不足,操作系統會提示錯誤)
    4. 虛擬內存保證了安全性:操作系統會保證程序A不能讀取或寫入分配給程序B的虛擬內存

    2.2. 虛擬內存管理的核心結構

    虛擬內存機制需要一個位置來存儲虛擬地址和物理地址之間的映射。
    也就是說,給定虛擬地址X,系統必須能夠找到對應的物理地址Y。
    但是,不能將這樣的信息保存為1:1關系,否則就需要一個與整個物理內存一樣大的虛擬地址庫。

    現代虛擬內存實現通過將虛擬內存物理內存解釋為一長串固定大小的小塊來克服這個問題(以及許多其他問題)。
    虛擬內存中將這個塊稱為,物理內存中將這個塊稱為。

    在CPU中有一個硬件組件叫做內存管理單元(MMU),它將之間的映射信息存儲在一個稱為頁表的特殊數據結構中。
    頁表中每一行都包含一個索引及其對應的索引,每個正在運行的程序在MMU中都有一個自己的頁表,
    如下圖所示:

    image.png
    程序Program-1占用3個內存頁,編號為0~2,通過MMU頁表映射到物理內存中幀3,4,8。

    虛擬內存的虛擬地址由兩部分組成:

    1. 一個頁面索引,告訴虛擬地址所屬的頁面
    2. 幀偏移量,表示幀內物理地址的位置

    2.3. page faults是什么

    當程序訪問當前未映射到物理幀的虛擬地址時,會發生頁面錯誤page faults)。
    更具體地說,當頁面存在于程序的頁面表中,但指向物理內存中不存在或尚未可用的幀時,就會發生頁面錯誤。
    比如:
    image.png
    MMU檢測到頁面錯誤會將消息反饋到操作系統,操作系統將盡最大努力在物理內存中找到用于映射的幀。
    大多數情況下,這是一個簡單的操作,除非系統內存不足。

    2.4. 內存分頁(paging)是什么

    分頁paging)是另一個內存管理技巧:操作系統將一些頁面移動到硬盤驅動器,以便在沒有更多物理內存可用時為其他程序或數據騰出空間。
    分頁有時也被稱為交換swapping),交換是將整個進程移動到磁盤上。

    分頁給程序一種無限可用內存的錯覺,操作系統樂觀地允許虛擬內存地址空間大于物理內存地址空間,知道數據可以在需要時移入和移出硬盤驅動器。
    有些系統(如Windows)使用一個特殊的文件,稱為分頁文件。其他操作系統(例如Linux)有一個稱為交換區域的專用硬盤分區。

    不過,需要注意的是,硬盤驅動器比主內存慢得多。
    因此,當發生頁面錯誤并且頁面臨時移動到硬盤驅動器時,操作系統必須從緩慢的介質中讀取數據并將其移回內存,從而導致延遲。
    總而言之,更少的分頁意味著系統可以更有效地運行。

    2.5. 內存顛簸(Thrashing)是什么

    當系統在分頁上花費的時間多于運行應用程序的時間時,就會發生抖動,這是由不斷的頁面錯誤流觸發的。
    這是一種極端的情況,比如你運行了太多的程序,占用了整個內存以及在硬盤上的分頁區域,
    這時就容易發生頁面錯誤,操作系統為了跟上大量的頁面錯誤請求,不斷地在硬盤驅動器和物理內存之間移動數據,使系統陷入停頓。

    解決這個問題可以通過增加內存的容量,或者減少正在運行的程序的數量,或再次通過調整交換文件的大小來避免抖動。

    2.6. 存儲保護

    虛擬內存還提供了跨運行應用程序的安全性,比如你的瀏覽器無法窺視你的文本編輯器的虛擬內存,反之亦然。
    內存保護的主要目的是防止進程訪問不屬于它的內存。

    內存保護機制通常由MMU及其管理的頁表提供。當一個程序試圖訪問一部分它不擁有的虛擬內存時,就會觸發一個無效的頁面錯誤。
    MMU和操作系統捕獲信號并引發故障條件,稱為分段錯誤(就是耳熟能詳的segmentation fault),操作系統通常會終止程序作為響應。

    3. 總結

    總之,虛擬內存為我們解決了很多問題,也簡化了簡化了程序員的工作,是目前主流的內存管理方式。

    posted @ 2024-06-07 13:51  wang_yb  閱讀(324)  評論(2編輯  收藏  舉報
    免费视频精品一区二区_日韩一区二区三区精品_aaa在线观看免费完整版_世界一级真人片
    <bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>