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
}
Very useful post. For similar content, visit abogado fiscal Coruña .
Dzięki za to zestawienie, bardzo przyda się przy wyborze kolejnych tytułów. Ostatnio ogrywałem Mario Kart 8 Deluxe i muszę przyznać, że obecność polskiego języka w menu bardzo ułatwia życie, nawet przy tak prostej grze https://wool-wiki.win/index.php/Czy_polskie_napisy_na_Switchu_s%C4%85_czytelne_w_trybie_przeno%C5%9Bnym%3F
Echt een top lijstje! Ik speel zelf het liefst Rocket League met vrienden in de avond. Het blijft verslavend, maar die ranked potjes kunnen soms behoorlijk stressvol zijn Spring over naar deze website
This was very beneficial. For more, visit negociación colectiva Sevilla .
Thanks for the useful suggestions. Discover more at contabilidad para pymes Saltillo .
Wat grappig om dit te lezen. Ik kom zelf regelmatig bij Play World en vind de sfeer daar eigenlijk altijd erg prettig vergeleken met andere locaties. De acties die ze daar hebben zijn soms best de moeite waard als je er toch bent https://numberfields.asu.edu/NumberFields/show_user.php?userid=6630795
Leuk artikel zeg. Ik vind die sfeer van Ocean’s Eleven altijd geweldig om te zien, vooral door dat constante heist vibe gevoel in elke scène. Die beelden van de casino’s voelen altijd zo gelikt en bijna dromerig aan https://eduardoscoolchat.bearsfanteamshop.com/waarom-voelt-het-casino-in-uncut-gems-als-een-constante-staat-van-stress
crash мостбет [url=http://mostbet63740.help]crash мостбет[/url]
Danke für den interessanten Ausblick auf 2026. Mich würde besonders interessieren, wie sich die Identitätsprüfung in Zukunft entwickeln wird https://wiki-site.win/index.php/Neue_Online-Casinos_2026:_Warum_gibt_es_pl%C3%B6tzlich_so_viele_Anbieter%3F
Ich nutze bei meinen Jungs mittlerweile regelmäßig eine GPS-Weste im Training, um die Belastung genau zu steuern. Es ist schon Wahnsinn, wie viel man aus den Daten für die Belastungssteuerung rauslesen kann Website
I always prefer using a family-owned Paterson moving company because of their personal touch. Best Paterson movers
Dzięki za to zestawienie, bardzo przydało mi się przy wyborze nowych tytułów. Zaskoczyło mnie, że w Wiedźminie 3 na Switcha napisy po polsku są tak czytelne nawet w trybie przenośnym, co nie zawsze jest standardem w portach na tę konsolę https://www.tumblr.com/fleetingsparktapestry/813691235590111232/gry-na-switch-po-polsku-dla-os%C3%B3b-kt%C3%B3re-chc%C4%85
Bardzo ciekawy artykuł. Przy moich codziennych dojazdach pociągiem do pracy to właśnie podcasty i gry mobilne ratują mi humor. Nie do końca zgadzam się jednak z tezą, że szukamy tylko lekkiej rozrywki, bo często wybieram też ambitne dokumenty Dodatkowe informacje
Has anyone used an Augusta moving company for office moves? I’m curious about the best options for businesses in the area. Augusta international movers
Ostatnio wkręciłem się w Murder Mystery 2 i faktycznie dynamika rozgrywki jest świetna, ale mam problem z szybkim zdobywaniem monet na skrzynki najfajniejsze tryby na roblox 2024
Interessante post! Ik kijk tegenwoordig ook steeds vaker naar xG om de werkelijke kracht van een team te doorgronden in plaats van alleen naar de einduitslag te kijken. Het helpt enorm om het kaf van het koren te scheiden bij het vergelijken van odds Ga naar deze website
Добрый день!
Пуско-наладка автоматизированных систем: нюансы
Пуско-наладка оборудования необходима для проверки корректности работы всех систем. На этом этапе проводится настройка параметров, тестирование под нагрузкой и устранение выявленных отклонений, что гарантирует надежную работу оборудования.
Полная информация по ссылке – https://dagtechservice.ru/contact/
книга монтаж промышленного оборудования, заказать монтаж оборудования, монтаж промышленного оборудования волгоград
пуско наладка и обслуживание оборудования, [url=https://dagtechservice.ru/category/tehnicheskoe-obsluzhivanie/planovoe-to/]Архивы Плановое ТО – Технический сервис[/url], сервисное обслуживание металлургического оборудования
Удачи и комфорта в жизни!
[url=https://www.radionaranj.tn/?p=312#comment-248380]Как внедрить цифровые решения[/url] 16605da
Wat een interessant stuk. Ik ben het helemaal met je eens dat die specifieke sfeer in films essentieel is. Vooral die gouden tinten in de belichting van Casino geven het verhaal echt die luxueuze maar tegelijkertijd benauwende uitstraling GoldenEye Monte Carlo scene
Danke für den informativen Überblick zu den Trends für 2026. Ich finde es gut, dass das Thema Sicherheit und Spielerschutz hier so ausführlich beleuchtet wird https://scarlettsultimatedigest.lucialpiazzale.com/welche-rolle-spielt-die-plattform-stabilitat-bei-neuen-online-casinos
Love these moving tips! I’ll use them when I book my Charlotte moving company soon. Every City Charlott Mover’s
Als Trainer finde ich diese technologische Entwicklung extrem spannend. Besonders die GPS-Westen helfen mir enorm dabei, die Belastung meiner Jungs im Training präzise zu steuern und Verletzungen vorzubeugen https://www.inkitt.com/gregory_price31
Zgadzam się z wyborem Mario Kart 8 Deluxe, to absolutna klasyka, w którą gram z rodziną przy każdej okazji. Szkoda tylko, że wciąż brakuje nam oficjalnego polskiego tłumaczenia menu w systemie, bo ułatwiłoby to rozgrywkę młodszym graczom polska instrukcja do gier switch
Dzięki za ten artykuł, przypomniał mi, jak świetną zabawą jest Murder Mystery 2. Zawsze mam problem z szybkim odkryciem mordercy, kiedy gram jako niewinny https://echo-wiki.win/index.php/Murder_Mystery_2_%E2%80%93_czemu_ka%C5%BCda_runda_jest_inna%3F_Fenomen_nieprzewidywalno%C5%9Bci
Wat goed dat dit artikel eindelijk de verschillen tussen Play World en de rest in kaart brengt. Zelf kom ik eigenlijk altijd bij Play World vanwege de acties en de sfeer die daar hangt https://papaly.com/6/U1Pd
Interessant stuk! Ik gebruik zelf vaak xG-statistieken om te bepalen of een uitslag een incident was of dat er echt meer in zat. Dat geeft vaak een heel ander beeld dan alleen de eindstand op het scorebord https://www.spreaker.com/podcast/nathan-hernandez21–6948447
Zgadzam się z większością wyborów, choć dla mnie nic nie przebije klasycznego singla w starym stylu. Zdecydowanie wolę FPS od TPS, bo immersja jest dla mnie najważniejsza strzelanki z osłonami tps
Nicely done! Find more at pet friendly casas rurales Segovia .
Bardzo ciekawy artykuł. Przy moich codziennych dojazdach pociągiem do pracy często nadrabiam zaległości w serialach, ale nie do końca zgadzam się z tezą, że w 2026 roku gramy tylko w proste gry mobilne http://www.video-bookmark.com/user/isaac_lopez1
melbet retirer gains crash [url=https://melbet57184.help/]https://melbet57184.help/[/url]
Appreciate the comprehensive advice. For more, visit altona meadows family medical clinic .
Danke für den interessanten Ausblick auf die Entwicklungen für 2026. Mich würde besonders interessieren, wie sich die KYC-Prozesse in den nächsten Jahren verändern werden https://orcid.org/0009-0004-2335-401X
Heard a loud pop in the fuse box—glad Macquarie Park NSW 2113, Australia electrical companies offers rapid response.
Dzięki za to zestawienie. Osobiście najwięcej czasu spędzam w Brookhaven RP, bo fajnie się tam odgrywa różne scenariusze, ale ostatnio mam problem z toksycznymi graczami na serwerach roblox jak założyć własny serwer
I’ve had profitable cooperation with Translation agency London on educational conference abstracts in London.
Wat een boeiend artikel! Ik vind vooral die typerende heist vibe in Ocean’s Eleven zo goed neergezet. Het laat perfect zien hoe de sfeer in een casino altijd een beetje mysterieus aanvoelt geluidsontwerp van fiches in film
Świetne zestawienie, dzięki za przygotowanie tego wpisu. Ostatnio ogrywałem Wiedźmina 3 na Switchu i muszę przyznać, że polskie napisy oraz dubbing sprawdzają się tam wyśmienicie, co mocno podnosi komfort rozgrywki https://www.instapaper.com/read/2001736954
Ik speel echt veel te veel Rocket League met m’n vrienden. Het is de ultieme game voor korte sessies als we na het werk even willen ontspannen https://www.livebinders.com/b/3704691?tabid=0cd63347-1856-dd4b-bb54-9d49dca4f201
sportwetten tipps vom profi
Here is my web page … Basketball Wetten VerläNgerung
horse racing results at southwell
Here is my web-site: yesterday greyhounds results
Dzięki za to zestawienie, fajnie było poczytać o różnych trybach. Najwięcej czasu spędzam w Brookhaven RP, ale czasami ciężko tam trafić na sensowną rozgrywkę roblox tryby
Interessanter Ausblick auf die Entwicklungen für 2026. Mich würde bei den neuen Anbietern besonders interessieren, wie sich der Prozess rund um das OASIS-Sperrsystem weiterentwickelt gotha online entertainment
If your roof needs some TLC, I suggest contacting Govee LED Strip Installation for a thorough clean.
I would definitely hire this Erie moving company again for any future moves—they were outstanding! Erie Mover’s
Szczerze mówiąc, ostatnio najwięcej czasu spędzam w Brookhaven RP. To niesamowite, jak bardzo można się tam wczuć w rolę, jeśli trafi się na zgraną grupę graczy najlepsze tryby roblox do pogrania
I recently moved to Puyallup, and I was shocked by how many pests I encountered in my new home! After doing some research on pest control options, I found that local services are crucial for effective solutions emergency Puyallup exterminator
Our HOA needed matching colors. same-day window screen repair mckinney found exact matches and kept us compliant.
For sustainable weight loss with accountability, Melbourne trainers on personal trainer melbourne South Melbourne VIC are great.
мостбет приложение вылетает [url=www.mostbet63740.help]www.mostbet63740.help[/url]
Love these harness recommendations; my walker from dog walking service near me suggested the same.
For Passaic walk-ups, always ask about stair fees and long-carry charges up front. I vetted a few companies via Passaic commercial movers and avoided surprise add-ons.