1. 程式人生 > >13.5 物理儲存器和頁交換檔案

13.5 物理儲存器和頁交換檔案

13.5  物理儲存器和頁交換檔案

在老式的作業系統中,物理儲存器被認為是機器中記憶體的總量。換句話說,如果一臺機器裝有16 MB記憶體,那麼應用程式最多可以使用16 MB記憶體。當今的作業系統能讓磁碟空間看起來像記憶體一樣。磁碟上的檔案一般被稱為頁交換檔案(paging file),其中包含虛擬記憶體,可供任何程序使用

當然,為了能夠使用虛擬記憶體,作業系統需要CPU的大力協助。當執行緒試圖訪問儲存器中的一個位元組時,CPU必須知道該位元組是在記憶體中還是在磁碟上。

從應用程式的角度來說,頁交換檔案以一種透明的方式增大了應用程式可用記憶體(或儲存器)的總量。如果一臺機器裝備了1 GB的記憶體,硬碟上還有1 GB的頁交換檔案,那麼應用程式會認為可用記憶體的總量為2 GB。

當然,這臺機器實際上並沒有裝備2 GB的記憶體。實際上,是作業系統與CPU分工協作,把記憶體中的一部分儲存到頁交換檔案中,並在應用程式需要的時候再將頁交換檔案中的對應部分載入記憶體。因此,使用頁交換檔案可以增大應用程式可用記憶體的總量。另一方面,頁交換檔案的使用並不是必須的。如果一臺機器沒有頁交換檔案,那麼對系統來說,它只是認為可供應用程式使用的記憶體總量減少了。但是,我們強烈建議使用者使用頁交換檔案,這樣就可以執行更多的應用程式,而應用程式也可以操作更多的資料。最好是把物理儲存器看成是儲存在磁碟(通常是硬碟)上的頁交換檔案中的資料。當應用程式呼叫VirtualAlloc函式來把物理儲存器調撥給地址空間區域時,該空間實際上是從硬碟上的頁交換檔案分配得到的。

系統中頁交換檔案的大小是決定應用程式可用記憶體總量的最重要因素,機器實際裝備的記憶體總量對它的影響相對較小。

當一個執行緒試圖訪問所屬程序的地址空間中的一塊資料(位於第17章介紹的記憶體對映檔案之外)時,有可能會出現兩種情況。圖13-2顯示了經簡化後的流程圖。(更多細節請參閱Mark Russinovich和David Solomon所著的Microsoft Windows Internals,由微軟出版社出版。)

第一種情況是,執行緒要訪問的資料就在記憶體中。在這種情況下,CPU會先把資料的虛擬記憶體地址對映到記憶體的實體地址,接下來就可以訪問記憶體中的資料了。

第二種情況是,執行緒要訪問的資料不在記憶體中,而是位於頁交換檔案中的某處。在這種情況下,這次不成功的訪問被稱為頁面錯誤。發生頁面錯誤時,CPU會通知作業系統。作業系統隨即在記憶體中找到一個閒置的頁面,如果找不到,作業系統必須先釋放一個已分配的頁面。如果待釋放的頁面沒有修改過,那麼作業系統可以直接釋放該頁面。但如果系統需要釋放一個修改過的頁面,那麼它必須先把頁面從記憶體複製到頁交換檔案。接下來,系統會在頁交換檔案中對所需訪問的資料塊進行定位,並把資料載入到記憶體中閒置的頁面。然後,作業系統對它內部的表項進行更新,以反映該塊資料的虛擬記憶體地址現在已經被對映到了記憶體中對應的實體記憶體地址。這時CPU會再次執行那條引發頁面錯誤的指令,但和前一次不同的是,這一次CPU能夠將虛擬記憶體地址對映到實體記憶體地址併成功訪問所需的資料。

 
圖13-2  把虛擬地址轉換為物理儲存器地址

系統需要在記憶體和頁交換檔案之間複製頁面的頻率越高,硬碟顛簸(thrash)得越厲害,系統執行得也越慢。(顛簸是指作業系統把所有的時間都花在在頁面檔案和記憶體之間交換資料上,導致沒有時間執行程式。)通過給計算機新增更多的記憶體,我們可以減少應用程式執行時可能產生顛簸的次數,從而極大地提高應用程式的效能。這裡有一條經驗法則:要讓計算機跑得更快,最好是增加記憶體。實際上,和換個更快的CPU相比,新增記憶體在大多數情況下都會得到更好的效能提升。

不在頁交換檔案中維護的物理儲存器

在讀過上一節之後,讀者可能會想,如果有許多程式同時執行,頁交換檔案可能會變得相當大--尤其是每次執行一個程式時,系統都必須為該程序的程式碼和資料預訂地址空間區域,為這些區域調撥物理儲存器,然後把硬碟上的程式檔案中的程式碼和資料複製到頁交換檔案中已調撥的物理儲存器中去。

事實上,系統並不會執行剛才所說的這些操作。如果系統確實這麼做的話,那麼載入一個程式並讓它執行起來會花費很長的時間。當用戶要求執行一個應用程式時,系統會開啟該應用程式對應的.exe檔案並計算出應用程式的程式碼和資料的大小。然後系統會預訂一塊地址空間,並註明與該區域相關聯的物理儲存器就是.exe檔案本身。是的,系統並沒有從頁交換檔案中分配空間,而是將.exe檔案的實際內容(或檔案映像,即file image)用作程式預訂的地址空間區域。這樣一來,不但載入程式非常快,而且頁交換檔案也可以保持一個合理的大小。

當把一個程式位於硬碟上的檔案映像(即一個.exe或DLL檔案)用作地址空間區域對應的物理儲存器時,我們稱這個檔案映像為記憶體對映檔案(memory mapped file)。當載入一個.exe或DLL時,系統會自動預訂地址空間區域並把檔案映像對映到該區域。但是,系統也提供了一組函式,可以讓開發人員把資料檔案對映到地址空間。我們會在第17章詳細討論記憶體對映檔案。

Windows可以使用多個頁交換檔案。如果多個頁交換檔案位於不同的物理硬碟上,那麼系統就可以執行得更快,這是因為系統能同時寫入多個硬碟。在控制面板裡,我們可以通過以下步驟來新增和刪除頁交換檔案。

(1)選擇Performance Information And Tools(效能資訊和工具)。

(2)單擊Advanced Tools(高階工具)連結。

(3)單擊Adjust The Apperance And Performance Of Windows(調整Windows的外觀和效能)連結。

(4)選擇Advanced(高階)選項卡,並在虛擬記憶體部分單擊Change(更改)按鈕。

下圖顯示了彈出的對話方塊。

 

說明  當Windows從軟盤載入.exe或DLL檔案時,系統會把整個檔案從軟盤複製到記憶體中。此外,系統還會從頁交換檔案中分配足夠的儲存空間來存放檔案映像。只有當系統需要把一個頁面換出記憶體,而頁面又包含該檔案映像的一部分時,系統才會寫入頁交換檔案。如果系統的記憶體負載很輕,那麼檔案總是從記憶體中直接執行。

Microsoft必須讓在軟盤上執行的檔案以這種方式執行,因為只有這樣安裝程式才能正常執行。通常,安裝程式從第一張軟盤開始執行,在安裝過程中使用者會取出該軟盤並插入其他軟盤。如果系統需要再從第一張軟盤去載入.exe或DLL的一部分程式碼,那麼很顯然,第一張軟盤可能已經不在軟碟機內了。但是,由於系統已經把檔案複製到了記憶體中(並以頁交換檔案為後備儲存器),因此係統可以隨時訪問安裝程式而且不會遇到任何問題。

除非映像檔案是用/SWAPRUN:CD或/SWAPRUN:NET開關連結的,否則系統不會把位於其他可移動媒介(比如,光碟或網路驅動器)上的映像檔案複製到記憶體中的。

相關推薦

13.5 物理儲存器交換檔案

13.5  物理儲存器和頁交換檔案 在老式的作業系統中,物理儲存器被認為是機器中記憶體的總量。換句話說,如果一臺機器裝有16 MB記憶體,那麼應用程式最多可以使用16 MB記憶體。當今的作業系統能讓磁碟空間看起來像記憶體一樣。磁碟上的檔案一般被稱為頁交換檔案(pagin

Windows記憶體體系(2) -- 交換檔案

一、頁交換檔案 虛擬地址空間只是作業系統為程序“虛擬”出來的一塊地址區域,並不代表任何實際的空間。而“頁交換檔案”卻對應了實際的空間,這個空間一般是磁碟上名為“pagefile.sys”的檔案。 “頁交換檔案”的大小和位置可以在系統設定(系統屬性 ->

Centos6.5 python2.6.6升級2.7.13,安裝setuptoolspip

centos python pip setuptools selenium1、安裝Development Tools和相關編譯安裝的組件# yum -y groupinstall "Development tools" # yum -y install openssl-devel zlib-devel ncu

檔案系統中的邏輯塊、物理扇區之間的關係

轉載:https://blog.csdn.net/aspirinvagrant/article/details/11365209 扇區(sector):硬體(磁碟)上的最小的操作單位,是作業系統和塊裝置(硬體、磁碟)之間傳送資料的單位。 block由一個或多個sect

[Xcode10 實際操作]七、檔案與資料-(5 )複製、移動、刪除檔案刪除資料夾

本文將演示如何複製、移動和刪除檔案。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 over

13.3.5 【介面委託的泛型可變性】限制說明

1. 不支援類的型別引數的可變性 只有介面和委託可以擁有可變的型別引數。即使類中包含只用於輸入(或只用於輸出)的類型引數,仍然不能為它們指定 in 或 out 修飾符。例如, IComparer<T> 的公共實現 Comparer<T>是不變的——不能將 Comparer<IS

Qt 5讀取、解析、生成儲存JSON檔案

專案中用到了一些JSON的東西,為了方便就做了一層簡單的封裝方便以後使用,包括了JSON的讀取、解析、生成和儲存這些基本功能 json.h檔案 #ifndef JSON_H #define JSON_H #include <QJsonArray> #include &l

Gentoo 安裝日記 13 (配置核心 :可執行檔案安格式網路)

接:http://nvd11.blog.163.com/blog/static/20001831220127254852277/Executable file formats / Emulations ---> [*] Kernel support for ELF binaries           

Qt for Linux:樹莓派3配置Qt開發環境(Qt 5.9.1 OpenCV 2.4.13

關於樹莓派 我用的是 樹莓派樹莓派3代B型 Raspberry Pi Model 3 B 我拿來是做監控視訊採集的,所以會用到 Qt 和 OpenCV 開發上,除了視訊採集和視訊檔案生成用的OpenCV,其他全部Qt 本篇文章只涉及樹莓派的配置,不涉及具

第10步 (1)logback.xml日誌配置(2) ftp(上傳檔案)伺服器配置(3) idea注入自動編譯配置(4)專案提交gitee(5)fe助手restlet client

****************************************************************************************************************************************** 1.直接複製&

虛擬記憶體(Virtual Memory,VM)交換檔案(Pagefile,PF)

在保護模式下,Win32 程式可以定址 2GB 或 3GB 虛擬記憶體,對每一個程序來說,它定址的範圍都是這麼多。OS 負責把程序提交的虛擬記憶體按頁(一頁 4KB,工作集)對映到實體記憶體的實際頁幀上(駐留集)。如果設定了硬碟上的交換檔案(Pagefile.sys),那麼

題目:某個公司採用公用電話傳遞資料,資料是四位的整數,在傳遞過程中是加密的,加密規則如下:每位數字都加上5,然後用除以10的餘數代替該數字,再將第一位第四位交換,第二位第三位交換

題目:某個公司採用公用電話傳遞資料,資料是四位的整數,在傳遞過程中是加密的, 加密規則如下:每位數字都加上5,然後用和除以10的餘數代替該數字,再將第一位和第四位交換,第二位和第三位交換。package

C++筆記(5):繼承多態代碼實現

c++筆記 esp 變量 main style cnblogs radius 區分 fine Shape.h 1 #ifndef SHAPE_H 2 #define SHAPE_H 3 #include<string> 4 using std::str

13.5.SolrCloud集群使用手冊之數據導入

delete text -- bin 數據導入 charset strong cloud clean 轉載請出自出處:http://www.cnblogs.com/hd3013779515/ 1.使用curl命令方式 SolrCloud時會根據路由規則路由到各個shard。

練習:求1+2+3+4+5...100的

hid 技術 one brush src log display 分享 code 求1+2+3+4+5...100的和方法一 count = 1 s1 = 0 while count <= 100:

bootstrap 學習筆記(5)---- 圖片響應式工具

-h thumb ima ble resp 圓角 rim ucc spl (一)響應式圖片: 在 Bootstrap 版本 3 中,通過為圖片添加 .img-responsive 類可以讓圖片支持響應式布局。其實質是為圖片設置了 max-width: 100%;、 heig

從頭認識java-13.5 利用泛型構建復雜模型

引用 ucid http lee private 這一 數據 pack ora 這一章節我們來展示一下如何利用泛型構建復雜模型?1.元組列表我們之前已經說過元組是一個復雜的模型,能夠返回多對象。package com.ray.ch11; import java.uti

10以內的素數2,3,5,7的為17。要求計算得出任意正整數n以內的所有素數的

prime rim raw_input input find turn range import port n= int (raw_input())def find_prime(n): L = list(range(2,n + 1)) m = 0 whil