Windows中的程式的Working Set,Private Bytes和Virtual Bytes

查志強發表於2015-01-08

【原文:http://blog.csdn.net/fw0124/article/details/6367360

總結:

1)Working Set看成一個程式可以用到(但不一定會使用)的實體記憶體。即不引起page fault異常就能夠訪問的記憶體。

     Working Set包含了可能被其他程式共享的記憶體, 例如DLL就是一個典型的可能被其他程式共享的資源。

     所以所有程式的Working Set加起來有可能大於實際的實體記憶體。

2)Private Bytes是隻被本程式用佔用的虛擬地址空間,不包括其他程式共享的記憶體。

     Private Bytes既包括不引起page fault異常就能夠訪問的記憶體也包括引起page fault異常才能夠訪問的記憶體。

     所以一般Private Bytes大於Working Set。但是如果一個程式和其他程式共享較多記憶體,也可能造成Working Set大於Private Bytes。

3)Virtual Byte是整個程式佔用的全部虛擬地址空間。32位Windows使用者模式下,程式最大可以使用2GB,可以通過修改Boot.ini檔案擴充套件為最大可以使用到3GB。

4)Windows Task Manager中看到記憶體使用量是Working Set。

 

==================================================

原文:

http://my.opera.com/Returner/blog/show.dml/573233

http://www.cnblogs.com/awpatp/archive/2010/01/26/1656651.html

 

*The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault. 
*The working set of a process consists of the set of resident physical pages visible to the process. When a thread accesses a page that is not in the working set of its process, a page fault occurs. Before the thread can continue, the virtual memory manager must add the page to the working set of the process. A larger working set increases the probability that a page will be resident in memory, and decreases the rate of page faults.
可以把Working Set看成一個程式可以用到(但不一定會使用)的實體記憶體(實體記憶體頁的集合)。記憶體管理單元在進行虛擬記憶體地址到實體記憶體地址轉換時,如果虛擬地址不在實體記憶體中,會引起page fault異常。足夠的WorkingSet就可以保證常用的虛擬地址都位於實體記憶體中,減少這種異常,避免了異常處理(例如訪問swap檔案,將頁面讀入實體記憶體)帶來的效能損耗。因此,對於時間比較敏感的程式,應該分配足夠的WorkingSet以保證程式效能。

*When you increase the working set size of an application, you are taking away physical memory from the rest of the system.
*Suppose you have a 16-megabyte system and you set your minimum to four megabytes. In effect, this takes away four megabytes from the system. Other applications may be unable to get their minimum working set.
可見,Working Set是被真實地從實體記憶體中劃分出來的。一個程式佔用了多少Working Set,實體記憶體中就有多少空間不能被其它程式使用。

*Reducing memory consumption is always a beneficial goal. If you call SetProcessWorkingSetSize(0xffffffff, 0xffffffff), this tells the system that your working set can be released. This does not change the current sizing of the working set, it just allows the memory to be used by other applications. It is a good idea to do this when your application goes into a wait state. 
*Windows NT 3.5 allows processes to increase their working set size by using SetProcessWorkingSetSize(). This API is also useful to trim your minimum working set size if you want to run many processes at once, because each process has the default minimum working set size reserved, no matter how small the process actually is.
Windows會為每個程式保留一個預設數值的working set,然而這個保留的Working set可能會比該process實際需要的大。可以用SetProcessWorkingSetSize()來對程式的Working set進行裁剪,只保留程式目前已經佔用的頁面,空閒的就釋放掉給其它應用使用。

 

一個有趣的問題是, working set指目前程式所消耗的實體記憶體, private bytes指的是commit的記憶體, 那麼為什麼有些程式的working set比private bytes還大? 要回答這個問題, 需要仔細看看兩者的定義:

  • "Working Set refers to the numbers of pages of virtual memory committed to a given process, both shared and private."
  • "Private Bytes is the current size, in bytes, of memory that this process has allocated that cannot be shared with other processes."

所以, Working Set包含了可能被其他程式共享的記憶體, 而Private Bytes只包括被當前程式使用的記憶體.

 

DLL是一個典型的可能被其他程式共享的資源. DLL的載入使用檔案映像, 因此包含DLL的實體記憶體可以被同時映像到多個程式上. 所以在程式中載入DLL的記憶體只能算到working set上, 而不能被算到private bytes上.

 

在解決記憶體問題的時候Shared的部分一般可以不用考慮.

一個程式使用記憶體的時候, 它佔用的記憶體會被分為兩部分, 一部分是working set, 另一部分是private byte減去working set. 其中working set是貯存在實體記憶體中的, 而剩下的另一部分是paging file, 存在磁碟上.

 

一般來說把所有程式的working set加起來會比你機器上所擁有的實體記憶體要大, 這是因為有Shared的資源(比如DLL)的緣故.

 

Virtual Bytes.

The current size, in bytes, of the virtual address space for this process. The virtual address space limit of a user mode process is 2 GB, unless 3 GB address space is enabled by using the /3GB switch in boot.ini.

 

原文:

Virtual Bytes are the total virtual address space occupied by the entire process, including memory-mapped files such as shared DLLs. This is like the working set except it includes data that has already been paged out and is sitting in a pagefile somewhere. The total virtual bytes used by every process on a system under heavy load will add up to significantly more memory than the machine actually has.

翻譯:

Virtual Byte是整個程式佔用的全部虛擬地址空間, 包括諸如共享dll在內的記憶體對映檔案. 它跟working set很像, 不一樣的是, 它還得算上已經被page out的存放在別的什麼地方的pagefile中的資料. 一個高負荷系統中所有程式的全部的virtual bytes加起來, 會比機器實際擁有的記憶體多很多.

 

個人理解

===============

假設我有一臺機器, 機器有實體記憶體1024M. 機器上面僅執行著三個程式A, B, C.

下面的情況是可能的:

A和B僅共用一個叫做common.dll的庫檔案. common.dll為A分配了10M的記憶體, 為B分配了20M記憶體.

common.dll本身佔30M記憶體.

A的可執行程式以及其資料本身佔用了40M, B的使用了50M, C的使用了60兆.

A的可執行程式本身使用的記憶體中有5兆不在記憶體中, 在pagefile中.

A沒有引用其他的dll檔案.

 

那麼A的private bytes是40-5+10 = 45M

A的working set是40-5+30 = 65M

A的virtual bytes是40+30+10=80M


相關文章