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
}
Looking to minimize packing waste—can Best Bayonne movers take back used boxes?
I used Car Accident to ensure my treatment plan matched the injury timeline.
If you’re timing around a home closing in Naperville, Naperville auto shipping helped align pickup and delivery.
Wow, marvelous weblog structure! How lengthy have you been running a blog for? you make running a blog look easy. The overall look of your web site is magnificent, let alone the content!
Snow Party
https://medium.com/@mikefromgidstats/aca-203-fading-the-hype-in-tashkent-cb7a5d329239
If you’re looking for an event where betting lines appear to have been drawn purely from fighter records with little else factored in, then ACA 203 in Tashkent is your jackpot .
Moving from a walk-up in Santa Ana? Fast Santa Ana Mover’s handled our stairs like pros and protected every piece.
Great piece on carbon monoxide and smoke combos. local electrician repair service Boston in Boston installed a hardwired network for us.
Thank you for the good writeup. It in truth was a entertainment account it. Look complicated to more brought agreeable from you! However, how can we keep in touch?
Big Bass Floats My Boat
Appreciate the insightful article. Find more at precio reforma cocina Granada .
Appreciate the thorough insights. For more, visit mamparas de baño de aluminio .
Great job! Find more at Reserva taxi Arzúa .
basketball Wettart Wetten mit
gratis guthaben
This was highly informative. Check out consultas legales Vigo for more.
Thanks for the great tips. Discover more at derecho penal Santiago de Compostela .
1win facebook Uganda [url=www.1win5743.help]www.1win5743.help[/url]
мостбет доступ сегодня [url=https://www.mostbet71852.help]мостбет доступ сегодня[/url]
1win apk file [url=https://1win5743.help/]https://1win5743.help/[/url]
mostbet lucky jet коэффициенты [url=https://mostbet71852.help/]https://mostbet71852.help/[/url]
I’ve been browsing online more than three hours today,
yet I never found any interesting article like yours. It’s pretty worth enough for me.
In my opinion, if all web owners and bloggers made good content as you did, the net will be a lot more useful than ever before.
I found this very interesting. Check out casas rurales para grupos Segovia for more.
Go to our brand page — https://www.finefishing.ru/files/pgs/1xbet_promokod_55.html
Hi there colleagues, nice post and fastidious urging commented at this place, I am actually enjoying by these.
Snow Party
При выводе из запоя на дому с быстрым облегчением используются различные медикаменты, направленные на быстрое восстановление водно-солевого баланса, улучшение функции печени и почек, а также снижение симптомов алкогольного абстинентного синдрома. Важно, что состав препаратов подбирается в зависимости от состояния пациента, и все препараты вводятся под контролем квалифицированного медицинского специалиста.
Выяснить больше – http://vyvod-iz-zapoya-na-domu-ekaterinburg-19.ru/
From a Ontario homeowner lens, trim maintenance matters. I’m in Toronto and this read guides; sustainable landscaping Toronto useful.
UFC ACA 203
This May, the tension within Tashkent’s Humo Arena won’t simply feel heavy from the roar of a supportive hometown crowd; rather, it will hang thick with the professional extinction risk of men who’ve pursued championship gold their entire careers .
ACA 203 isn’t just another stop on the circuit ; it marks a critical crossroads for all involved.
For pet-friendly flooring in Buffalo, I acquired impressive guidance in the community and from flooring store Buffalo —exceedingly suggest either.
naturally like your website however you need to take a look at
the spelling on quite a few of your posts. Many of them are rife
with spelling issues and I to find it very troublesome to tell the truth on the other hand I will surely come back again.
Smart move highlighting audience signals and remarketing. A results-driven PPC agency can stitch this together end-to-end. We’ve relied on paid advertising specialists for that unified approach.
If the other driver refuses to share info, wait for police. Guidance from Pedestrian Accident Attorney kept me calm.
It’s difficult to find educated people for this subject,
but you sound like you know what you’re talking about! Thanks
Great post! It touches on crucial points about why finding an experienced ###WorkersCompLawyer### matters immensely! Auto Accident
Hi there, always i used to check web site posts here early in the daylight, since i love to find out more and more.
Idol Pop Fever
1win купон [url=http://1win56183.help/]http://1win56183.help/[/url]
1win sports withdrawal Uganda [url=http://1win5743.help]1win sports withdrawal Uganda[/url]
1win бонус новичкам [url=http://1win56183.help/]http://1win56183.help/[/url]
Thanks for the useful suggestions. Discover more at albergue de peregrinos Palas de Rei .
mostbet подтвердить аккаунт [url=https://mostbet71852.help]https://mostbet71852.help[/url]
Нарколог на дом в Екатеринбурге: выезд врача на дом, лечение запоя и консультации в наркологической клинике «НЕО+».
Ознакомиться с деталями – [url=https://narkolog-na-dom-ekaterinburg-4.ru/]вызов нарколога на дом в екатеринбурге[/url]
http://jaquealabanca.es/
La empresa Jaquealabanca se presenta como una agencia especializada orientada al ambito nacional espanol, que ofrece servicios de calidad a quienes valoran la eficiencia, con foco en la excelencia del servicio. Descubre todos los detalles en el sitio oficial.
https://telegra.ph/Analyzing-the-Value-at-UAE-Warriors-70-Medkouri-vs-Neves-05-01
UAE Warriors 70, which happens on May 8, 2026, at the Space42 Arena in Abu Dhabi is a perfect example of this.
What a data of un-ambiguity and preserveness of precious knowledge regarding unpredicted emotions.
Idol Pop Fever
I enjoyed this read. For more, visit cocinas Granada .
Thanks for the practical tips. More at reparación de carpintería de aluminio .
Wow, fantastic blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your website is excellent, as well as the content!
Idol Pop Fever
This was highly educational. More at Taxi rural Arzúa .
Thanks for the detailed guidance. More at primera consulta abogados Santiago .
Great summary of commercial plumbing needs. 24/7 crews at plumber in North Richland Hills North Richland HIlls, TX .
This was a fantastic resource. Check out abogado de familia Vigo for more.
When I initially left a comment I appear to have clicked on the -Notify me when new comments
are added- checkbox and now every time a comment is added I get four emails with the exact
same comment. Is there a way you are able to
remove me from that service? Cheers!
Эта информационная заметка предлагает лаконичное и четкое освещение актуальных вопросов. Здесь вы найдете ключевые факты и основную информацию по теме, которые помогут вам сформировать собственное мнение и повысить уровень осведомленности.
Получить исчерпывающие сведения – [url=https://vseparazity.ru/zdorove/effektivnyj-vyvod-iz-zapoya-bez-riskov.html]вывести из запоя воронеж[/url]