C語言中文網
首頁 > 編程筆記 > 操作系統筆記 閱讀:230

什么是內存交換

進程必須在內存中以便執行。不過,進程可以暫時從內存交換到備份存儲,當再次執行時再調回到內存中(圖 1)。交換有可能讓所有進程的總的物理地址空間超過真實系統的物理地址空間,從而增加了系統的多道程序程度。

使用磁盤作為存儲倉庫的兩個進程的交換
圖 1 使用磁盤作為存儲倉庫的兩個進程的交換

標準交換

標準交換在內存與備份存儲之間移動進程,備份存儲通常是快速磁盤,它應足夠大,以容納所有用戶的所有內存映像的副本,并且它應提供對這些存儲器映像的直接訪問。

系統維護一個可運行的所有進程的就緒隊列,它們的映像在備份存儲或內存中。當 CPU 調度器決定執行一個進程時,它調用分派器。分派器檢查隊列中的下一個進程是否在內存中。如果不在,并且沒有空閑內存區域,那么分派器會換出當前位于內存中的一個進程,并換入所需進程,然后重新加載寄存器,并且將控制權轉移到所選進程。

這種交換系統的上下文切換時間相當高。為了理解上下文切換時間的概念,我們舉個例子,假設用戶進程的大小為 100MB,并且備份存儲是傳輸速度為 50MB/S 的標準硬盤。 100MB 進程傳入或傳出內存的時間為:

100MB/50MBps = 2s

交換時間為 2000ms。由于我們應換出和換入,總的交換時間約為 4000ms。(這里,我們忽略其他的磁盤性能問題)

請注意,交換時間的主要部分是傳輸時間??偟膫鬏敃r間與交換的內存大小成正比。如果我們有這樣一個計算機系統,它的內存空間為 4GB,駐留的操作系統為 1GB,那么用戶進程的最大大小為 3GB。然而,許多用戶進程可能比這小得多,比方說,100MB。相比之下,100MB 的進程可以在 2s 內換出,而換出 3GB 需要 60s。顯然,知道一個用戶進程真正需要的內存空間而不是可能需要的內存空間,是非常有用的。

因此,只需要交換真正使用的內存,就可以減少交換時間。為有效使用這種方法,用戶需要告訴系統它的內存需求情況。因此,具有動態內存需求的進程需要通過系統調用(request_memory() 和 release_memory())來通知操作系統它的內存需求變化情況。

交換也受到其他因素的約束。如果我們想要換出一個進程,那么應確保該進程是完全處于空閑的。特別關注的是任何等待 I/O。當需要換出一個進程以釋放內存時,該進程可能正在等待 I/O 操作。然而,如果 I/O 異步訪問用戶內存的 I/O 緩沖區,那么該進程就不能換出。假定由于設備忙,I/O 操作在排隊等待。如果我們需要換出進程 P1 而換入進程 P2,那么 I/O 操作可能試圖使用現在已屬于進程 P2 的內存。解決這個問題有兩種主要方法:
  1. 不換出等待處理 I/O 的進程;
  2. I/O 操作的執行只能使用操作系統的緩沖。只有在進程換入時,操作系統緩沖與進程內存之間才能進行數據轉移。注意,這種雙緩沖本身增加了開銷。我們現在需要再次復制數據,從內核內存到用戶內存,然后用戶進程可以訪問它。

現代操作系統現在并不使用標準交換。它的交換時間太多,提供的執行時間太少,不是合理的內存管理的解決方案。

然而,一些交換的變種卻在許多系統中得以應用,包括 UNIX、Linux 和 Windows。一個常用的變種是:正常情況下,禁止交換;當空閑內存(未被操作系統或進程使用的內存)低于某個閾值時,啟用交換。當空閑內存的數量增加了,就停止交換。

另一變種是交換部分進程(而不是整個進程),以降低交換時間。通常,這些交換的變種通常與虛擬內存一起工作。

移動系統的交換

雖然用于 PC 和服務器的大多數操作系統支持一些交換的變形,移動系統通常不支持任何形式的交換。

移動設備通常采用閃存,而不是空間更大的硬盤作為它的永久存儲。導致的空間約束是移動操作系統設計者避免交換的原因之一。其他原因包括:閃存寫入次數的限制以及內存與閃存之間的吞吐量差。

當空閑內存降低到一定閾值以下時,蘋果的 iOS,不是釆用交換,而是要求應用程序自愿放棄分配的內存。只讀數據(如代碼)可從系統中刪除,以后如有必要再從閃存重新加載。已修改的數據(如堆棧)不會被刪除。然而,操作系統可以終止任何未能釋放足夠內存的應用程序。

Android 不支持交換,而釆用類似 iOS 使用的策略。如果沒有足夠可用的空閑內存,則它可以終止進程。然而,在終止進程之前,Android 將其應用程序狀態寫到閃存,以便它能快速重新啟動。

由于這些限制,移動系統的開發人員應小心分配和釋放內存,以確保他們的應用程序不會使用太多內存或遭受內存泄漏。注意,iOS 和 Android 支持分頁,所以他們確實有內存管理能力。

所有教程

優秀文章

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo