如何在c#中获取MS Windows 7内存的当前页面大小

本文关键字:内存 当前页 Windows MS 获取 | 更新日期: 2023-09-27 18:11:51

如何在c#中获得MS Windows 7内存的当前页面大小?

在某些情况下,我们需要它以最佳方式分配内存。

谢谢!

更新:这里是一个示例代码…我对byte[] buffer = new byte[4096];有一些疑问

// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;
try
{
    response = request.EndGetResponse(result);
    if (response != null)
    {
        // Once the WebResponse object has been retrieved, get the stream object associated with the response's data
        remoteStream = response.GetResponseStream();
        // Create the local file
        string pathToSaveFile = Path.Combine(FileManager.GetFolderContent(), TaskResult.ContentItem.FileName);
        localStream = File.Create(pathToSaveFile);
        // Allocate a 1k buffer http://en.wikipedia.org/wiki/Page_(computer_memory)
        byte[] buffer = new byte[4096];      
        int bytesRead;
        // Simple do/while loop to read from stream until no bytes are returned
        do
        {
            // Read data (up to 1k) from the stream
            bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

如何在c#中获取MS Windows 7内存的当前页面大小

如果你使用的是c# 4.0,有一个属性Environment。内部使用GetSystemInfo的SystemPageSize。我以前从未见过它,因为它是新的。

http://msdn.microsoft.com/en-us/library/system.environment.systempagesize.aspx

在C语言中,你可以这样写:

#include <windows.h>
int main(void) {
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    printf("The page size for this system is %u bytes.'n", si.dwPageSize);
    return 0;
}

然后,你可以使用p/INVOKE调用GetSystemInfo。看看http://www.pinvoke.net/default.aspx/kernel32.getsysteminfo

我还必须补充一点,分配一个页面大小的字节数组并不是最好的选择。

首先,c#内存是可以移动的,c#使用了一个压缩分代垃圾收集器。没有任何关于数据将被分配到哪里的信息。

第二,c#中的数组可以由不连续的内存区域组成!数组连续存储在虚拟内存中,但连续虚拟内存不是连续物理内存。

第三,c#中的数组数据结构比内容本身多占用一些字节(它存储数组大小和其他信息)。如果您分配页面大小的字节数,使用数组几乎总是会切换页面!

我认为这个优化可以是一个非优化。

通常c#数组在不需要使用页面大小分割内存的情况下执行得非常好。

如果你真的需要精确的数据分配,你需要使用固定数组或Marshal分配,但这会减慢垃圾收集器的速度。

我想说的是,最好只是使用你的数组,而不要考虑太多的页面大小。

使用pinvoke调用GetSystemInfo()并使用dwPageSize值。虽然你可能真的想要dwAllocationGranularity,这是VirtualAlloc()将分配的最小块。