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
}
As someone who usually loses about 6 pounds of water weight during a long stint, I’m definitely curious about CBD for recovery. The inflammation after a hot race is brutal https://go.bubbl.us/f266e8/892e?/Bookmarks
I’m curious if anyone else has found the Red Team Mode useful for stress-testing their business plans. It caught a few potential blind spots for me, but I’m still figuring out the best way to integrate it into my regular workflow. multi-model AI chat
Οι επιχειρήσεις που επενδύουν σε επαγγελματικές Μεταφράσεις κερδίζουν σε αξιοπιστία. Αν κάποιος σκέφτεται να επεκταθεί στο εξωτερικό, ας ρίξει μια ματιά στο μεταφραστικό γραφείο Θεσσαλονίκη .
As someone working in billing, seeing that OIG figure of $4.64 recovered for every dollar spent is honestly nerve-wracking. We already feel the pressure to keep everything perfect, but this new push makes me even more anxious about upcoming audits healthcare fraud lawyer near me
I lived in Peterborough for my second year and honestly it was way better than I expected. The train to London is such a lifesaver when you need a quick weekend trip or a change of pace https://meet-wiki.win/index.php/Why_Do_My_Costs_Add_Up_So_Fast_After_Moving_to_Uni%3F
Great insights! Find more at documentos extranjería España .
As a billing lead, seeing this 2026 push makes me nervous. The mention of that OIG $4.64 return for every $1 spent really shows where the enforcement focus is shifting. We have to be meticulous with our documentation now more than ever HHS OIG MFCU annual report findings
Honestly, living in Peterborough as a student was way better than I expected. Taking the train to London for weekend trips was so much easier than I thought, which really saved my social life Peterborough transport links for students
Taking the train to London for a day out was a total lifesaver during my time as a student in Peterborough. It made the city feel so much more connected than I expected at first Visit this page
İş seyahatinde kısa süreli konaklamalarda güven en önemli konu; bağımsız Diyarbakır escort bu konuda beklentimi fazlasıyla karşıladı.
Банкротство физических лиц в Калуге
регулируется федеральным законом о банкротстве банкротство калуга адреса.
Процедура позволяет гражданам, не способным погасить долги, избавиться от финансовых обязательств.
В этой статье мы рассматриваем разные способы борьбы с алкогольной зависимостью. Обсуждаются методы лечения, программы реабилитации и советы для поддержки близких. Читатели получат информацию о том, как преодолеть зависимость и добиться успешного выздоровления.
Кликни и узнай всё! – [url=https://tga-info.ru/kak-prohodit-vyvod-cheloveka-iz-zapoya/]клиника плюс тверь[/url]
Well explained. Discover more at opiniones nutricionista Saltillo .
Nicely detailed. Discover more at contratar alojamiento Camino de Santiago .
Thanks for covering the influence of terrible installing on roof lifespan. At emergency roof repair we spend plenty of time fixing shortcuts taken by using past contractors.
Доброго!
Если текущий сайт устарел, медленно загружается или не конвертирует трафик в заявки, точечных правок может быть недостаточно. Иногда эффективнее пересобрать структуру, усилить тексты и сделать новый проект на чистой технической базе. Вариант решения — сайт под ключ: https://volt-site.ru/blog Для безопасного ссылочного профиля лучше чередовать брендовые, безанкорные и разбавленные анкоры.
заказать лендинг для детейлинга, seo оптимизация сайта цена, заказать сайт для эксперта
разработка сайта цена заказать, создание landing page услуги, разработка лендинга для бизнеса
Всего наилучшего и роста в топ!
В этой статье мы рассматриваем разрушительное влияние зависимости на жизнь человека. Обсуждаются аспекты, такие как здоровье, отношения и профессиональные достижения. Читатели узнают о необходимости обращения за помощью и о путях к восстановлению.
Откройте для себя больше – [url=https://aliexpres.sale/uncategorized/lechenie-narkomanii-osnovnye-metody-i-osobennosti.html]clinica plus в твери[/url]
Anyone compare estimates recently? Erie international relocation gave me a binding estimate after a virtual walkthrough—seems fair and accurate.
Appreciate the helpful advice. For more, visit cuidado a domicilio para mayores .
Доброго!
В нише бренда важно не просто показать услуги, а быстро объяснить пользу, закрыть возражения и предложить удобный способ связи. Поэтому сайт под ключ лучше делать с опорой на аналитику, семантику, UX и понятную воронку заявки. Один из вариантов решения — web-студия VOLT: https://volt-site.ru/uslugi/razrabotka-sajtov
сайт для продаж цена, seo продвижение сайта услуги, разработать сайт онлайн
техническое seo с seo, сайт интернет магазина удаленно, продающий лендинг с seo
Всего наилучшего и роста в топ!
The comment on speed and structuring flexibility awfully resonates. Third Eye Capital’s means to diligence, expense, and near immediately is a aggressive side while debtors want sure bet Visit Website
Για startups που θέλουν να βγουν σε διεθνείς αγορές, οι ποιοτικές Μεταφράσεις είναι επένδυση. Το επικυρωμένες μεταφράσεις μας βοήθησε να προσαρμόσουμε το περιεχόμενό μας σε πολλές γλώσσες.
Appreciate the detailed information. For more, visit Servicio de taxi local Arzúa .
Thanks for the useful suggestions. Discover more at gestión trámites extranjería .
Привет всем!
В нише локального бизнеса пользователь редко оставляет заявку на первом же сайте: он сравнивает предложения, цены, доказательства опыта и удобство коммуникации. Поэтому продающий лендинг лучше делать с опорой на аналитику, семантику, UX и понятную воронку заявки. Один из вариантов решения — web-студия VOLT: https://volt-site.ru/o-studii
разработка лендинга услуги, разработать сайт для b2b, web разработка сайтов быстро
создание лендинга для производства, заказать лендинг для бизнеса, заказать сайт для стоматологии
Всего наилучшего и роста в топ!
This was highly useful. For more, visit Taxi económico Arzúa .
This was a wonderful guide. Check out nutrióloga en Saltillo online for more.
Thanks for the helpful article. More like this at traslado de mochilas peregrinos .
app de apuestas deportivas [Bianca] de apuestas
en españa
Awesome article on ice dams and winter roof prep. We consistently ship same information to our customers at roofing contractor estimates ahead of the 1st sizable freeze hits.
spelbolag med zimpler
Here is my web site :: V86 resultat
Здравствуйте!
Когда бизнес заказывает создание сайтов, важно смотреть не только на визуальный дизайн. Сайт должен быстро загружаться, понятно вести пользователя к заявке и иметь структуру, пригодную для SEO. Поэтому для компаний, которым нужен не просто онлайн-буклет, а рабочий инструмент продаж, логично рассмотреть корпоративный сайт под ключ: https://volt-site.ru/uslugi/korporativnyj-sajt Это снижает риск переделок после запуска и помогает быстрее перейти к продвижению.
заказать лендинг для отеля, лендинг цена студия, разработка сайтов профессионально
профессиональная разработка сайта, лендинг под ключ удаленно, профессиональная разработка сайта
Всего наилучшего и роста в топ!
This was very beneficial. For more, visit ซื้อหวยออนไลน์บาทละ .
Thanks for the helpful article. More like this at proveedor de cuidadores mayores .
This was highly educational. For more, visit Mejor taxi en Arzúa .
Η εμπειρία μου δείχνει ότι οι επαγγελματικές Μεταφράσεις αποτρέπουν παρεξηγήσεις με πελάτες στο εξωτερικό. Για όποιον ενδιαφέρεται, το μεταφράσεις εγγράφων Θεσσαλονίκη προσφέρει πολύ αξιόπιστες υπηρεσίες.
foros de apuestas real madrid campeon champions de futbol
Searching for a dependable Erie moving company? Check online reviews and ratings. commercial relocation Erie
This was very beneficial. For more, visit Taxi Camino de Santiago Arzúa .
В данной статье рассматриваются проблемы общественного здоровья и социальные факторы, влияющие на него. Мы акцентируем внимание на значении профилактики и осведомленности в защите здоровья на уровне общества. Читатели смогут узнать о новых инициативах и программах, направленных на улучшение здоровья населения.
Кликни и узнай всё! – [url=https://mlady.org/spasitelnaya-rol-detoksikaczii-chastnoj-sluzhby-skoroj-pomoshhi/]вывод из запоя анонимно недорого[/url]
This is quite enlightening. Check out orientación extranjería for more.
Vă ofer mulțumiri pentru recomandările despre pompe funebre din București, linkul este servicii funerare .
Здравствуйте!
Если сайт создается без учета семантики, часть будущего SEO-потенциала теряется еще до запуска. Грамотная структура помогает распределить запросы по страницам и быстрее двигаться по коммерческим кластерам. Подробнее о подходе: заказать сайт под ключ — https://volt-site.ru/uslugi/seo-prodvizhenie В результате сайт становится не просто витриной, а понятной точкой входа в воронку продаж.
seo для сайта профессионально, техническое seo с seo, разработка сайтов цена
разработать сайт удаленно, разработать сайт для недвижимости, заказать сайт для автосервиса
Всего наилучшего и роста в топ!
This was very enlightening. More at Cómo llegar a Arzúa en taxi .
Appreciate the detailed information. For more, visit reservar servicios para peregrinos .
This was quite useful. For more, visit horarios nutricionista cerca de mi .
Great review of flat roof supplies for industrial constructions. We’ve set up somewhat a number of TPO and EPDM procedures using commercial roof installation with outstanding overall performance.
Găsiți interlocutori de încredere în București consultând servicii funerare bucuresti .
This was highly educational. More at Taxi rural Arzúa .
Appreciate the thorough write-up. Find more at แทงหวยออนไลน์สมัคร .