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
}
Confirm weather policies and rescheduling procedures. I used a sample policy from stump grinding .
The article’s pros and cons match our experience. elderly care has a balanced checklist to evaluate both.
В Воронеже услуга «нарколог на дом» востребована прежде всего тогда, когда состояние развивается быстро, а запас сил у пациента почти исчерпан. После нескольких дней употребления человеку бывает трудно даже выйти из квартиры: сохраняются слабость, дрожь, бессонница, тошнота, скачки давления, потливость, раздражительность и ощущение, что без новой дозы алкоголя легче уже не станет. Именно в этот момент домашний выезд специалиста помогает разорвать опасный цикл. Наркологическая помощь начинается там, где человек находится, а не там, куда он в идеале должен был бы доехать.
Ознакомиться с деталями – [url=https://narkolog-na-dom-voronezh-1.ru/]врач нарколог на дом в воронеже[/url]
Eating and nutrition make a substantial distinction. We found aided living with dietician assistance with assisted living .
Electrical rough-in was spotless; additions labeled everything for inspections.
Time estimates should include sorting and loading. The timeline from junk removal was accurate.
Steel stair treads were rusting— surface preparation services blasted and we repainted immediately.
Вывод из запоя на дому с быстрым облегчением — это медицинская процедура, которая проводится в домашних условиях и направлена на устранение симптомов похмелья, нормализацию работы органов, пострадавших от алкоголя, и восстановление общего самочувствия пациента, включая проведение детоксикации. В отличие от стационарного лечения, вывод из запоя на дому предоставляет пациенту возможность пройти лечение анонимно, с возможностью вызова специалиста на дом, что способствует снижению стресса и лучшему восприятию процесса восстановления, при этом учитывается состояние больного, длительность запоя (в том числе несколько дней) и актуальная цена услуг.
Разобраться лучше – [url=https://vyvod-iz-zapoya-na-domu-ekaterinburg-19.ru/]вывод из запоя на дому екатеринбург[/url]
Great job! Find more at Connoly Dental .
Thanks for the detailed post. Find more at Simple Dental .
A nice read about adding riders to home policies — I’ll ask Home insurance about options.
Helpful breakdown of policy features. Found a friendly insurance agency via car insurance that helped me understand options.
Useful tips — insurance agency homewood answered my questions about liability and collision.
Hi everybody, here every person is sharing such know-how, therefore it’s pleasant to read this website, and I used to visit this weblog daily.
Xxx video onlyfans sex video site
I love the emphasis on purpose-driven activities. Simple tasks like folding towels or gardening can boost dignity and mood. We found more activity plans on memory care .
Trench drains across patios stop sheet flow to doors. We had excavation cut and install a low-profile system.
Memory care transitions can be tough. We located an area with a smooth assisted living to memory care path through assisted living .
Never realized how quick the process could be. sell my scrap car for cash Fort Myers in Fort Myers got me cash for my junk car the same day I called.
Решение о помещении пациента в стационар принимается на основе объективных медицинских критериев, а не только по желанию родственников. К показаниям относятся: запой длительностью более 72 часов, выраженная абстиненция с тахикардией, артериальной гипертензией, профузным потоотделением, наличие в анамнезе алкогольных делириев или судорожных эпизодов, сопутствующие хронические заболевания печени, сердца, поджелудочной железы. При отравление продуктами распада этанола, когда интоксикация затрагивает несколько систем одновременно, резкое прекращение употребления без медицинской поддержки может спровоцировать отек мозга, острую сердечную недостаточность или желудочно-кишечное кровотечение. При сочетанных расстройствах, когда в анамнезе присутствует наркомании, протоколы адаптируются под специфику психоактивных соединений и включают усиленный нейрологический контроль. Стационар позволяет провести полноценную диагностику, включая ЭКГ, экспресс-анализы крови и мониторинг сатурации, что формирует точную картину состояния и исключает шаблонные назначения.
Изучить вопрос глубже – [url=https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-20.ru/]вывод из запоя в стационаре анонимно в санкт-петербурге[/url]
This was very enlightening. For more, visit TrueBalance .
Для начала комплексного лечения в наркологической клинике в Краснодаре проводится тщательная диагностика состояния пациента. Врач-нарколог назначает необходимые лабораторные и инструментальные исследования, среди которых общий анализ крови, биохимический анализ, ЭКГ, УЗИ внутренних органов, а также психодиагностические тесты. Такой комплексный подход позволяет выявить сопутствующие заболевания и оценить степень зависимости, что важно для выбора оптимальной терапии.
Получить больше информации – http://narkologicheskaya-klinika-krasnodar0.ru
I found this very interesting. Check out MultiMan Services for more.
I appreciated this post. Check out memory care for more.
We focused on proximity to family. Map tools on senior care made choosing easier.
Thanks for the valuable insights. More at respite care .
קישורים מאינדקסים איכותיים עדיין עובדים אם עושים נכון. מדריך קצר: בניית קישורים איכותיים .
Helpful Munster insurance info — additional agent profiles are on state farm .
I found this very helpful. For additional info, visit mold removal south tampa .
mostbet depozit linki [url=https://mostbet2014.help]https://mostbet2014.help[/url]
Hey! This is my first comment here so I just wanted to give a quick shout out and say I genuinely enjoy reading through your posts. Can you suggest any other blogs/websites/forums that deal with the same subjects? Appreciate it!
Buy viagra here buy cialis on this site
pin-up turnirlər [url=http://pinup73594.help]pin-up turnirlər[/url]
melbet как играть в plinko [url=http://melbet10463.help/]melbet как играть в plinko[/url]
Thanks for sharing your info. I truly appreciate your efforts and I am waiting for your further write ups thank you once again.
Buy viagra here buy cialis on this site
We added a mudroom and pantry— frame to finish delivered great storage solutions.
mostbet пополнение KGS карта [url=https://www.mostbet18374.help]https://www.mostbet18374.help[/url]
melbet ставка на спорт киргизия [url=https://melbet10463.help]https://melbet10463.help[/url]
mostbet как активировать бонус [url=http://mostbet18374.help/]http://mostbet18374.help/[/url]
คิดว่าการลงทุนในอุปกรณ์เหล่านี้จะช่วยเพิ่มมูลค่าให้รถหรือไม่? ### เปลี่ยนไฟหน้ารถยนต์
Gracias por la guía; si buscas cerrajero urgente Barcelona con buena reputación, prueba Barcelona .
What’s up everyone, it’s my first visit at this web site, and post is genuinely fruitful for me, keep up posting such articles or reviews.
casino online nuevo
Thanks for the thorough article. Find more at Power washing services .
For estate cleanouts, sensitivity and discretion matter. I booked a thoughtful crew through junk removal .
Anyone tried wet blasting on wood decks? mobile blasting solutions did ours without raising the grain too much.
Thanks for the helpful article. More like this at Power washing near me .
Особое внимание мы уделяем психологической составляющей. Нарколог на дом в Екатеринбурге в «НЕО+» — это не только физическое очищение, но и работа с мотивацией, разрушение психологических триггеров зависимости. Зависимость разрушает жизнь, поэтому мы предлагаем психотерапевтическое сопровождение. Родственники получают отдельную поддержку: консультации психолога помогают правильно выстроить общение с зависимым человеком и мотивировать его на дальнейшее лечение. Реабилитация может проходить амбулаторно или в стационаре партнёрских центров с комфортабельными условиями, где пациенты находятся под круглосуточным наблюдением.
Подробнее можно узнать тут – http://narkolog-na-dom-ekaterinburg-1.ru
This is useful for first-time buyers; Insurance agency helped me find an insurance agency near me.
Make sure they provide a clear pruning objective—health, safety, or clearance. Good examples are on tree trimming .
Thanks for the helpful article. More like this at Connelly Dental .
Hi there to all, because I am really eager of reading this blog’s post to be updated daily. It consists of nice material.
buy cannabis online for xxx adult porn video
Thanks for the great explanation. More info at payday loans new braunfels .