精华内容
下载资源
问答
  • windows 虚拟内存

    2018-01-07 16:14:00
    windows虚拟内存分布: 32位cpu:  32bit cpu的寻址空间是0 ~ 4 G(2^32),低2G为用户地址空间(user space),对应r3权限,用户的进程都工作在这个空间;高2G为系统地址空间,对应r0,为所有系统组件,驱动共享的...

    虚拟内存:将不连续的物理内存抽象化后方便上层使用的内存。

    windows虚拟内存分布:

    32位cpu:

      32bit cpu的寻址空间是0 ~ 4 G(2^32),低2G为用户地址空间(user space),对应r3权限,用户的进程都工作在这个空间;高2G为系统地址空间,对应r0,为所有系统组件,驱动共享的内存空间。

      每一位代表一个地址线,32位cpu表示地址线有32条。

      系统可以允许把所有低地址空间全部给单个应用程序用(However, applications can specify that the system should allocate all memory for the application below 2 gigabytes.)

      https://msdn.microsoft.com/en-us/library/windows/desktop/aa384271(v=vs.85).aspx

      所以,x86应用程序最大能申请到2G的内存,驱动程序也是最多能申请到2G的内存

    64位cpu:

      64bit低8G为用户控件,高240G为系统空间。

      x64应用程序最多能申请到8T的内存。

     

    x86 x64 应用程序的内存限制文档:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

    转载于:https://www.cnblogs.com/yiii/p/8228289.html

    展开全文
  • 轻松解决Windows虚拟内存不够问题 很多朋友的电脑系统是WindowsXP有时使用时明明没开多少程序却常常出现虚拟内存不足的系统提示怎么解决这些问题呢? 1杀毒有些病毒发作时会占用大量的内存空间导致系统出现内存不足的...
  • cmd命令行修改windows虚拟内存 #查看当前设置 wmic pagefile list /format:list #取消自动管理分页文件大小 wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False #修改页面文件...

    cmd命令行修改windows虚拟内存

    #查看当前设置
    wmic pagefile list /format:list

    #取消自动管理分页文件大小
    wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False

    #修改页面文件大小 最小1024MB,最大4096MB
    wmic pagefileset where name="C:\pagefile.sys" set InitialSize=1024,MaximumSize=4096

    #重启生效
    shutdown -r -t 0

    转载于:https://blog.51cto.com/jameszhan/2385227

    展开全文
  • Windows 虚拟内存管理

    2019-12-25 19:32:04
    文章目录虚拟内存管理1. 基本管理2. 虚拟内存管理结构3. Windbg查看VAD4. 原理4.1 NtAllocateVirtualMemory4.2 MiProtectVirtualMemory5. 应用5.1 模块枚举5.2 隐藏进程模块5.3 内存隐藏 虚拟内存管理 1. 基本管理 ...

    虚拟内存管理

    1. 基本管理

    对于内存管理的方式有很多,内存也分为很多种,例如:

    1. 堆内存
    2. 栈内存

    对于内存的分配函数也分为很多种,例如:new,malloc,Alloc, HeapAlloc;对于这些内存管理函数,其实都是封装了底层内存管理,然后对上层提供了相关的内存接口,最原始的内存管理函数应该是分为如下几个:

    //分配内存
    LPVOID WINAPI VirtualAllocEx(
      _In_     HANDLE hProcess,
      _In_opt_ LPVOID lpAddress,
      _In_     SIZE_T dwSize,
      _In_     DWORD  flAllocationType,
      _In_     DWORD  flProtect
    );
    
    //释放内存
    BOOL WINAPI VirtualFreeEx(
      _In_ HANDLE hProcess,
      _In_ LPVOID lpAddress,
      _In_ SIZE_T dwSize,
      _In_ DWORD  dwFreeType
    );
    
    //修改内存的属性
    BOOL WINAPI VirtualProtect(
      _In_  LPVOID lpAddress,
      _In_  SIZE_T dwSize,
      _In_  DWORD  flNewProtect,
      _Out_ PDWORD lpflOldProtect
    );
    
    //查询内存属性信息
    SIZE_T WINAPI VirtualQueryEx(
      _In_     HANDLE                    hProcess,
      _In_opt_ LPCVOID                   lpAddress,
      _Out_    PMEMORY_BASIC_INFORMATION lpBuffer,
      _In_     SIZE_T                    dwLength
    );
    

    所有的上层内存函数,底层都是通过这些函数分配一个大块内存,然后在底层中,通过管理向上层提供小块内存操作接口。

    2. 虚拟内存管理结构

    在windows中,虚拟内存是针对进程的,每个进程的虚拟内存是不同的,因此在进程结构中存在管理虚拟内存的变量VadRoot,如下:

    0: kd> dt  nt!_EPROCESS ffff9c84`80b133c0 -n VadRoot
    nt!_EPROCESS
       +0x658 VadRoot : _RTL_AVL_TREE
    

    对于VadRoot的结构,每个系统的版本都存在不同,WRK中的结构信息如下:

    typedef struct _MMVAD {
        union {
            LONG_PTR Balance : 2;
            struct _MMVAD *Parent;
        } u1;
        struct _MMVAD *LeftChild;
        struct _MMVAD *RightChild;
        ULONG_PTR StartingVpn;
        ULONG_PTR EndingVpn;
    
        union {
            ULONG_PTR LongFlags;
            MMVAD_FLAGS VadFlags;
        } u;
        PCONTROL_AREA ControlArea;
        PMMPTE FirstPrototypePte;
        PMMPTE LastContiguousPte;
        union {
            ULONG LongFlags2;
            MMVAD_FLAGS2 VadFlags2;
        } u2;
    } MMVAD, *PMMVAD;
    

    这个是一个RVL树结构:

    1. StringVpn 起始页 / EndingVpn结束页;两者算法是不同的。起始页:startingVpn0x1000/结束页:EndVpn0x1000+0xfff。
    2. Parent、LeftChild、RightChild - 其父节点、左子树、右子树。
    3. VadFlags属性信息,如下:
    typedef struct _MMVAD_FLAGS {
        ULONG_PTR CommitCharge : COMMIT_SIZE; // limits system to 4k pages or bigger!
        ULONG_PTR NoChange : 1;
        ULONG_PTR VadType : 3;
        ULONG_PTR MemCommit: 1;
        ULONG_PTR Protection : 5;
        ULONG_PTR Spare : 2;
        ULONG_PTR PrivateMemory : 1;    // used to tell VAD from VAD_SHORT
    } MMVAD_FLAGS;
    
    1. ContraArea 控制结构,如下:
    typedef struct _CONTROL_AREA {
        PSEGMENT Segment;
        LIST_ENTRY DereferenceList;
        ULONG NumberOfSectionReferences;    // All section refs & image flushes
        ULONG NumberOfPfnReferences;        // valid + transition prototype PTEs
        ULONG NumberOfMappedViews;          // total # mapped views, including
                                            // system cache & system space views
        ULONG NumberOfSystemCacheViews;     // system cache views only
        ULONG NumberOfUserReferences;       // user section & view references
        union {
            ULONG LongFlags;
            MMSECTION_FLAGS Flags;
        } u;
        PFILE_OBJECT FilePointer;    //文件对象,例如dll,sys等等
        PEVENT_COUNTER WaitingForDeletion;
        USHORT ModifiedWriteCount;
        USHORT FlushInProgressCount;
        ULONG WritableUserReferences;
    #if !defined (_WIN64)
        ULONG QuadwordPad;
    #endif
    } CONTROL_AREA, *PCONTROL_AREA;
    

    我们知道,对于一个进程,所有的模块都会被映射到内存空间中,所以遍历VadRoot中的CONTROL_AREA文件对象就可以遍历到所有加载的模块信息了

    如果我们希望别人看不到我们的内存,那么我们隐藏VadRoot中的结构就可以到达目的。

    3. Windbg查看VAD

    在windbg中,提供了!vad命令来查看vad内存信息,查看结构如下:

    0: kd> dt nt!_EPROCESS ffff9c84`af3980c0 -n VadRoot
       +0x658 VadRoot : _RTL_AVL_TREE
    0: kd> dx -id 0,0,ffff9c8480b133c0 -r1 (*((ntkrnlmp!_RTL_AVL_TREE *)0xffff9c84af398718))
    (*((ntkrnlmp!_RTL_AVL_TREE *)0xffff9c84af398718))                 [Type: _RTL_AVL_TREE]
        [+0x000] Root             : 0xffff9c84b16d61c0 [Type: _RTL_BALANCED_NODE *]
    
    0: kd> !vad 0xffff9c84af398718
    VAD             Level         Start             End              Commit
    ffff9c84b1ac5770  7           7ffe0           7ffe0               1 Private      READONLY           
    ffff9c84b1ac58b0  6           7ffe6           7ffe6               1 Private      READONLY           
    ffff9c84b1ac5220  8         72ae870         72ae8ef              11 Private      READWRITE          
    ffff9c84aaf468e0  7         72ae8f0         72ae96f              11 Private      READWRITE          
    ffff9c84b1ac5a90  5         72aea00         72aebff               5 Private      READWRITE          
    ffff9c84a8a5d0c0  7        1eeb0400        1eeb040f               0 Mapped       READWRITE          Pagefile section, shared commit 0
    ffff9c84a8a5d980  8        1eeb0410        1eeb0417               0 Mapped       READWRITE          Pagefile section, shared commit 0
    ffff9c84ac05e4f0  6        1eeb0420        1eeb043a               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c849b3440d0  7        1eeb0440        1eeb0443               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c84b1ac5360  4        1eeb0450        1eeb0451               2 Private      READWRITE          
    ffff9c84af58e410  8        1eeb0460        1eeb0491               4 Private      READWRITE          
    ffff9c84af591b60  7        1eeb04a0        1eeb04d1               1 Private      READWRITE          
    ffff9c84a8a5d700  8        1eeb04e0        1eeb04e0               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c84a8a5d7a0  6        1eeb04f0        1eeb04f0               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c84a8a5d840  8        1eeb0500        1eeb050d               0 Mapped       READONLY           \Windows\servicing\CbsMsg.dll
    ffff9c84af58a0e0  7        1eeb0510        1eeb060f             255 Private      READWRITE          
    ffff9c84a8a5cc60  5        1eeb0610        1eeb06d6               0 Mapped       READONLY           \Windows\System32\locale.nls
    ffff9c84a8a5ea60  9        1eeb06e0        1eeb06e7               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c84a8a5ec40  8        1eeb06f0        1eeb07b0               0 Mapped       READONLY           Pagefile section, shared commit 0
    ffff9c84af597ba0  7        1eeb07c0        1eeb07cf               8 Private      READWRITE          
    ffff9c84b16d7b10  9        1eeb07d0        1eeb07df               9 Private      READWRITE          
    //...
    
    ffff9c84a8a5e2e0  9       7fff30380       7fff3039e               3 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\profapi.dll
    ffff9c84a8a5dde0  6       7fff303a0       7fff303b0               3 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\kernel.appcore.dll
    ffff9c84a8a5eba0  9       7fff303c0       7fff30409               3 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\powrprof.dll
    ffff9c84a8a5fbe0  8       7fff30410       7fff305a3               8 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\gdi32full.dll
    ffff9c84a8a5ce40  7       7fff305b0       7fff3064d               7 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\msvcp_win.dll
    ffff9c84a8a5c9e0  8       7fff30650       7fff30749               4 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\ucrtbase.dll
    ffff9c84a8a5d200  4       7fff30750       7fff309f2               9 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\KernelBase.dll
    ffff9c84a8a5dac0  8       7fff30a00       7fff30b48              10 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\crypt32.dll
    ffff9c84a8a5e9c0  9       7fff30b50       7fff30b70               2 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\win32u.dll
    ffff9c84a8a5e240  7       7fff30b80       7fff30bdb               4 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\wintrust.dll
    ffff9c84a8a5e560  8       7fff30be0       7fff30c29               5 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\cfgmgr32.dll
    ffff9c84a8a5cd00  6       7fff30c30       7fff30caf               2 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\bcryptprimitives.dll
    ffff9c84a8a5e060  8       7fff30d60       7fff30d76               3 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\cryptsp.dll
    ffff9c84a8a5db60  9       7fff30d80       7fff30da5               3 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\bcrypt.dll
    ffff9c84a8a5d160  7       7fff31590       7fff31626               6 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\sechost.dll
    ffff9c84a8a5d3e0  9       7fff31630       7fff316cd              10 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\msvcrt.dll
    ffff9c84a8a5f6e0  8       7fff316d0       7fff31863               6 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\user32.dll
    ffff9c84a8a5ca80  9       7fff31900       7fff31a1f               5 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\rpcrt4.dll
    ffff9c84a8a5c8a0  5       7fff31bd0       7fff31c81               5 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\kernel32.dll
    ffff9c84a8a5c300  7       7fff31c90       7fff31fc5               9 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\combase.dll
    ffff9c84a8a5e7e0  8       7fff31fd0       7fff32072               8 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\advapi32.dll
    ffff9c84a8a5d2a0  6       7fff32110       7fff321d3               6 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\oleaut32.dll
    ffff9c84a8a5e600  8       7fff32550       7fff326a5               6 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\ole32.dll
    ffff9c84a8a5e6a0  9       7fff32da0       7fff32dc5               4 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\gdi32.dll
    ffff9c84a8a5e740  7       7fff332c0       7fff33361               9 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\clbcatq.dll
    ffff9c84a8a5fdc0  9       7fff33370       7fff333de               4 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\ws2_32.dll
    ffff9c84ac05d5f0  8       7fff33480       7fff3366f              17 Mapped  Exe  EXECUTE_WRITECOPY  \Windows\System32\ntdll.dll
    
    

    4. 原理

    4.1 NtAllocateVirtualMemory

    我们调用VirtualAlloc分配内存的时候,底层就会通过NtAllocateVirtualMemory分配虚拟内存,这个函数的基本流程如下:

    NTSTATUS
    NtAllocateVirtualMemory(
        __in HANDLE ProcessHandle,
        __inout PVOID *BaseAddress,
        __in ULONG_PTR ZeroBits,
        __inout PSIZE_T RegionSize,
        __in ULONG AllocationType,
        __in ULONG Protect
        )
    {
        //...
        PMMVAD Vad;
        Vad = ExAllocatePoolWithTag (NonPagedPool, sizeof(MMVAD_SHORT), 'SdaV');
    
        Status = MiFindEmptyAddressRange (CapturedRegionSize,
                                                      Alignment,
                                                      (ULONG)ZeroBits,
                                                      &StartingAddress);
    
        Status = MiInsertVadCharges (Vad, Process);                                              
    }
    

    这里创建一个内存管理节点,然后保存内存信息,并插入到进程的用户内存空间中。

    4.2 MiProtectVirtualMemory

    上面的VirtualAlloc分配了一个内存区,插入到了进程的用户内存表中,但是,我们知道可以使用VirtualProtect来改变其中某些页面的属性。

    因此对于一个MMVAD还会形成一系列的Region,每个Region的属性是不同的,所有的Region组成了MMVAD,修改属性的函数为MiProtectVirtualMemory,在Reactos中,这个实现过程如下:

    在这里插入图片描述

    至于MmSplitRegion这个函数,是修改其中某块的属性,然后针对属性进行修改,如果修改过后的属性和其他相邻的Region相同,则形成合并(这里是Reactos的代码,但是原理上面来说,应该都差不多)。

    5. 应用

    5.1 模块枚举

    从上面的分析,我们知道可以直接使用如下函数枚举进程的模块

    NTSTATUS ZwQueryVirtualMemory(
      _In_      HANDLE                   ProcessHandle,
      _In_opt_  PVOID                    BaseAddress,
      _In_      MEMORY_INFORMATION_CLASS MemoryInformationClass,
      _Out_     PVOID                    MemoryInformation,
      _In_      SIZE_T                   MemoryInformationLength,
      _Out_opt_ PSIZE_T                  ReturnLength
    );
    
    typedef enum _MEMORY_INFORMATION_CLASS {
        MemoryBasicInformation
    #if DEVL
        ,MemoryWorkingSetInformation
    #endif
        ,MemoryMappedFilenameInformation
        ,MemoryRegionInformation
        ,MemoryWorkingSetExInformation
    } MEMORY_INFORMATION_CLASS;
    

    更加底层的,我们可以直接枚举进程空间中的内存获取模块信息。

    5.2 隐藏进程模块

    既然我们可以通过VadRoot获取进程模块,那么通过同样的方法,我们也可以通过这里进行隐藏,具体实现可以参考网上的方法,但是这种方法不是特别稳定应当慎重使用。

    5.3 内存隐藏

    很容易,如果我们将MMVDA中的内存长度进行修改,就会导致内存隐藏,具体实现参考网上的一些实现方法,但是这种方法也不是稳定的方案,应当慎重使用。

    展开全文
  • 手动设置虚拟内存- 一、量身定制虚似内存- 二、Windows虚拟内存加速密籍(一)- 二、Windows虚拟内存加速密籍(二)- 三、出现“虚拟内存不够”的几个可能- 页面文 件的设置-  本文详细介绍了虚拟内存的设置和...
     手动设置虚拟内存- 一、量身定制虚似内存- 二、Windows虚拟内存加速密籍(一)- 二、Windows虚拟内存加速密籍(二)- 三、出现“虚拟内存不够”的几个可能- 页面文
    件的设置-

      本文详细介绍了虚拟内存的设置和相关问题的解决方法。
      内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了
    虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理
    内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着
    就会把虚拟内里储存的文件释放到原来的安装目录里了。
      当系统运行时,先要将所需的指令和数据从外部存储器(如硬盘、软盘、光盘等)调入内存中,CPU再从内存中读取指令或数据进行运算,并将运算结果存入内存中,内存所
    起的作用就像一个“二传手”的作用。当运行一个程序需要大量数据、占用大量内存时,内存这个仓库就会被“塞满”,而在这个“仓库”中总有一部分暂时不用的数据占据
    着有限的空间,所以要将这部分“惰性”的数据“请”出去,以腾出地方给“活性”数据使用。这时就需要新建另一个后备“仓库”去存放“惰性”数据。由于硬盘的空间很
    大,所以微软Windows操作系统就将后备“仓库”的地址选在硬盘上,这个后备“仓库”就是虚拟内存。在默认情况下,虚拟内存是以名为Pagefile.sys的交换文件保存在硬盘
    的系统分区中。
      手动设置虚拟内存
      在默认状态下,是让系统管理虚拟内存的,但是系统默认设置的管理方式通常比较保守,在自动调节时会造成页面文件不连续,而降低读写效率,工作效率就显得不高,
    于是经常会出现“内存不足”这样的提示,下面就自已动手来设置它吧。
      ①用右键点击桌面上的“我的电脑”图标,在出现的右键菜单中选择“属性”选项打开“系统属性”窗口。在窗口中点击“高级”选项卡,出现高级设置的对话框。
      ②点击“性能”区域的“设置”按钮,在出现的“性能选项”窗口中选择“高级”选项卡,打开其对话框。
      ③在该对话框中可看到关于虚拟内存的区域,点击“更改”按钮进入“虚拟内存”的设置窗口。选择一个有较大空闲容量的分区,勾选“自定义大小”前的复选框,将具
    体数值填入“初始大小”、“最大值”栏中,而后依次点击“设置→确定”按钮即可,最后重新启动计算机使虚拟内存设置生效。
      建议:可以划分出一个小分区专门提供给虚拟内存、IE临时文件存储等使用,以后可以对该分区定期进行磁盘整理,从而能更好提高计算机的工作效率。

    一、量身定制虚似内存
      1.普通设置法
      根据一般的设置方法,虚拟内存交换文件最小值、最大值同时都可设为内存容量的1.5倍,但如果内存本身容量比较大,比如内存是512MB,那么它占用的空间也是很可观
    的。所以可以这样设定虚拟内存的基本数值:内存容量在256MB以下,就设置为1.5倍;在512MB以上,设置为内存容量的一半;介于256MB与512MB之间的设为与内存容量相同值

      2.精准设置法
      由于每个人实际操作的应用程序不可能一样,比如有些人要运行3DMAX、Photoshop等这样的大型程序,而有些人可能只是打打字、玩些小游戏,所以对虚拟内存的要求并
    不相同,于是就要因地制宜地精确设置虚拟内存空间的数值。
      ①先将虚拟内存自定义的“初始大小”、“最大值”设为两个相同的数值,比如500MB;
      ②然后依次打开“控制面板→管理工具→性能”,在出现的“性能”对话框中,展开左侧栏目中的“性能日志和警报”,选中其下的“计数器日志”,在右侧栏目中空白
    处点击右键,选择右键菜单中的“新建日志设置”选项;
      ③在弹出的对话框“名称”一栏中填入任意名称,比如“虚拟内存测试”。在出现窗口中点击“添加计数器”按钮进入下一个窗口;
      ④在该窗口中打开“性能对象”的下拉列表,选择其中的“Paging File”,勾选“从列表中选择计数器”,并在下方的栏目中选择“%Usage Peak”;勾选“从列表中选择
    范例”,在下方的栏目中选择“_Total”,再依次点击“添加→关闭”结束;
      ⑥在右侧栏目中可以发现多了一个“虚拟内存测试”项目,如果该项目为红色则说明还没有启动,点击该项,选择右键菜单中的“启动”选项即可;
      接下来运行自己常用的一些应用程序,运行一段时间后,进入日志文件所在的系统分区下默认目录“PerfLogs”,找到“虚拟内存测试_000001.csv”并用记事本程序打开
    它,在该内容中,查看每一栏中倒数第二项数值,这个数值是虚拟内存的使用比率,找到这项数值的最大值,比如图中的“46”,用46%乘以500MB(前面所设定的虚拟内存数值
    ),得出数值为230MB。
      用该数值可以将初始大小设为230MB,而最大值可以根据磁盘空间大小自由设定,一般建议将它设置为最小值的2到3倍。这样就可以将虚拟内存打造得更精准,使自己的爱
    机运行得更加流畅、更具效率
    二、Windows虚拟内存加速密籍
      虚拟内存对于任何版本的Windows而言都是十分重要的。如果设置得当,它将极大地提升电脑的性能和运行速度。可是在默认状态下,Windows始终将虚拟内存设为物理内
    存的1.5倍。这样的话,如果用户安装2GB的内存,系统就会腾出高达3GB的硬盘空间作为虚拟内存。但以当前的主流应用软件和游戏对内存的需要来看,根本没有必要使用这么
    多的虚拟内存。那么,有没有什么秘技或绝招可使虚拟内存运用得更有效率或更显性能呢?
      1、分割存于多个硬盘
      将虚拟内存设在较快的硬盘上,的确可使虚拟内存的运作更有效率。但是若电脑上两个硬盘速度一样快,则应将虚拟内存平均分配在两个不同的硬盘上(并非同一硬盘的不
    同分区)。因为同步进行读写操作会更有效地提高系统整体的虚拟内存性能。
      举个例子,假设你原本在硬盘C上设置了700MB的虚拟内存,现在你可尝试重新分配,即把硬盘C改为350MB,硬盘D新增350MB的虚拟内存。理论上这样做会加快虚拟内存整
    体的读写操作.
      2、硬盘需有足够空间
      如果你不是很有经验的电脑用户,又或者没有特殊的使用要求,在Windows XP中选择“系统管理的大小”的方法来自动处理虚拟内存,一般情况下应该会比选择“自定义
    大小”的方法来得安全和稳定。不过,有一点大家必须注意,由于虚拟内存的“页面文件”(pagefile.sys)会随着电脑使用过程进行收缩和扩展,为使系统管理虚拟内存能够
    进行得顺利和更具弹性,必须保证分页文件所在的硬盘拥有足够的可用空间。
      3、最小值等于最大值
      选择“自定义大小”的方法来处理虚拟内存,并将最大值和最小值都设为同一数值。有很多人都相信用这种方法来处理虚拟内存有助于提高系统的性能。他们所持的理由
    是,当最大值和最小值都相等时,系统无需时刻进行收缩和扩展页面文件的动作。省去了这些工作,相应地就是提高系统效率。
      这种方法,很多人坚信有效,但同样地,也有人指出其实并没有效果。但不管怎样也好,如要将最大值和最小值设为相等,必须坚守一个原则,那就是虚拟内存的大小必
    须足够,否则系统轻则会出现效率下降(要进行更多复写动作来腾出空间),严重的更会造成系统不稳定。
      4、整理页面文件
      文件数据保存在硬盘上久了,文件碎片(fragment)自然会产生。要保持或提高硬盘的工作效率,应不时为硬盘进行一次碎片整理。所谓虚拟内存,其实也是硬盘上的资料
    文件,那么虚拟内存是否也应该像普通文件般需要整理呢?
      Windows系统处理页面文件(即虚拟内存)的方法有别于一般的文件。相比之下,页面文件比一般文件更少出现碎片,为页面文件进行整理通常是没有必要的。事实上,当
    Windows XP进行磁盘碎片整理时,页面文件不会牵涉其中。
      虽然Windows不会对页面文件进行整理,但事实上页面文件也有碎片存在。追求“尽善尽美”的朋友可能仍想对页面文件进行碎片整理。大家不妨试试下面的方法:
      在桌面“我的电脑”图标上单击鼠标右键,在随后出现的功能菜单中选“属性”。进入系统属性的设置窗口,用鼠标点选“高级”-->“性能”-->“设置”-->“高级”-
    ->“更改”,在随后出现的“虚拟内存”设置窗口中选中“无分页文件”一项。最后单击“设置”按钮退出,并重新启动电脑。
      重新启动后,检查一下磁盘根目录中还有没有pagefile.sys页面文件存在,如有就将之删除。清除掉虚拟内存的页面文件后,现在再进行磁盘碎片整理。完成后,按照前
    面的步骤重新设置一定数量的虚拟内存,并启动电脑使之生效。经上述方法处理后,新得出的页面文件将会是没有碎片的。
      另外,如果想查看页面文件碎片的具体情况呢?启动磁盘碎片整理程序,为存在有页面文件的硬盘进行一次“分析”,再点选“查看报告”,看看“页面文件碎片”一栏便
    会一目了然.
    5、虚拟内存的理想大小
      想以“自定义大小”的方法来处理虚拟内存,究竟应该设置多大的虚拟内存呢?在Windows XP中,如果由操作系统自己定义虚拟内存,系统通常会把最小值设置为物理内存
    的1.5倍。当扩展时,最大值则介于物理内存的2.5至3倍。一般情况下,用户想自定义虚拟内存的大小,均可参照这个比例设置。
      真的要参照这个比例吗?如果电脑有1GB的内存,难不成最小值要设置为1.5GB,最大值是2.5至3GB。这样一来。Pagefile.sys页面文件至少为1.5GB,太不现实了!
      其实,大内存的系统跟小内存的系统相比,在设置虚拟内存时,标准有些不同。
      如果大家有512MB以上甚至1GB的内存,既然物理内存已经相当充足,所需的虚拟内存反而应该减少。故在大内存的系统中,虚拟内存的最小值可以设成物理内存的一半。
    比如有1GB的内存,虚拟内存的最小值设成512MB,最大值则维持3GB以备不时之需。注意:虽然最大值设为3GB,系统是不会立即出现3GB大小的pagefile.sys文件,实际上它首
    先会以最小值出现,待有扩展需要时才会递增。
      另外,有些大内存的朋友,可能会干脆不设置虚拟内存,以此强迫系统使用速度较快的内存。其实这是不太明智的做法。正所谓凡事都不要做得太绝对,完全没有虚拟内
    存也不行。原因是不少应用程序在设计时要求必须使用虚拟内存,没有了就会造成系统不稳定或死机。
      至于小内存的系统,例如256MB,参照1.5倍及3倍的设置比例最稳当。即虚拟内存最小值设为384MB,最大值768MB。
      6、手工订制最准确的虚拟内存
      0.5倍、1.5倍、3倍,哇!好像买衣服时分大、中、小号,完全没有个性。究竟设置虚拟内存有没有更“贴身剪裁”的方法呢?
      在Windows XP桌面的“开始”→“运行”中输入perfmon.msc,一个与系统性能有关的监视器便会出现。看看显示器的底部,有三个计数器(pages/sec、Avg.Disk Queue
    Length及rocessor Time,)。为了便于接下来对虚拟内存的页面文件进行精确监测,现在请大家将这三个计数器逐一点选,并按键盘上的Delete键将它们删除。请大家放心,
    删除后,下次再启动系统性能监视器时,这三个项目会重新出现。
      删除后,现在请在图表中央位置单击鼠标右键,在随后出现的功能菜单中点选“添加计数器”一项,跟着在跳出窗口的“性能对象”一栏选“Process”。之后再在“从列
    表选择”一栏中点选“Page File Bytes”。不清楚“Page File Bytes”代表什么意思,只要单击“说明”按钮,解说文字便会出现在对话框之下。
      选定“Page File Bytes”后,再在右方的“从列表选择范例”一栏选取“Total”项,之后依次单击“添加”和“关闭”按钮,一个名为“Page File Bytes”的计数器便
    会出现在性能监视器的下方中。
      重复以上的动作,再添加一个名为“Page File Bytes Peak”的计数器(即Process下面的Page File Bytes Peak)。
      现在,回头看一下监视器,图表中应该正在显示并计量着刚才新增加的两个计数器。如无意外,这两个计数器在图表上的显示不正确,即数值靠近最高比例线,没有动态
    变化。不用怕,这并不表示你的电脑出了什么问题,而是图表比例设得不太恰当而已!用鼠标右键逐一单击监视器底部的“Page Fele Bytes”和“Page File By8tes Peak”计
    数器,并选“属性”一项。在“数据”页面的“比例”一栏中改为0.0000001,这样显示器中的图表便不再是没有动静了。
      如果你看过系统提供的说明,相信应该知道“Page File Bytes”和“Page File Bytes Peak”正是代表了系统监测期间所使用的虚拟内存及其峰值是多大。因此,需要精
    确地手工设置虚拟内存,可参考图表下方显示的数字,其单位是Bytes。
      想知道在正常的情况下,你的系统会耗用多少虚拟内存?请将平时日常使用的应用软件同时启动并让它们开始工作,接着再看性能监视器上所显示的数值,心中有数了吧

      人总有疯狂的时候,想知道自己疯狂使用电脑时系统需要多少虚拟内存,现在就尽情地将电脑上的程序启动并运行(例如,开十多个IE浏览器窗口上网,播放MP3和DVD影片
    ,再进行光盘刻录或DV影片压缩编码),看看监视器的百分比会升高到多少。
      在图表上右击鼠标,点选“属性”,进入“图表”页面勾选“水平格线”一项。这样图表中会出现一条条的水平分割线,是不是好分辨了?
      图表中的红色垂直线跑得太快,来不及开启电脑上的程序进行测试?
      同样,在图表上单击鼠标右键,选“属性”,在常规页面的“自动抽样间隔”一项中将1秒改为5秒。此时,图表中的“图形时间”数值便会由1分40秒变成8分20秒。换言
    之,红色垂直线走完一圈需花费8分20秒,这个时间应该足以让大家开启并运行很多应用程序,然后再慢慢查看图表中的结果。
      最后,通过监视器的图表,相信大家已经能粗略估计你的电脑系统应设置多大的虚拟内存了。
    三、出现“虚拟内存不够”的几个可能
      1、感染病毒
      有些病毒发作时会占用大量内存空间,导致系统出现内存不足的问题。赶快去杀毒,升级病毒库,然后把防毒措施做好!
      2、虚拟内存设置不当
      虚拟内存设置不当也可能导致出现内存不足问题,一般情况下,虚拟内存大小为物理内存大小的2倍即可,如果设置得过小,就会影响系统程序的正常运行。重新调整虚拟
    内存大小以WinXP为例,右键点击“我的电脑”,选择“属性”,然后在“高级”标签页,点击“性能”框中的“设置”按钮,切换到“高级”标签页,然后在“虚拟内存”框
    中点击“更改”按钮,接着重新设置虚拟内存大小,完成后重新启动系统就好了。
      3、系统空间不足
      虚拟内存文件默认是在系统盘中,如WinXP的虚拟内存文件名为“pagefile.sys”,如果系统盘剩余空间过小,导致虚拟内存不足,也会出现内存不足的问题。系统盘至少
    要保留300MB剩余空间,当然这个数值要根据用户的实际需要而定。用户尽量不要把各种应用软件安装在系统盘中,保证有足够的空间供虚拟内存文件使用,而且最好把虚拟内
    存文件安放到非系统盘中。
      4、因为SYSTEM用户权限设置不当
      基于NT内核的Windows系统启动时,SYSTEM用户会为系统创建虚拟内存文件。有些用户为了系统的安全,采用NTFS文件系统,但却取消了SYSTEM用户在系统盘“写入”和“
    修改”的权限,这样就无法为系统创建虚拟内存文件,运行大型程序时,也会出现内存不足的问题。问题很好解决,只要重新赋予SYSTEM用户“写入”和“修改”的权限即可
    ,不过这个仅限于使用NTFS文件系统的用户。
    四、虚拟内存的优化
      1. 启用磁盘写入缓存
      在“我的电脑”上单击鼠标右键选择“属性->硬件”,打开设备管理器找到当前正在使用的硬盘,单击鼠标右键选择属性。在硬盘属性的的“策略”页中,打开“启用磁
    盘上的写入缓存”。
      这个选项将会激活硬盘的写入缓存,从而提高硬盘的读写速度。不过要注意一点,这个功能打开后,如果计算机突然断电可能会导致无法挽回的数据丢失。因此最好在有
    UPS的情况下再打开这个功能。当然,如果你平常使用计算机时不要进行什么重要的数据处理工作,没有UPS也无所谓,这个功能不会对系统造成太大的损失。
      2. 打开Ultra MDA
      在设备管理其中选择IDE ATA/ATAPI控制器中的“基本/次要IDE控制器”,单击鼠标右键选择“属性”,打开“高级设置”页。这里最重要的设置项目就是“传输模式”,
    一般应当选择“DMA(若可用)”。
      3. 配置恢复选项
      Windows XP 运行过程中碰到致命错误时会将内存的快照保存为一个文件,以便进行系统调试时使用,对于大多数普通用户而言,这个文件是没有什么用处的,反而会影响
    虚拟内存的性能。所以应当将其关闭。
      在“我的电脑”上单击鼠标右键,选择“属性->高级”,在“性能”下面单击“设置”按钮,在“性能选项”中选择“高级”页。这里有一个“内存使用”选项,如果将
    其设置为“系统缓存”,Windows XP 将使用约4MB的物理内存作为读写硬盘的缓存,这样就可以大大提高物理内存和虚拟内存之间的数据交换速度。默认情况下,这个选项是
    关闭的,如果计算机的物理内存比较充足,比如256M或者更多,最好打开这个选项。但是如果物理内存比较紧张,还是应当保留默认的选项。
     页面文件的设置
    一、页面文件的大小计算
      对于不同的计算机而言,页面文件的大小是各不相同的。关于页面文件大小的设置,有两个流传甚广的“公式”,“物理内存X2.5”或者“物理内存X1.5”。这两种计算
    方法固然简便,但是并不适用于所有的计算机。设置页面文件大小最准确的方法是看看计算机在平常运行中实际使用的页面文件大小。
      通过Windows XP自带的日志功能可以监视计算机平常使用的页面文件的大小,从而进行最准确的设置,具体步骤如下。
      1、在“我的电脑”上单击鼠标右键,选择“属性->高级”,单击“性能”下面的“设置”按钮,然后选择“高级”页,单击“虚拟内存”下方的“更改”按钮。选择“自
    定义大小”,并将“起始大小”和“最大值”都设置为300M,这只是一个临时性的设置。设置完成后重新启动计算机使设置生效。
      2、进入“控制面板->性能与维护->管理工具”,打开“性能”,展开“性能日志和警告”,选择“计数器日志”。在窗口右侧单击鼠标右键选择“新建日志设置”
      3、随便设置一个日志名称,比如“监视虚拟内存大小”。
      4、在“常规”页中单击“添加计数器”按钮。
      在“性能对象”中选择“Paging File”,然后选中“从列表选择记数器”下面的“%Usage Peak”,并在右侧“从列表中选择范例”中选择“_Total”。最后单击“添加
    ”和“关闭”按钮。
      5、别忘了记住“日志文件”页中的日志文件存放位置和文件名,后面需要查看这个日志来判断Windows XP平常到底用了多少虚拟内存,在这个例子中,日志文件被存放在
    D:\Perflog目录下。
      另外还要设置“日志文件类型”为“文本文件”,这样便于阅读。
      这时你可以看到刚才新建的日志条目前面的图标变成了绿色,这表明日志系统已经在监视虚拟内存了。如果图标还是红色,你应该单击鼠标右键选择“开始”来启动这个
    日志。
      过一段时间后打开这个CVS文件,可以看到如下内容的条目。
      这个日志文件记录这一段时间中页面文件的使用情况,注意这里的单位是%,而不是MB。通过简单的计算,就可以得到页面文件的最小尺寸,公式是“页面文件尺寸X百分
    比”。比如这个例子中,虚拟内存最大的使用比率是31%,300MBX31%=93MB,这个值就是虚拟内存的最小值(注意,300MB是前面的设置的临时值)。
      如果物理内存较大,可以考虑将页面文件的“起始大小”和“最大值”设置为相等,等于上一步中计算出来的大小。这样硬盘中不会因为页面文件过渡膨胀产生磁盘碎片
    ,其副作用是由于“最大值”被设置的较小,万一偶然出现虚拟内存超支的情况,可能会导致系统崩溃。
      设置页面文件
      现在回到“虚拟内存”的设置对话框中选择自定义大小并按照上面的计算结果分别设置“初始大小”和“最大值”。这里将“初始大小”设置为91M,而将“最大值”设置
    成了200M,这样比较保险。
      对页面文件进行碎片整理
      Windows XP运行时需要大量访问页面文件,如果页面文件出现碎片,系统性能将会受到严重影响,而且会缩短硬盘的使用寿命。所以很有必要对页面文件定期进行碎片整
    理。
      不过别忘了,页面文件是系统关键文件,Windows XP运行时无法对其进行访问。所以对它进行碎片整理并不是一件容易的事情。有两种方案可以选择,一是安装Windows双
    系统,然后启动另外一个Windows对Windows XP所在的分区进行碎片整理。二是使用专门的工具软件,比如System File Defragmenter等。
    展开全文
  • Windows虚拟内存简介

    千次阅读 2017-09-30 15:13:00
    Windows系统中,系统内存本身的空间可能非常有限,但是通过虚拟内存(Virtual Memory),可以让程序可以拥有超过系统物理内存大小的可用内存空间。   顾名思义,虚拟内存是逻辑层面的划分。操作系统通过内存...
  • Windows 虚拟内存理解

    2019-09-02 22:04:45
    Windows 32位系统中,虚拟内存地址空间可以达到4GB,且每个进程都可独享虚拟内存,其中内核代码可以访问整个4GB虚拟地址空间,用户态只能访问2GB虚拟地址。 问题:如果一个台PC中,内存很小,例如只有1GB,如果有多...
  • Windows虚拟内存配置

    千次阅读 2018-12-20 19:42:31
    尽管现在很少有人需要再设置虚拟内存了,但是毕竟不是人人都可以马上换上好的高配置电脑,所以这里就为读者写下一篇解决电脑卡顿,虚拟内存配置的文章 步骤 首先得打开控制面板,不过win10比较麻烦 方式一:随便...
  • cmd命令行修改windows虚拟内存 #查看当前设置wmic pagefile list /format:list #取消自动管理分页文件大小wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False #修改页面文件大小 ...
  • #我要上头条##科技快讯##科技潮玩##爆料#Windows 虚拟内存知多少?一、 引入虚拟内存的缘由:在现代计算机系统中,内存依然是计算机中比较宝贵的资源,可以看一下你的个人电脑,目前硬盘主流为1T或者2T,1T=1024G,...
  • Windows虚拟内存空间

    2020-11-18 22:49:13
    For a 32-bit process, the virtual address space is ...For a 64-bit process on 64-bit Windows, virtual address space is the 128-terabyte range 0x000’00000000 through 0x7FFF’FFFFFFFF. In 32-bit Windo.
  • windows虚拟内存设置器

    2010-09-03 14:32:33
    虚拟内存设置器绿色软件,简单易用,虚拟内存设置器绿色软件,简单易用
  • windows虚拟内存机制

    2017-09-03 15:46:00
    windows系统中个,每个进程拥有自己独立的虚拟地址空间(Virtual Address Space)。这一地址空间的大小与计算机硬件、操作系统以及应用程序都有关系。 对于32位程序来说,最多能使用2GB空间(0x00010000-0x7FFEFFFF)...
  • windows 虚拟内存查看

    2019-10-08 12:47:23
    转载于:https://www.cnblogs.com/python-xiakaibi/p/9070220.html
  • 前段时间处理了两个windows的问题,感觉有点...这是由于机器内存增加,windows系统自动增大了虚拟内存的体积造成的,有以下两个原因: 1、内存大小和休眠文件大小有直接关系,一般休眠文件等于内存大小 hiberfil.sy...
  • 当我们在运行一些大型的软件,或者是刚刚退出游戏的时候经常会提示"你的虚拟内存过低"的提示,出现这种情况一般是:一:你的物理内存比较小,运行大的软件比较吃力;二:你运行了许多窗口或者是游戏的时候物理内存...
  • 默认虚拟内存是物理内存的1.5倍 虚拟地址 英文名称为Virtual Address,简称VA,由于Windows程序时运行在386保护... Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。基于分页机制,这4GB地
  • windows虚拟内存管理

    千次阅读 2016-07-21 09:22:16
    内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理。在应用程序中我们无时不刻不在和...
  • 很多朋友的电脑系统是WindowsXP,有时使用时,明明没开多少程序,却常常出现虚拟内存不足的系统提示。怎么解决这些问题呢?  1、杀毒有些病毒发作时会占用大量的内存空间,导致系统出现内存不足的问题。赶快去杀毒...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,662
精华内容 2,664
关键字:

windows虚拟内存