2009-02-04 106 views
5

大多數有關虛擬內存的文獻指出,作爲應用程序開發人員,理解虛擬內存可以幫助我利用其強大的功能。我一直參與在Linux上開發應用程序一段時間,但在編碼時並不在乎虛擬內存的複雜性。我錯過了什麼嗎?如果是這樣,請闡明我如何利用虛擬內存的運作。否則讓我知道如果我對這個問題沒有意義!虛擬內存

回答

4

那麼,這個概念其實很簡單。我不會在這裏重複,但你應該拿起任何有關操作系統設計的書,它會在那裏解釋。我推薦Silberscahtz和Galvin的「操作系統概念」 - 這是我在大學裏使用的,它很好。

一對夫婦的事情,我能想到的是什麼虛擬內存知識,可能會給你的是:

  • 學習到頁面邊界上分配內存以避免浪費(僅適用於虛擬內存,而不是通常的堆/堆棧內存);
  • 鎖定RAM中的一些頁面,使它們不會被交換到HDD;
  • 監護人頁面;
  • 稍後保留一些地址範圍並提交實際內存;
  • 也許使用NX(非可執行)位來提高安全性,但我不確定這一點。
  • 在32位系統上訪問> 4GB的PAE。

儘管如此,所有這些東西只能用於相當具體的場景。事實上,99%的應用程序無需關心這一點。

加入:也就是說,知道所有這些事情是非常好的,以便您可以在出現這些情況時識別出這些情況。只要小心 - 權力來自責任。

+0

另外;虛擬內存爲您提供了屏蔽物理內存碎片的功能。 – RandomNickName42 2011-03-18 22:02:50

1

對於今天的大多數應用程序,程序員可以保持不知道計算機內存的工作情況,而不會造成任何傷害。但有時 - 例如,當您想要改善程序的佔用空間時 - 您最終不得不自己操作內存。在這種情況下,知道內存如何設計工作是至關重要的。換句話說,雖然你確實可以在沒有它的情況下生存下來,但關於虛擬內存的學習只會讓你成爲一個更好的程序員。

而且我認爲Wikipedia article可以是一個好的開始。

1

可能有10個案例中有9個案例不需要擔心虛擬內存管理。這是內核的工作。可能在一些高度專業化的應用程序中,你需要對它們進行調整。

我知道一篇文章談論計算機內存管理,重點是Linux [http://lwn.net/Articles/250967]。希望這可以幫助。

2

這是一個模糊的問題。

您可以使用虛擬內存的方式主要是通過使用內存映射文件。有關更多詳細信息,請參見mmap()手冊頁。

儘管無論如何你可能會隱式地使用它,因爲任何動態庫都是作爲映射文件實現的,許多數據庫庫也都使用它們。

使用來自高級語言的映射文件的接口通常很不方便,這使得它們的用處不大。

使用映射文件的主要好處是:

  • 沒有一個系統調用開銷訪問文件的部分時(這實際上可能是一個缺點,因爲頁面錯誤可能有儘可能多的開銷,無論如何,如果它發生)
  • 無需將數據從OS緩衝區複製到應用程序緩衝區 - 這可以提高性能
  • 能夠在進程之間共享內存。

有些缺點是:

  • 32位機器可以運行出的地址空間輕鬆
  • 棘手的處理文件正確
  • 延長沒有簡單的方法,看看有多少/哪些網頁目前常駐(但可能有一些方法)
  • 對實時應用程序不利,因爲頁面錯誤可能會導致IO請求阻塞線程(但文件可以鎖定在內存中,但是隻有當足夠)。
1

如果您關心的是性能 - 理解內存層次結構非常重要。

對於完全包含在物理內存中的小數據集,您需要關注緩存(從緩存訪問內存要快得多)。

當處理大型數據集時 - 由於缺少物理內存可能會導出頁面,因此您需要小心保持訪問模式的本地化。

例如,如果您在C中聲明矩陣(int a[rows][cols]),它將按行分配。因此,在掃描矩陣時,您需要按行而不是按列掃描。否則,您將多次分頁輸入和輸出相同的數據。

另一個問題是乾淨數據保存在內存之間的差異。清潔數據是從未被程序修改的文件加載的信息。操作系統可能會寫出乾淨的數據(可能取決於它如何加載)而不寫入磁盤。首先必須將髒頁寫入交換文件。