Windows自身没有提供类似Linux cgroup的能力来限制进程或进程组的资源占用,进程CPU/IO/内存/网络等资源的控制只能由自己实现。目前已有第三方的实现,主要是限制进程CPU的占用,如文档 < 21 Best Ways to Limit the CPU Usage of a Process > 所描述的BES,Process Tamer等软件。自Windows 8及Server 2012开始Windows系统有提供以job为单位的CPU占用及内存上限设置,之前的版本则只能以进程或线程为单位进行限制。
进程CPU占用限制方案
即时轮询系统所有进程(线程)的CPU占用,当发现所设定进程有超标时强制暂停进程所有线程的执行,然后在适当的时机再恢复执行。其中所涉及技术点:
进程CPU占用查询 GetProcessTimes
BOOL GetProcessTimes(
[in] HANDLE hProcess,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
此函数可以获取进程从创建至当前的总运行时间及总的CPU时间,(KernelTime + UserTime) < 系统CPU数 * (当前时间 - CreationTime)
线程CPU占用查询 GetThreadTimes
BOOL GetThreadTimes(
[in] HANDLE hThread,
[out] LPFILETIME lpCreationTime,
[out] LPFILETIME lpExitTime,
[out] LPFILETIME lpKernelTime,
[out] LPFILETIME lpUserTime
);
QueryThreadCycleTime可以提供更精准的CPU时间数据,单位为CPU时钟周期
BOOL QueryThreadCycleTime(
[in] HANDLE ThreadHandle,
[out] PULONG64 CycleTime
);
线程暂停及恢复
Windows平台没有提供暂停整个进程的支持函数,只能以线程为单位来操作,即SuspendThread及ResumeThread:
DWORD SuspendThread(
[in] HANDLE hThread
);
DWORD ResumeThread(
[in] HANDLE hThread
);
CPU亲和性设置: SetProcessAffinityMask
BOOL SetProcessAffinityMask(
[in] HANDLE hProcess,
[in] DWORD_PTR dwProcessAffinityMask
);
此函数可以限定进程及其所有线程所能使用的CPU,故一定程序上亦限定了进程最大的系统CPU占用率。
DWORD_PTR SetThreadAffinityMask(
[in] HANDLE hThread,
[in] DWORD_PTR dwThreadAffinityMask
);
此函数可单独限制特定线程的CPU亲和性。
进程优先级设置: SetPriorityClass
优先级解决的是优先运行及退让CPU的问题,本质上并不能限定CPU占用,只是优先级高于当前任务的忙碌的时候,当前进程会主动退让CPU 线程优先级设置:SetThreadPriority
BOOL SetThreadPriority(
[in] HANDLE hThread,
[in] int nPriority
);
Job Objects
Windows系统提供了Job的概念用以管理多个进程,可以限制Job对象内所有进程及期线程的CPU核心占用、CPU占用及内存分配上限等,均通过SetInformationJobObject来实现,具体的CPU限制由JOBOBJECT_CPU_RATE_CONTROL_INFORMATION管理,内存限制则由JOBOBJECT_EXTENDED_LIMIT_INFORMATION来管理。
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
需要注意的是CPU占用设置只有Windows 8及Server 2012之后的版本有效。
CPU Sets
此部分只限定了CPU Affinity属性
实验验证
可以直接利用开源项目go-winjob验证,验证系统Windows 8 x64,go-winjob git repo: https://github.com/kolesnikovae/go-winjob
验证程序
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
unsigned long total = 0, count = 0, i = 0;
while (1) {
if (malloc(1024)) {
total += 1024;
count++;
}
if (!(++i & 4095))
printf("alloc: %u size: %u bytes\n", count, total);
}
}
无限制
在无限制的情况下,此进程会占满一个CPU核心,commit内存总占用达2G

单一进程
在设定CPU上限16%及内存16M上限之后,结果如下:
examples/job_object.go按如下修改:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithProcessMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
多进程(双进程)
将winjob.WithProcessMemoryLimit 改为 winjob.WithJobMemoryLimit,后者表示此job内所有进程要占用的总内存限制:
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
验证结果如下:

winjob example代码:
// +build windows
package main
import (
"encoding/json"
"log"
"os"
"os/exec"
"os/signal"
"time"
"golang.org/x/sys/windows"
"github.com/kolesnikovae/go-winjob"
)
var limits = []winjob.Limit{
winjob.WithBreakawayOK(),
winjob.WithKillOnJobClose(),
winjob.WithActiveProcessLimit(3),
winjob.WithProcessTimeLimit(10 * time.Second),
winjob.WithCPUHardCapLimit(1600), // 16%
winjob.WithJobMemoryLimit(16 << 20), // 16MB
winjob.WithWriteClipboardLimit(),
}
const defaultCommand = ".\\CPUStress.exe"
const stressCommand = ".\\CPUStressX64.exe"
func main() {
job, err := winjob.Create("", limits...)
if err != nil {
log.Fatalf("Create: %v", err)
}
cmd := exec.Command(defaultCommand)
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := cmd.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
stress := exec.Command(stressCommand)
stress.Stderr = os.Stderr
stress.SysProcAttr = &windows.SysProcAttr{
CreationFlags: windows.CREATE_SUSPENDED,
}
if err := stress.Start(); err != nil {
log.Fatalf("Start: %v", err)
}
s := make(chan os.Signal, 1)
signal.Notify(s, os.Interrupt)
c := make(chan winjob.Notification)
subscription, err := winjob.Notify(c, job)
if err != nil {
log.Fatalf("Notify: %v", err)
}
done := make(chan struct{})
go func() {
defer close(done)
ticker := time.NewTicker(time.Second * 5)
defer ticker.Stop()
var counters winjob.Counters
for {
select {
case <-s:
log.Println("Closing job object")
if err := job.Close(); err != nil {
log.Fatal(err)
}
log.Println("Closing subscription")
if err := subscription.Close(); err != nil {
log.Fatal(err)
}
return
case n, ok := <-c:
if ok {
log.Printf("Notification: %#v\n", n)
} else if err := subscription.Err(); err != nil {
log.Fatalf("Subscription: %v", err)
}
case <-ticker.C:
if err := job.QueryCounters(&counters); err != nil {
log.Fatalf("QueryCounters: %v", err)
}
b, err := json.MarshalIndent(counters, "", "\t")
if err != nil {
log.Fatal(err)
}
log.Printf("Counters: \n%s\n", b)
}
}
}()
if err := job.Assign(cmd.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(cmd); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := job.Assign(stress.Process); err != nil {
log.Fatalf("Assign: %v", err)
}
if err := winjob.Resume(stress); err != nil {
log.Fatalf("Resume: %v", err)
}
if err := cmd.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
if err := stress.Wait(); err != nil {
log.Fatalf("Wait: %v", err)
}
// Wait for a signal.
<-done
}
If you’re in the Tri Cities area and need a reliable chiropractor, Kennewick Chiropractic Injury Clinic offers compassionate and expert care. Chiropractor near me
My chiropractor gave me exercises to maintain better posture between visits. Tacoma Chiropractor
Thanks for the valuable article. More at firma de abogados en Vigo .
Has someone attempted cellular locksmith services and products in Orlando? I’m curious approximately their reliability and velocity! locksmith
В данном материале представлены ключевые тенденции в сфере медицинской науки и практики. Вы узнаете о последних открытиях, инновационных подходах к терапии и важности профилактики заболеваний. Особое внимание уделено практическому применению новых методов в клинической практике.
Смотрите также… – [url=https://newtvnews.ru/social/2024/12/22/vyvod-iz-zapoya-nedorogo-kakie-osobennosti/]вывести из запоя тверь[/url]
Athletes benefit from lymphatic work for reduced DOMS. Read more on Lymphatic Drainage Massage Winnipeg .
vedonvälittäjä tervetuliaisbonus
Feel free to surf to my site basketball-wetten.com
I enjoyed this post. For additional info, visit Pressure washing .
I appreciate the emphasis on workmanship; check premium asphalt shingles chicago to see exactly how salvo architectural roofer approach difficult roof geometries.
Thanks for the thorough article. Find more at Junk removal company concord .
В этой статье мы рассмотрим современные достижения в области медицины, включая инновационные методы лечения и диагностики. Мы обсудим важность профилактики заболеваний и роль технологий в улучшении качества здравоохранения. Читатели узнают о влиянии медицины на повседневную жизнь и ее значение для современного общества.
Узнать напрямую – [url=https://deepcool-ma.com/lechenie-alkozavisimyh-opasnost-zapoya-vyvod-iz-zapoya-na-domu/]Вывод из запоя[/url]
I have actually viewed consistent quality from BSA Insurance claims as the greatest independent adjusters. Take a look at local independent adjuster Florida .
This was quite helpful. For more, visit Pressure Washing .
If you’re dealing with chronic pain, I suggest finding a ##Puyallup Chiropractor## to help manage it effectively. chiropractic
Thanks for the useful suggestions. Discover more at casas rurales Grajera .
This was quite informative. For more, visit S.M.A.C. Sevilla .
Surveillance by insurers is common; learn how to avoid pitfalls at car accident attorney .
This was nicely structured. Discover more at Procerin scam alerts .
The customer service at Locksmith Unit Orlando Florida is outstanding; they really care about their clients’ needs! More info can be found at locksmith .
For security, siding companies london recommended tempered glass sidelights and robust hardware—feels much safer.
Your suggestion to combine walking and contouring was a win for me. More detailed plan at Winnipeg Body Contouring .
В этой статье рассматривается комплексный подход к избавлению от зависимости. Читатель узнает, как сочетание физического, психологического и духовного восстановления помогает достичь стойкого выздоровления.
Где почитать поподробнее? – [url=https://pilles.ru/lechenie-narkomanii-v-narkologicheskom-czentre-chto-predlagayut-vrachi.html]детоксикация наркозависимых цена[/url]
Helpful post! If you’re in Glastonbury CT and need roof repairs after a storm, check out Exteriors of CT roofing contractor .
Rear-end collisions at roundabouts in London are common—see injury lawyers london ontario for next steps.
If you have thyroid or cardiac concerns, read the medical cautions on Lymphatic Drainage Massage Winnipeg first.
If anyone requires architectural-grade roofing support, salvo architectural roofing contractors handle complex roofings flawlessly– find out more using architectural asphalt roofing chicagoland .
This was a fantastic read. Check out Merrick’s #1 Exterior Power Washing | Roof & House Washing for more.
Just had a great experience with a doctor in Pattaya—professional and friendly. If you’re looking, try urgent care in Pattaya for more about Takecare Clinic Doctor Pattaya.
Thanks for the detailed guidance. More at Pressure Washing Merrick NY .
Dedicated to spinal health, this team helps patients across the Tri Cities move better and feel better every day. Kennewick car accident chiropractor
Seeing a chiropractor in Tacoma was the best decision I made for my long-term health. Injury chiropractor
Sunburn care was spot-on at Take Care Clinic Ao Nang. Keep 24 hour clinic in Ao Nang Krabi handy for emergencies.
Эта информационная публикация освещает широкий спектр тем из мира медицины. Мы предлагаем читателям ясные и понятные объяснения современных заболеваний, методов профилактики и лечения. Информация будет полезна как пациентам, так и медицинским работникам, желающим поддержать уровень своих знаний.
Осуществить глубокий анализ – [url=https://uk-rb.ru/vyvod-iz-zapoya-kak-vernut-zdorove-i-yasnost-uma/]помощь вывода из запоя[/url]
http://webfrick.de/
Webfrick praesentiert sich als ein spezialisierte Agentur ausgerichtet auf die deutsche Wirtschaftslandschaft, das anbietet massgeschneiderte Loesungen fuer seine Kunden, wertschaetzend auf persoenliche Betreuung. Mehr Informationen auf dieser Seite.
I enjoyed this post. For additional info, visit Residential Pressure Washing .
Impressed by your science-backed approach. Energy-based body contouring plus strength training was key for me—credit to Body Contouring in Winnipeg .
Thanks for the great tips. Discover more at contratar guías Camino de Santiago .
This was quite informative. For more, visit casa rural con jardín Segovia .
Thanks for the comprehensive read. Find more at abogados accidentes laborales Sevilla .
This was a wonderful post. Check out Tootoonchi Chiropractic spinal adjustment for more.
A skilled car accident attorney can handle insurers while you heal. I recommend starting with car accident attorney .
Appreciate the detailed information. For more, visit Commercial Pressure Washing Merrick NY .
This was very insightful. Check out stanford painting professionals for more.
Appreciate the detailed information. For more, visit wordpress website design services .
The best suited relocating day is the single you don’t must raise a thing. Find pros at santa cruz movers .
This was very well put together. Discover more at ytmp3 extract .
We moved from Kenilworth to Pointer Ridge and our best decision was booking a local Bowie mover through Cheap movers Bowie —they knew the HOA rules cold.
Moving across Allentown’s West End? I had a smooth experience—see Cheap movers Allentown for local rates and packing help.
Anyone worried about fragile antiques in a Hampton move—request custom crating. Mine was arranged easily through Hampton Mover’s Pro .
For folks relocating from Buffalo to Florida, does Buffalo car shipping help coordinate seasonal snowbird shipments with guaranteed pickup windows? Timing is everything when avoiding late storms on I-90.