3

Windows如何爲多個進程分配4GB地址空間 當它可以訪問的總內存也受到限制到4GB。當Windows可以訪問的總內存數量限制爲4GB時,Windows如何爲多個進程提供4GB地址空間

i的Windows內存管理 發現上述問題的解決方案(由寫入:的Pankaj加爾格)

解決方案:

爲了達到這個Windows使用(x86處理器的特徵386和 以上)稱爲分頁。尋呼允許軟件使用與物理存儲器 地址不同的 存儲器地址(稱爲邏輯地址)。處理器的分頁單元將這個邏輯地址透明地轉換爲 物理地址。這允許 系統中的每個進程都有自己的4GB邏輯地址空間。

任何人都可以幫助我以更簡單的形式瞭解它嗎?

回答

5

其基本思想是你的物理RAM有限。一旦填滿,你就開始在硬盤上存儲東西。當一個進程請求當前在磁盤上的數據,或者要求新的內存時,通過將內存傳輸到磁盤上,然後頁面輸入實際需要的數據,從RAM中取出一個頁面。

操作系統維護着一個名爲page table的數據結構,以跟蹤哪些邏輯地址對應於當前物理內存中的數據以及磁盤上的東西。

每個進程都有自己的虛擬地址空間,並使用該空間內的邏輯地址進行操作。操作系統負責將給定進程和邏輯地址的請求轉換爲磁盤上的物理地址/位置。它還負責防止進程訪問屬於其他進程的內存。

當一個進程詢問當前不在物理內存中的數據時,觸發一個page fault。發生這種情況時,操作系統選擇要移動到磁盤的頁面(如果物理內存已滿)。有幾個page replacement algorithms選擇頁面踢出。

+0

對不起挖了這個很老的問題,但如果只需要部分數據是在RAM,其餘的可以在程序運行在硬盤上? –

2

Windows使用稱爲虛擬內存的技術。每個進程都有自己的內存。其中一個原因是由於安全原因,禁止訪問其他進程的內存。

正如您已經指出的那樣,分配的虛擬內存可能比實際的物理內存大。這是尋呼過程進入的地方。我對內存管理和微體系結構的知識有點生疏,所以我不想發佈任何錯誤,但我建議閱讀http://en.wikipedia.org/wiki/Virtual_memory

如果您有興趣瞭解更多文獻,我建議您閱讀'結構化計算機組織 - Tannenbaum'

3

錯誤的原始假設是「當它可以訪問的總內存也限制爲4GB」。這是不真實的,內存操作系統可以訪問的總內存不受限制。

對於32位代碼可以訪問的32位地址是有限制的。它是(1 < < 32),它是4 GB。但是,這隻能同時訪問。想象一下,操作系統具有卡A,B,...,F,並且應用程序一次只能訪問四個卡。 App1可能會看到ABCD,App2 - ABEF,App3 - ABCF。應用程序見4,但操作系統管理6.

32位平面內存模型的限制並不意味着整個操作系統受到相同的限制。

0

假設上下文是32位系統:

除了http://en.wikipedia.org/wiki/Virtual_memory,然而由內核給每個進程的內存抽象是4GB的方法,實際上可以使用一個超過4GB遠較小,因爲在每個進程內核也映射到進程的大部分頁面中。一般在4GB的NT系統中,2GB被內核使用,而在* nix系統中1GB被內核使用。

+0

增加:有一個在32位Windows中的3GB選項(虛擬空間爲1GB的內核,3GB用戶)。 –

1

虛擬地址空間不是RAM。這是一個地址空間。每個page(頁面大小取決於系統)都可以被取消映射(頁面不存在且不可訪問,它不存在),映射到文件(頁面不可直接訪問,其內容存儲在磁盤上) ,映射到RAM(這是您實際可以訪問的頁面)。

映射到RAM的頁面可以是可交換或固定的。固定頁面永遠不會換出到磁盤。可交換頁面與光盤上的區域相關聯,並且可以寫入該區域以釋放它們正在使用的RAM。

映射到RAM的頁面也可以只讀,只寫,讀寫。如果它們是可寫的,則它們可以直接寫入或寫入時複製。

多個頁面(均在相同的地址空間和跨越單獨的地址空間)可以被相同地映射。這是我兩個單獨的進程如何訪問內存中的相同數據(這可能發生在每個進程的不同地址)。

在現代操作系統中,每個進程都有自己的地址空間。在32位操作系統上,每個進程都有4GiB的地址空間。在64位操作系統上,32位進程仍然只有4GiB(4千兆字節)的地址空間,但64位進程可能會有更多。通常他們有18個EiB(18個字節,即18,874,368個TiB)。

地址空間的大小完全獨立於RAM內存量和實際分配的空間量。一臺機器上有1個RAM的地址空間可以有100個進程,每個進程有18個EiB的地址空間。事實上,自從典型的機器只有幾兆字節或RAM以來,windows就已經爲每個進程提供了4GiB的地址空間。

0

很久以前,我在Windows操作系統課程期間閱讀了這本書作爲案例研究。我給出的數字可能並不準確,但他們可以給你一個關於幕後發生的事情的體面概念。從我能記得的:

在windows中使用的內存模型是Demand Paging。在英特爾,頁面大小爲4k。最初,當您運行一個程序時,從您的程序只加載4個4K頁面。這意味着共分配了16k的內存。程序可能更大,但不需要一次將整個程序加載到內存中。其中一些頁面是數據頁面,即可讀/寫的變量和數據結構。而另一個是包含可執行代碼的代碼頁,即代碼段。 IP被設置爲代碼段的第一條指令,程序在分配4GB的印象下開始執行。

當需要進一步的頁面就是您請求更多的內存(數據段)或程序進一步執行,並需要其他的可執行的指令(代碼段)的Windows檢查是否有可用的內存足夠量。如果是,則將這些頁面加載並映射到進程的地址空間中。如果沒有太大的內存可用,則Windows將檢查該網頁還沒有被使用了一段時間(這是運行的所有進程不只是調用進程)。當它找到這樣的頁面時,它將它們移動到Paging文件以釋放內存中的空間並加載請求的頁面。

如果有時你的程序已加載Windows中的某些DLL調用代碼簡單地映射這些網頁到進程的地址空間。沒有必要再次加載這些頁面,因爲它們已經在內存中可用。從而避免了重複以及節省空間。

所以理論上的進程正在使用的內存比可用的,它們可以使用的內存4GB但實際上只有該過程的部分在同一時間被加載。

請記住我的答案,如果你覺得它有用

相關問題