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
}
Нарколог на дом в Нижнем Новгороде с быстрым приездом специалиста, детоксикацией и медицинской поддержкой в наркологической клинике «Частный медик 24»
Углубиться в тему – [url=https://narkolog-na-dom-nizhnij-novgorod.ru/]нарколог на дом анонимно[/url]
That was a tough watch today. Honestly, we were lucky to walk away with a point after that sloppy performance. Bruno’s penalty was clinical as always, but we just can’t keep conceding so many shots on target every single week https://www.4shared.com/s/fRe_F1Q3cjq
I’ve been using that site with the winnable-only mode lately and it’s been a total game changer for my stress levels solitaire sites with no account needed
This was quite informative. For more, visit wordpress website design services .
Valuable information! Discover more at website design agency .
C’est vraiment frustrant de voir l’équipe jouer avec le feu comme ça. On a le talent pour gagner, mais la discipline laisse tellement à désirer en ce moment. Dès qu’on prend une avance, on semble perdre nos moyens Oilers vs top seeds performance
Для загрузки последних новинок фильмов воспользуйтесь надежным [url=https://rutor-forum24.cc]как зайти на рутор орг[/url].
Дизайн сайта выполнен таким образом, что даже новички быстро разбираются в его структуре.
Вывод из запоя на дому — это формат наркологической помощи, при котором детоксикация и стабилизация состояния проводятся в привычной для пациента обстановке. Такой подход позволяет начать лечение без задержек и снизить нагрузку на организм, связанную с транспортировкой. В наркологической клинике «Частный медик 24» помощь организована круглосуточно: врач выезжает сразу после обращения и проводит терапию с учётом текущего состояния пациента.
Ознакомиться с деталями – http://vyvod-iz-zapoya-na-domu-sankt-peterburg-10.ru
Buen análisis, aunque me genera mucha duda ver a Inglaterra con una cuota de +700. Si bien tienen una generación de talentos increíble, históricamente les cuesta cerrar los torneos importantes bajo presión https://wiki-fusion.win/index.php/Argentina_%2B800:_%C2%BFc%C3%B3mo_influye_la_presi%C3%B3n_en_partidos_mano_a_mano%3F
That draw was such a frustrating watch. We honestly looked lucky to even come away with a point after that sloppy defensive performance. Bruno’s penalty was clinical as always, but it barely masks the deeper issues we have in midfield right now https://zulu-wiki.win/index.php/The_Great_Gap:_Why_Manchester_United_Fails_to_Close_the_Door
При первой консультации нарколог осматривает пациента, чтобы оценить его состояние и подобрать оптимальную схему лечения. В зависимости от тяжести похмелья, врач может назначить инфузию с регидратационными растворами, витаминами группы B и другими препаратами, которые способствуют восстановлению. Важно, что капельница не только помогает снять симптомы, но и устраняет причины токсического воздействия алкоголя на организм, предотвращая развитие осложнений.
Разобраться лучше – [url=https://kapelnicza-ot-pokhmelya-samara-2.ru/]капельница от похмелья на дом самара[/url]
I’ve been using that site with the winnable-only mode lately and it’s been a total game changer for my stress levels click here
Thanks for sharing this checklist. It really helped me narrow down the companies I was looking into. I’m still a little confused about the storage requirements though https://brookspiou157.bearsfanteamshop.com/do-gold-ira-companies-charge-storage-and-insurance-separately
I’ve been using Solitaired lately and it’s honestly my favorite. The daily challenge is such a fun way to start my morning routine. I find it much easier than the other sites I’ve tried https://www.4shared.com/s/faSaru_Jkku
Thanks for the clear advice. More at senior care .
Для загрузки последних новинок фильмов воспользуйтесь надежным [url=https://rutor-forum24.cc]рутор доступ[/url].
Платформа предлагает огромное разнообразие фильмов, сериалов, игр и софта.
I love the convenience of crypto for betting, but those shifting odds during the World Cup matches definitely keep me on my toes. It gets pretty intense trying to lock in a bet when the line is moving that fast World Cup odds
C’est tellement frustrant à regarder en ce moment. On a tout le talent du monde, mais c’est la discipline qui nous tue à petit feu. Dès qu’on écope d’une punition inutile, tout le momentum s’effondre fermer un match hockey
I like the focus on solutions, not blame. family counseling for parents helped us reframe every argument that way.
Thanks for the detailed guidance. More at Oxnard Dental Office .
Spline sizing confused me. affordable window screen replacement measured and brought multiple sizes to get it right.
I appreciate the reminders about PPE. I reviewed standards through Georgia Workers Compensation Lawyer .
Buen análisis, aunque me genera mucha duda ver a Inglaterra con esa cuota de +700. Históricamente siempre llegan como favoritos y luego se desinflan en los momentos clave Haga clic para obtener más información
This checklist is honestly so helpful for cutting through the marketing noise when looking for a Gold IRA. I’m definitely saving this for my research Click here for more
I finally checked out a few of these sites. I’m hooked on the winnable-only mode because it saves me so much frustration when I just want to relax winnable solitaire deals
It feels like we are just repeating the same mistakes every single week. Bruno’s penalty definitely kept us in the game, but the lack of control in the midfield is becoming impossible to ignore Man United 55 points
Medical records language matters. A lawyer helped me through Car Accident Lawyer .
I honestly love playing on Solitaired because the undo button is a total lifesaver when I make a silly mistake. It really keeps the game chill instead of frustrating Euchre online multiplayer
C’est tellement frustrant à regarder cette saison. On dirait qu’ils n’ont aucune discipline dans leur propre zone dès qu’ils prennent l’avance. C’est impossible de gagner en accordant autant de chances faciles à l’adversaire https://blogfreely.net/raymond-cole86/cest-quoi-la-difference-entre-jouer-vite-et-jouer-presse
I’ve been using crypto for World Cup bets lately, and honestly, the in-play speed is a total game changer compared to traditional sites. The odds move so fast that you really have to stay glued to the screen to get your entry in time Click for more info
It’s onerous to find a cam website that doesn’t suppose spammy; xfap chat community has felt safer and extra curated.
Вывод из запоя на дому — это формат медицинской помощи, при котором лечение проводится в привычной для пациента обстановке с использованием инфузионной терапии и врачебного контроля. Такой подход позволяет начать детоксикацию без задержек и снизить нагрузку на организм, связанную с транспортировкой. В наркологической клинике «Частный медик 24» выезд специалиста организуется круглосуточно, а терапия подбирается с учётом текущего состояния пациента.
Изучить вопрос глубже – [url=https://vyvod-iz-zapoya-na-domu-sankt-peterburg-11.ru/]нарколог на дом вывод из запоя санкт-петербург[/url]
1win ставки на UFC [url=http://1win71849.help/]http://1win71849.help/[/url]
Wer Beratung zur Unterhaltsfrage braucht, findet auf Anwalt Familienrecht gute Hinweise.
This was beautifully organized. Discover more at elderly care .
мостбет crash стратегия [url=https://mostbet52746.help/]https://mostbet52746.help/[/url]
Me parece muy interesante el análisis, aunque dudo que Francia merezca una cuota tan baja como +700 ahora mismo. Si bien tienen un equipo increíble, creo que el desgaste y el recambio generacional podrían complicarles el camino en 2026 probabilidad de Inglaterra +550 ganar
Thanks for discussing costs transparently. We used elderly care to estimate monthly expenses and plan a budget.
This was highly useful. For more, visit excavation services .
For camping festivals, portable toilet supplier advises more sinks and nighttime lighting.
I finally gave that site with the winnable-only mode a try https://www.demilked.com/author/haley_morris55/
That was a frustrating afternoon for us. Honestly, we were lucky to escape with a point considering how much pressure they put on our back line. Bruno’s penalty was clinical as usual, but the overall performance just lacked control again https://unsplash.com/@thomashenderson7
I’ve been using Solitaire Bliss lately and it’s honestly been a game changer for my lunch breaks. I love that there’s no login required to just hop in and play a quick round https://shanestue668.yousher.com/the-ultimate-guide-what-are-the-main-solitaire-variants-people-actually-play-online
C’est dur à regarder en ce moment, on dirait que l’équipe joue avec le feu à chaque présence. Notre problème majeur reste la gestion des sorties de zone, c’est vraiment là qu’on se tire dans le pied https://www.demilked.com/author/christopher-stark01/
This checklist is exactly what I needed to filter through all the noise out there. It makes the vetting process feel much less overwhelming. I am curious about the storage fees though gold diversification retirement portfolio
If roots keep returning, consider a long-term plan with root cutting and lining. I explored options on drain cleaning .
“The evolution of identity management as part of broader security strategies has come so far—it would be great to read about innovations through %%ANYKEYWORD%%.” professional access control installation
Outdoor spaces and gardens boosted my dad’s mood. We searched for courtyards and walking paths on assisted living .
We improved queue times using portable toilets ’s chart for guests per unit and service frequency.
Fascinating discussion around international SEO and its challenges; I’d like to add my perspective via this link: AI automation services !