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
}
С пациентом работают профильные специалисты, которые оценивают состояние и подбирают безопасный план помощи.
Получить больше информации – [url=https://narkolog-na-dom-v-novorossijske1.ru/]нарколог на дом анонимно[/url]
Bài viết rất “đã”, phù hợp với người thích game đổi thưởng. Tham khảo thêm tại sunwin
Mình thấy GO88 CỔNG GAME TÀI XỈU GO88 UY TÍN #1 VIỆT NAM rất hấp dẫn, giao diện dễ chơi và uy tín. game bài go88
Помощь оказывают врачи с практикой в наркологии, психиатрии и восстановительной терапии.
Подробнее тут – [url=https://vyvod-iz-zapoya-v-lyubercah14-3.ru/]vyvod-iz-zapoya-v-lyubercah14-3.ru/[/url]
viver de apostas
Also visit my web blog Empate Anula Aposta Multipla
I appreciate the focus on early symptoms like redness, swelling, and bleeding. Those signs should prompt a dental visit. More here: Beverly Hills periodontal therapy
Thank you for the guide to long-distance moves from Corona. I started with local quotes using Corona Movers and compared options.
Нарколог на дом приезжает в экстренных и неотложных ситуациях и быстро оценивает состояние и сразу начинает необходимые процедуры. Врач может провести вывод из запоя, снятие абстинентного синдрома, медикаментозное вытрезвление, стабилизацию давления, инфузионную терапию, подбор лекарств, мотивационную беседу и первичный план восстановления. Помощь оказывается анонимно, без постановки на учет, без лишних опознавательных знаков и без передачи персональных данных третьим лицам.
Получить больше информации – [url=https://narkolog-na-dom-v-novorossijske3.ru/]вызвать нарколога на дом в новороссийске[/url]
This is a helpful reminder that seasonal weed treatments can prevent major lawn issues before they start. weed control company
Заявку можно оставить в любое время, специалист быстро сориентирует по дальнейшим действиям.
Разобраться лучше – [url=https://vyvod-iz-zapoya-v-novorossijske3.ru/]наркологический вывод из запоя новороссийск[/url]
I found this post informative, especially the points about early intervention. Gum health should be part of everyone’s routine dental care. More here: Gum Disease Treatment in Beverly Hills
dobbelspel uitbetaling ideal
Feel free to surf to my web page – casino in kaatsheuvel
This is a useful resource for patients and caregivers. pain doctors Denver may also help people learn more about managing persistent pain.
Great tips for anyone preparing for a big move. When it comes to long distance movers in Hampton, comparing services, timelines, and packing options is so important. Hampton international movers is a useful resource to keep in mind.
Just had an emergency after-hours burst pipe in Feasterville—calling a 24/7 Plumber Feasterville via plumber feasterville saved my basement.
Your budget-pleasant assistance are real looking. I phased my task and prioritized key sightlines through a making plans template from landscape lighting near me .
I have an understanding of posts like this that lend a hand shoppers make trained decisions. More Jack Hanania Buick GMC details is a possibility at Best car dealerships .
Moving long distance can feel overwhelming, especially when planning from Bowie. This post offers helpful reminders about organizing early and choosing reliable support. For anyone comparing options, Best Bowie movers may be worth checking out.
Thanks for the informative content. More at concise drug guides .
I like the focus on reducing downtime. For companies in Stanford, even a short delay can affect daily operations, so experienced commercial movers are important. More help is available at Stanford moving company reviews .
A good moving team can handle the hard work while you focus on your new home or office. For North Las Vegas full service movers, visit North Las Vegas commercial movers .
Слушайте кто кухню недавно заказывал Цены космос а качество мыло То сроки по полгода Короче, нашел наконец нормальное производство — кухни СПб от производителя Проект бесплатно В общем, там цены и каталог — кухни в спб на заказ [url=https://kuhni-spb-lvk.ru]кухни в спб на заказ[/url] Не ведитесь на салоны-прокладки Перешлите тому кто ищет
You could suggest keeping essentials in a personal overnight bag. Detroit commercial movers
Здорова, народ Отец не встаёт с кровати Соседи уже вызвали участкового Скорая не приедет на такой вызов Короче, единственные кто взялся за безнадёжный случай — вывод из запоя стационар с круглосуточным наблюдением Провели полную детоксикацию В общем, телефон и цены тут — быстрый вывод из запоя в стационаре [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-knd.ru]быстрый вывод из запоя в стационаре[/url] Звоните прямо сейчас Это может спасти жизнь
This is a valuable topic for people buying cars online from out of state. St. Louis auto shippers can help arrange safe and efficient vehicle delivery. For more related resources, check St. Louis car shippers .
Помогаем быстро перейти от консультации к конкретному плану: выезд, стационар или наблюдение.
Разобраться лучше – [url=https://vyvod-iz-zapoya-v-lyubercah14-2.ru/]vyvod iz zapoya na domu lyubercy[/url]
A well-managed business move can prevent unnecessary downtime. For companies in the area, Office moving companies St. Petersburg is helpful when looking into St. Petersburg commercial movers.
This is a very useful read for people relocating around Houston. A dependable moving company can make the whole process much smoother. Thanks for the advice, and I’ll visit Houston apartment movers .
If you have bees, consider relocation first. For other stinging pests, a pro is safer—find qualified help at tree service .
This post explains the importance of professional care really well. If you’re searching for Gum Disease Treatment in Ventura, check out Gum Disease Treatment in Ventura .
populairste beste teen patti live Casino (https://wargamesfever.Com/) site belgie snelle uitbetaling
Wonderful tips! Find more at manual de enfermedades reumatológicas .
For a budget-friendly move across boroughs, start with Bronx residential moving companies — I went Bronx to Queens without breaking the bank.
Excellent article. Keep writing such kind of info on your
blog. Im really impressed by your site.
Hi there, You have performed an incredible job. I’ll definitely digg it and for my part recommend to my
friends. I am confident they’ll be benefited from this web
site.
bonus bingo Casino En Ligne DéPôT 10 Euros Suisse
I like that you mentioned the significance of expert repair for high-tension garage door parts. residential garage door repair near me
Moving across town in Wichita Falls? Compare prices and services at business moving companies Wichita Falls before you book your movers.
Thanks for the great tips. Discover more at Fabien VILLAREAL .
The tip about amazing stake lighting to hinder runway effortlessly is gold. I established a same design with furniture I realized as a result of outdoor lighting near me and it seems to be ordinary.
С пациентом работают профильные специалисты, которые оценивают состояние и подбирают безопасный план помощи.
Выяснить больше – [url=https://narkolog-na-dom-v-novorossijske2.ru/]запой нарколог на дом новороссийск[/url]
Your explanation of how panel tilt affects production was helpful. I’ll see what angle Direct Solar Installer Southern California recommends for my roof.
I didn’t realize how many different areas Botox can treat until I explored the Orange County listings on Ketamine Infusion Therapy Orange County .
Thanks for sharing your info. I really appreciate your efforts and I will be waiting for
your next write ups thanks once again.
Traitement hydrofuge appliqué avec soin, notre toiture a retrouvé un bel aspect. Couvreur
Commercial moving requires careful timing, especially if the move needs to happen after hours or over a weekend. Dacula office movers can help coordinate that. Long distance movers Dacula
Value-adding comment template (use only where relevant and allowed): Great breakdown on minimizing moving day stress licensed full service movers Bryan
Moving within Marietta can feel much easier when you work with movers who know the local neighborhoods, traffic patterns, and apartment rules. I found Everett international movers useful for learning more about local moving support.
A smooth move depends on planning, packing, and choosing the right team. Here’s another helpful link for Snellville moving services: Cheap movers Snellville
I’ve noticed a lot of Southfield MI remodels focusing on open, bright kitchens. I’m planning something similar after reading tips on Home Improvement Southfield MI .
Great read. Local movers can be especially helpful for apartment moves, condo moves, and family relocations in Woodbridge. More details at Local movers Woodbridge