比如, 有某进程a和b, 我要限定a进程最高只能占用50m内存, b进程40m内存
如何做?

解决方案 »

  1.   

    linux中可以,windows中好像不行吧?
      

  2.   

    windows那么不厚度,莫非要自己写个程序搞定?
      

  3.   

    用作业对象进行限制。
    CreateJobObject AssignProcessToJobObject 然后SetInformationJobObject ,第二个参数写JobObjectBasicLimitInformation接着倒数第二个参数填入一个JOBOBJECT_BASIC_LIMIT_INFORMATION结构的缓冲区
    typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
      LARGE_INTEGER PerProcessUserTimeLimit;
      LARGE_INTEGER PerJobUserTimeLimit;
      DWORD         LimitFlags;
      SIZE_T        MinimumWorkingSetSize;//最小内存
      SIZE_T        MaximumWorkingSetSize;//最大内存
      DWORD         ActiveProcessLimit;
      ULONG_PTR     Affinity;
      DWORD         PriorityClass;
      DWORD         SchedulingClass;
    } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
      

  4.   


    // begin_ntddk begin_ntifs
    //
    // Process Information Classes
    //typedef enum _PROCESSINFOCLASS {
        ProcessBasicInformation,
        ProcessQuotaLimits,
        ProcessIoCounters,
        ProcessVmCounters,
        ProcessTimes,
        ProcessBasePriority,
        ProcessRaisePriority,
        ProcessDebugPort,
        ProcessExceptionPort,
        ProcessAccessToken,
        ProcessLdtInformation,
        ProcessLdtSize,
        ProcessDefaultHardErrorMode,
        ProcessIoPortHandlers,          // Note: this is kernel mode only
        ProcessPooledUsageAndLimits,
        ProcessWorkingSetWatch,
        ProcessUserModeIOPL,
        ProcessEnableAlignmentFaultFixup,
        ProcessPriorityClass,
        ProcessWx86Information,
        ProcessHandleCount,
        ProcessAffinityMask,
        ProcessPriorityBoost,
        ProcessDeviceMap,
        ProcessSessionInformation,
        ProcessForegroundInformation,
        ProcessWow64Information,
        ProcessImageFileName,
        ProcessLUIDDeviceMapsEnabled,
        ProcessBreakOnTermination,
        ProcessDebugObjectHandle,
        ProcessDebugFlags,
        ProcessHandleTracing,
        ProcessIoPriority,
        ProcessExecuteFlags,
        ProcessResourceManagement,
        ProcessCookie,
        ProcessImageInformation,
        MaxProcessInfoClass             // MaxProcessInfoClass should always be the last enum
    } PROCESSINFOCLASS;ZwQueryInformationProcess(...ProcessPooledUsageAndLimits,...);
    ZwSetInformationProcess(...ProcessPooledUsageAndLimits,...);// ProcessPooledUsageAndLimits
    typedef struct _POOLED_USAGE_AND_LIMITS {
        SIZE_T PeakPagedPoolUsage;
        SIZE_T PagedPoolUsage;
        SIZE_T PagedPoolLimit;
        SIZE_T PeakNonPagedPoolUsage;
        SIZE_T NonPagedPoolUsage;
        SIZE_T NonPagedPoolLimit;
        SIZE_T PeakPagefileUsage;
        SIZE_T PagefileUsage;
        SIZE_T PagefileLimit;
    } POOLED_USAGE_AND_LIMITS;
    typedef POOLED_USAGE_AND_LIMITS *PPOOLED_USAGE_AND_LIMITS;这个应该可以吧,我没试过~~~
      

  5.   

    SetProcessWorkingSetSize
    一旦交换占用的内存到虚拟内存,会导致内存硬盘间频繁的页面交换吧。我觉得一般加载程序的时候使用这个函数较好。