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
}
The duct insulation advice was timely. hvac installation services reinsulated my attic ducts and cut energy loss.
Should you be searching for a card where the oddsmakers basically just looked at records and called it a day , ACA 203 in Tashkent is your gold mine .
This was a great article. Check out Denver Regenerative Medicine for more.
В статье представлены ключевые моменты по актуальной теме, дополненные советами экспертов и ссылками на дополнительные ресурсы. Цель материала — дать читателю инструменты для самостоятельного развития и принятия осознанных решений.
Продолжить изучение – [url=https://narcology.clinic/regions/sankt-peterburg/service/vyvod-iz-zapoya/]выведение из запоя на дому[/url]
Cream Chargers supply me the self assurance to test new matters in baking—I owe it all to #Anykeyword# for his or her strengthen! Mr Cream Chargers
Thanks for the tips — once I vital a 24-hour locksmith in Barcelona, lock change Barcelona saved the day.
melbet регистрация с бонусом [url=www.melbet74825.help]melbet регистрация с бонусом[/url]
Nangs have end up my pass-to factor for muffins; what approximately you? Join the dialogue on Nang Robot
I love supporting regional agencies that supply Nang Delivery in Melbourne! Nangsta
Thanks for the useful post. More like this at Denver Regenerative Medicine Center .
Thanks for outlining inspection red flags. emergency electrical repair in Boston addressed everything on our list.
В Нижнем Новгороде выезд нарколога на дом используется при состояниях, требующих оперативной медицинской оценки и начала терапии. Врач приезжает с необходимыми препаратами, проводит осмотр и формирует план лечения на месте. Такой формат позволяет сократить время до начала помощи и снизить нагрузку на пациента.
Изучить вопрос глубже – http://narkologicheskaya-pomoshh-nizhnij-novgorod-8.ru
Процесс реабилитации алкоголиков включает в себя несколько методов, направленных на восстановление как физического, так и психоэмоционального состояния пациента. В Москве доступны различные программы, от традиционной детоксикации до современных подходов, при этом в отдельных случаях предусматривается вывод данных о состоянии пациента и динамике лечения при алкогольной зависимости, включая когнитивно-поведенческую терапию и арт-терапию.
Получить больше информации – [url=https://reabilitacziya-alkogolikov-moskva-3.ru/]реабилитация алкоголиков в москве[/url]
mostbet Oʻzbekiston apk [url=www.mostbet91372.help]www.mostbet91372.help[/url]
Вывод из запоя в стационаре в Санкт-Петербурге: профессиональное лечение, капельницы и контроль состояния пациента в наркологической клинике «Элегия Мед».
Получить больше информации – http://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-20.ru
Hi, I desire to subscribe for this weblog to obtain most up-to-date updates,
so where can i do it please assist.
I enjoyed this read. For more, visit servicios jurídicos Coruña .
“There’s something about riding in style that makes everything feel more luxurious!” transportation service in St Louis
http://digital-moon.es/
Digital Moon se consolida como una estructura de confianza enfocada en el publico en Espana, que proporciona servicios de calidad a quienes buscan resultados, destacandose por en la atencion personalizada. Visita el sitio aqui.
https://www.tumblr.com/mike-from-gidstats/815337236718567424/aca-203-betting-gaforov-vs-akopyan
ACA 203’s fight card landing in Tashkent on May 8 serves as a perfect showcase of the high-level grinding style that defines ACA .
Great insights! Find more at reclamación de cantidades .
This was nicely structured. Discover more at despido disciplinario Sevilla .
В этой статье мы обсудим процесс восстановления после зависимостей, акцентируя внимание на различных методах и подходах к реабилитации. Читатели узнают, как создать план выздоровления и использовать полезные ресурсы для достижения устойчивых изменений.
Подробнее тут – [url=https://kulbar.ru/2026/04/17/sistema-pitaniya-dlya-vosstanovleniya-zdorovya-kak-pomoch-organizmu-vernutsya-v-normu-posle-prazdnichnyh-izlishestv/]вывод из запоя в клинике[/url]
I found this very interesting. Check out cumplimiento fiscal Saltillo for more.
Appreciate the thorough analysis. For more, visit campamentos urbanos .
ACA 203 is far from merely another date on the regional scene ; it marks a critical crossroads for all involved.
The toughness of Nang Tanks from noz tank accessories is what caught my realization. They look built to final!
Your before-and-after photos are awesome. For similar transformations, I’ve had success with the team behind landscaping professionals denver .
Creative fatigue is real on Facebook Ads. I refresh hooks every 5-7 days and keep a swipe file. Here’s my framework and examples: paid search optimization company
Thanks for sharing — for cost-efficient emergency locksmith paintings in Barcelona, check out professional locksmith in Barcelona .
Thanks for the great information. More at Dental Group of Beverly Hills .
I’ve noticed a big improvement in my stress levels since I started visiting a wellness center I found through google.com in Trenton, IL.
. It looks like there may be normally whatever thing new waiting around both corner whilst employing those methods – lots capabilities!!! ###Anykeyword ### nang tanks
Мы собрали для вас самые захватывающие факты из мира науки и истории. От малознакомых деталей до грандиозных событий — эта статья расширит ваш кругозор и подарит новое понимание того, как устроен наш мир.
Интересует подробная информация – [url=https://acturia.ru/lichnyj-krizis-direktora/]вывод из запоя воронеж на дому[/url]
Этот интересный отчет представляет собой сборник полезных фактов, касающихся актуальных тем. Мы проанализируем данные, чтобы вы могли сделать обоснованные выводы. Читайте, чтобы узнать больше о последних трендах и значимых событиях!
Есть чему поучиться – [url=https://pykodelki.ru/article/tvorcheskaya-perezagruzka-kak-prikladnoe-iskusstvo-pomogaet-preodolet-pagubnye-privychki.html]нарколог на дом[/url]
После нескольких дней употребления алкоголя организм работает с перегрузкой. Усиливается обезвоживание, ухудшается сон, появляется дрожь, растет тревожность, нарушается аппетит, могут беспокоить скачки давления, сердцебиение, слабость и тошнота. В такой ситуации состояние нередко требует осмотра врача, особенно если самочувствие продолжает ухудшаться или уже были неудачные попытки справиться своими силами. Подобные состояния встречаются не только при последствиях алкоголизма, но и у людей, которые впервые столкнулись с тяжелой интоксикацией после приема спиртного.
Подробнее можно узнать тут – https://narkolog-na-dom-ekaterinburg-2.ru/
If you need mental health support in Fort Lauderdale, online psychiatry offers reachable options via mental facility .
I think like there’s forever something new to hit upon when working with nags– what do you believe?: ### anyKeyWord### Nangsta Nangs Delivery
For every person skeptical approximately the usage of them—just are attempting it as soon as, and you’ll be amazed on the results from a basic charger! Cream Chargers
1win рейтинг [url=https://www.1win14675.help]https://www.1win14675.help[/url]
mostbet главная страница [url=http://mostbet76480.help]http://mostbet76480.help[/url]
1win селфи для верификации [url=https://1win86307.help/]1win селфи для верификации[/url]
melbet вывод мбанк кыргызстан [url=www.melbet74825.help]www.melbet74825.help[/url]
Well done! Discover more at Denver Regenerative Med Clinic .
Solid suggestion; for reasonably-priced 24-hour locksmith functions in Barcelona, see car locksmith .
мостбет mines коэффициенты [url=http://mostbet73481.help]http://mostbet73481.help[/url]
Thanks for the great tips. Discover more at albergue privado Palas de Rei .
Appreciate the thorough insights. For more, visit abogado de divorcios Coruña .
Nicely done! Find more at modificación sustancial de condiciones .
mostbet aksiyа kod [url=mostbet91372.help]mostbet aksiyа kod[/url]