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
}
mostbet ofisial sayt [url=https://mostbet91372.help]mostbet ofisial sayt[/url]
В данной статье мы акцентируем внимание на важности поддержки в процессе выздоровления. Мы обсудим, как друзья, семья и профессионалы могут помочь тем, кто сталкивается с зависимостями. Читатели получат практические советы, как поддерживать близких на пути к новой жизни.
Получить дополнительные сведения – [url=https://womanfan.ru/trevozhnye-priznaki-alkogolnoy-intoksikatsii-kogda-pora-spasat-blizkogo-cheloveka/]капельница от запоя клиника[/url]
Every situation is unique; ensure your legal representation aligns with your needs by exploring options at # small business lawyer maryland # today!
Pathways really guide the eye. We used gravel ideas from landscapers denver for a natural look.
Love the earlier/after pics. For Denver house owners, do not forget dustless sanding. I had mine finished with the aid of wood floor refinishing Denver and fresh-up was once minimum.
If you’re moving from Hugo to the suburbs, ask about shuttle fees and access issues; I learned that tip on Hugo long haul movers .
Orange County has some amazing facilities focusing on regenerative medicine. Check out Platelet-rich plasma therapy orange county for more info!
install 1win app [url=https://1win5743.help/]https://1win5743.help/[/url]
Players who entered with a closed plan exited more stable at end of day.
mostbet вывод KGS на карту [url=mostbet71852.help]mostbet71852.help[/url]
That matte end hides footprints properly. Found same finishes at flooring showroom Charleston in Charleston.
The extensive planks make the room think larger. Charleston citizens can take a look at widths at flooring shop Charleston .
1win language settings [url=https://1win5743.help]https://1win5743.help[/url]
mostbet кэшбэк казино [url=http://mostbet71852.help]mostbet кэшбэк казино[/url]
“Fantastic customer service from ### any Keyword###—definitely will use them again!” septic pumping service san dimas
Thanks for the helpful article. More like this at Denver Regenerative Med Clinic .
This post is full of great advice for Southfield MI residents looking to remodel. Don’t miss out on more ideas at Window installation Southfield MI !
Great tutorial on installing a new P-trap. More how-tos at local plumbers near me .
мостбет промокод при регистрации [url=mostbet73481.help]мостбет промокод при регистрации[/url]
В этом обзоре представлены различные методы избавления от зависимости, включая терапевтические и психологические подходы. Мы сравниваем их эффективность и предоставляем рекомендации для тех, кто хочет вернуться к трезвой жизни. Читатели смогут найти информацию о реабилитационных центрах и поддерживающих группах.
Изучить вопрос глубже – [url=https://pizzarezept.ru/vecherinka-bez-tyazhelyx-posledstvij-iskusstvo-sochetaniya-piccy-i-napitkov/]стоимость капельницы в нижнем новгороде[/url]
Commercial solar is not just a trend; it’s becoming a necessity for forward-thinking companies! EV charging station installation company
I love how hosting meetings aboard yachts creates such intimate settings; it’s ideal for effective collaboration, especially here around beautiful waters like those found through holiday light yacht charters newport beach
[url=https://geo-prodvizhenie-sajta.ru]Гео продвижение сайта[/url] через Яндекс.Бизнес — как правильно всё настроить с нуля?
мебель из массива дерева
I’m on the lookout for reviews on different Woodland Hills ### anykeyword###s—help, please! Woodland Hills kitchen Remodeling
melbet cashback [url=http://melbet74825.help/]melbet cashback[/url]
Этот обзор предлагает структурированное изложение информации по актуальным вопросам. Материал подан так, чтобы даже новичок мог быстро освоиться в теме и начать использовать полученные знания в практике.
Погрузиться в научную дискуссию – [url=https://sko.com.ru/2026/04/16/anonimnaya-narkologicheskaya-pomosch-kak-sohranit-reputatsiyu-i-poluchit-lechenie/]нарколог на дом екатеринбург[/url]
Thank you a lot for sharing this with all folks you actually realize what you are talking approximately! Bookmarked. Please also consult with my web site =). We can have a hyperlink change agreement among us
This was beautifully organized. Discover more at Beverly Hills Emergency Dental Group .
Этот увлекательный информационный материал подарит вам массу новых знаний и ярких эмоций. Мы собрали для вас интересные факты и сведения, которые обогатят ваш опыт. Откройте для себя увлекательный мир информации и насладитесь процессом изучения!
Лучшее решение — прямо здесь – [url=https://vseparazity.ru/zdorove/toksichnaya-atmosfera-doma-kak-zavisimosti-roditeley-razrushayut-detskuyu-psihiku.html]капельница от похмелья воронеж[/url]
melbet акции [url=melbet74825.help]melbet74825.help[/url]
The diversity of styles and sizes of homes being built in LA truly reflects our vibrant community! Los Angeles kitchen Remodeling
To anyone struggling with persistent aches: don’t hesitate to seek help from local experts featured on ##anyKeyword#! concierge pain doctor scottsdale
Legal jargon can be tough but not when explained by professionals from ## orange county estate planning attorney
Enjoyed reading about the latest trends in cabinetry; very helpful as I plan my own updates—more options await you at Kitchen Remodeling Services In Los Angeles !
This is a solid overview. For a free claim checklist, visit car accident lawyer .
мелбет lucky jet играть [url=http://melbet74825.help]http://melbet74825.help[/url]
For all of us evaluating engineered hardwood features, best flooring store Houston had the first-class moisture-resistant lines in Houston.
http://economia-finanzas.es/
El equipo de Economia Finanzas es una agencia especializada orientada al ambito nacional espanol, que pone a disposicion un acompanamiento profesional a empresas y particulares, con foco en la confianza y la transparencia. Conoce mas aqui.
For high-visitors places in Denver leases, what’s the so much budget-friendly and sturdy selection? flooring store Denver
mostbet login uz [url=http://mostbet91372.help/]http://mostbet91372.help/[/url]
The collaboration between researchers and clinicians in Orange County is paving the way for new treatments—learn more at stem cell therapy orange county !
mostbet pul qaytarish [url=https://www.mostbet91372.help]mostbet pul qaytarish[/url]
Thank you for discussing different types of roofs available—very helpful as I’m considering options with Roofing Services In Illinois
Helpful budget scaling strategies for Meta Ads. Incremental 20% bumps plus creative diversification reduced learning phase resets for us. Playbook here: paid search firm
Our Nocatee new-build had a delayed closing; community movers Nocatee made rescheduling our movers easy.
For a person anxious approximately VOCs, ask approximately water-founded finishes. I did with wood floor refinishing Denver in Denver and the treatment time become extremely good speedy.
I never realized how often I needed to pump my system until I talked to people at water softener repair san dimas !
mostbet karta qo‘shish [url=http://mostbet91372.help/]http://mostbet91372.help/[/url]
We had a tight closing window; Rogers moving company listings helped us secure a hold-over plan with a Rogers mover.