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
}
We noticed a couple of presentations in the course of our Myrtle Beach week. The Polynesian Fire Luau become the nice via a significant margin. The authenticity and the fireplace knife finale are in a special type. Dinner show Myrtle Beach
I really struggled with neck tension after long listening sessions until I finally moved my speakers up to ear level. It made such a difference, along with switching to a more supportive chair and actually getting up between album sides click here
Hello there! I just would like to give you a big thumbs up for the excellent information you have here on this
post. I will be coming back to your web site for
more soon.
I learned this the hard way after a surprise private physio bill last winter. It’s so easy to lose track of those small clinic fees. My best takeaway now is to always ask for upfront pricing before booking any appointment https://johnathanrcpw248.wpsuo.com/is-a-high-end-gym-membership-worth-it-if-you-keep-cancelling
It is honestly eye-opening to read about the physical toll these players face in the Scottish game Browse around this site
Острые состояния могут проявляться по-разному: от выраженной слабости, тошноты, тремора и бессонницы до мучительной ломки, резкой тревоги, скачков артериального давления, учащенного сердцебиения, раздражительности и спутанности сознания. У пациентов с хроническими заболеваниями, в пожилом возрасте или после длительного употребления риски возрастают еще сильнее. Особенно опасно ориентироваться только на внешнее впечатление, потому что даже в тех случаях, когда человек находится дома и формально «в сознании», его состояние уже может требовать медицинского вмешательства.
Подробнее – [url=https://narkologicheskaya-pomoshh-voronezh.ru/]клиника наркологической помощи[/url]
It is honestly incredible to see Ronaldo still performing at such a high level at 41. Watching him lead Al Nassr in this title race is pure joy for any football fan. I am really looking forward to the match against Al Ahli on April 29, 2026 Al Nassr vs Al Ahli live
I love this perspective. After chasing so many health trends over the years, I finally realized that simple consistency wins every time. It’s such a relief to stop looking for the next magic pill https://www.protopage.com/miles.wang03#Bookmarks
I’ve been struggling with some real neck tension after long listening sessions lately. Moving my speakers to an ear-level position and finally getting a supportive chair helped a lot. I also started taking short breaks between album sides to stretch out Go to this website
I had a shock at my local private dental clinic when they added extra hygiene charges that weren’t mentioned earlier. Now, I always ask for a clear list of upfront pricing before sitting in the chair. It makes such a difference for my peace of mind Article source
Gracias por compartir estos consejos sobre apertura de puertas Barcelona; añado cerrajero 24 horas como recurso extra.
It’s honestly refreshing to see the club taking such a disciplined approach with these players https://danielwalker9.raindrop.page/bookmarks-70561166
Gute Tipps für hartnäckige Kalkflecken im Bad. Profis wie Endreinigung kennen die Tricks.
Found a Dallas long distance mover with real-time tracking via trusted commercial movers Dallas .
For vehicle transport alongside your Decatur move, best full service movers Decatur lists bundled options.
It is crazy how much the game takes out of these players. Watching them battle on those heavy pitches every week really highlights the grit involved https://atavi.com/share/xtvu8fz1qdvfq
If you were a passenger, you still have rights. Learn more at Car Accident .
Combining skills talents strengths serve greater good striving uplift communities empower individuals transforming lives while creating legacies worth remembering forevermore leaving lasting impressions hearts souls alike shaping narratives told defining Workers Comp Lawyer
It is honestly wild watching Cristiano continue to defy the odds at his age. Seeing him chase another title with Al Nassr is pure entertainment, and I really hope he keeps this momentum going into the 2026 World Cup Saudi Pro League title push
Great reminder to confirm tolls and fuel surcharges— Cumming movers top picks included them in the estimate.
I just bought a classic from a Detroit auction. Looking for careful handling; reviews on top Detroit car moving companies would help.
1win hesab bağlama [url=https://1win81936.help]https://1win81936.help[/url]
I really appreciated this post. I used to get so much neck tension after long listening sessions. Switching to a better chair and moving my speakers up to ear-level made a massive difference Take a look at the site here
I recently got slapped with unexpected private physio fees that really caught me off guard. Now, I always ask for a full breakdown of costs upfront before booking any consultations. It saves so much stress when balancing private care with NHS services Find more info
Strong take on GMB categories. I’m having Phoenix SEO evaluation ours for Phoenix questions this month.
We saw success with before/after galleries for Phoenix home services– setup guide: SEO Phoenix .
“Choosing the right #workerscomp lawyer can mean the difference between success and failure.” Florida Workers Compensation Lawyer
I appreciate that you’re advocating educating oneself around laws connected towards transportation incidents—especially guiding readers towards #Anykeyword#! Car Accident Attorney
Classic car folks in WNY: insist on enclosed and extra insurance. I compared coverage on Buffalo reliable car transport .
If you’re moving art from Snellville, best moving companies Snellville explains valuation and specialty movers.
Attended for the time of our honeymoon and the Polynesian Fire Luau grew to become the nighttime we’ve got mentioned so much seeing that returning dwelling house. The hearth knife finale changed into a second we can not ever put out of your mind. Dinner show Myrtle Beach
1win giriş bərpası [url=http://1win81936.help/]http://1win81936.help/[/url]
Наиболее частыми основаниями для выбора такого формата становятся длительный запой, тяжелое течение похмельного синдрома, выраженный тремор, отсутствие сна, тревога, слабость, обезвоживание и жалобы на сердцебиение. Дополнительное значение имеют хронические заболевания сердца, сосудов, печени и нервной системы, на фоне которых выход из запоя может переноситься тяжелее.
Подробнее – [url=https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-19.ru/]нарколог вывод из запоя в стационаре[/url]
If you need a quick, insured crew this month, check Columbia Heights cross country movers for top-rated Columbia Heights apartment movers.
I have actually been researching various SEO strategies, and I encountered Phoenix SEO. It seems like a video game changer for regional businesses! Phoenix SEO
I appreciate the tips on proper loading. For hassle-free roll-off rentals, I’ve had good luck with roll off dumpster rental scottsdale az pricing .
Settled on call tracking. It’s vital for Phoenix campaigns– application notes: SEO Phoenix .
Family wellness visits to the chiropractor help keep everyone feeling their best. Car accident chiropractor Tacoma
mostbet shikoyat [url=https://www.mostbet38506.help]https://www.mostbet38506.help[/url]
В Санкт-Петербурге услуга вывода из запоя на дому применяется в ситуациях, когда требуется медицинская помощь, но нет показаний к стационарному лечению. Врач проводит консультацию, оценивает состояние пациента, длительность употребления и выраженность симптомов, после чего принимает решение о тактике лечения при алкоголизме. Важно, что терапия начинается сразу после осмотра, а при необходимости можно заранее заказать выезд специалистов.
Ознакомиться с деталями – [url=https://vyvod-iz-zapoya-na-domu-sankt-peterburg-9.ru/]вывод из запоя на дому анонимно[/url]
Have a big yard? ORCA Hydroseeding is a fraction of the cost of sod and delivers long-term results. Hydroseeding services
mostbet mines statistika [url=https://mostbet38506.help]https://mostbet38506.help[/url]
Muy útil la lista de comprobaciones antes de llamar a un cerrajero para apertura de puertas Barcelona. Más en cerrajero .
I like the helpful info you supply to your articles. I will bookmark
your weblog and test once more here regularly. I’m reasonably
certain I will learn many new stuff proper right here! Best of luck for the following!
Highly advise Harland Windows and Siding for window replacement in Raleigh. Local, experienced, straightforward, they usually do nice work. Everything you need in a residence improvement contractor. Window installation Raleigh
Informative. I used ohare limousine for a business trip from O’Hare to Naperville and was impressed.
Thanks for the helpful advice. Discover more at AC Maintenance .
В этой статье-обзоре мы соберем актуальную информацию и интересные факты, которые освещают важные темы. Читатели смогут ознакомиться с различными мнениями и подходами, что позволит им расширить кругозор и глубже понять обсуждаемые вопросы.
А что дальше? – [url=https://malishi.online/stati/schastlivoe-nachalo-zhizni/]вывод из запоя в клинике[/url]
В статье представлены ключевые моменты по актуальной теме, дополненные советами экспертов и ссылками на дополнительные ресурсы. Цель материала — дать читателю инструменты для самостоятельного развития и принятия осознанных решений.
Осуществить глубокий анализ – [url=https://life-sovet.ru/effektivnoe-vosstanovlenie-posle-alkogolnoj-intoksikaczii-ot-domashnih-sredstv-do-nauchnoj-medicziny/]капельница от запоя самара[/url]
Этот информационный материал собраны данные, которые помогут лучше понять текущие тенденции и процессы в различных сферах жизни. Мы предоставляем четкий анализ, графики и примеры, чтобы информация была не только понятной, но и практичной для принятия решений.
Продолжить изучение – [url=https://imalishka.ru/health/vsya-pravda-o-vyezdnoy-narkologii/]вывести из запоя[/url]