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
}
мелбет лимиты вывода [url=melbet94130.help]melbet94130.help[/url]
Avoid repair shops suggested by insurers without research. Guide at Car Accident Attorney .
Hmm is anyone else experiencing problems with the images on this blog loading? I’m trying to figure out if its a problem on my end or if it’s the blog. Any feed-back would be greatly appreciated.
Pirate Gold
I found certified technicians for torsion spring repair near me using broken garage door spring houston .
For gentle detox support, London Ontario options at functional medicine london ontario focus on realistic habits.
vavada aviator mobilno [url=https://vavada2008.help/]https://vavada2008.help/[/url]
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
германия 2 я бундеслига читайте подробнее про ставки и букмекеров на bkradar.com
1win пополнение через терминал [url=http://1win68503.help/]http://1win68503.help/[/url]
I acquired a unfastened moment opinion on a massive restoration via AC repair Hamilton Canadian Heating and Air Conditioning Inc. and saved dollars.
The laundry circuit requirements were explained well; I checked them on licensed electrical services Baton Rouge .
Perfecto para emergencias nocturnas y fines de semana. Más en cerrajero comercial
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
спаэри читайте подробнее про ставки и букмекеров на bkradar.com
Наркологическая клиника «ТагилМед Реал» — это круглосуточная команда врачей, психологов и координаторов, которая берёт на себя полный цикл помощи при алкогольной и наркотической зависимости: от экстренной стабилизации и капельниц на дому до амбулаторного сопровождения, кодирования и длительной психотерапевтической поддержки. Мы работаем без выходных, используем портативное оборудование, придерживаемся принципов доказательной медицины и внимательно относимся к конфиденциальности: нейтральные формулировки в документах, немаркированный транспорт, разграниченный доступ к медицинским данным и единый доверенный контакт для семьи.
Детальнее – http://narkologicheskaya-klinika-nizhnij-tagil0.ru
Sunwin nhà cái uy tín cá cược online có nhiều trò chơi, tham gia trên sunwin .
Thanks for the tips. For affordable 24 hour locksmith services, I trust locksmith .
For wood furniture, trusted cleaning company Sarasota used the right polish and technique.
aviator game login [url=http://aviator67093.help/]http://aviator67093.help/[/url]
Bankroll percentage rules are now widely cited in the veteran scene.
Публикация предлагает читателю не просто информацию, а инструменты для анализа и саморазвития. Мы стимулируем критическое мышление, предлагая различные точки зрения и призывая к самостоятельному поиску решений.
Погрузиться в детали – [url=https://rak-onkologiya.ru/trudnosti-s-dyhaniem-i-otek-slizistyh/]вывод из запоя стоимость[/url]
Решение о помещении пациента в стационар принимается на основе объективных медицинских критериев, а не только по желанию родственников. К показаниям относятся: запой длительностью более 72 часов, выраженная абстиненция с тахикардией, артериальной гипертензией, профузным потоотделением, наличие в анамнезе алкогольных делириев или судорожных эпизодов, сопутствующие хронические заболевания печени, сердца, поджелудочной железы. В сложные ситуации, когда интоксикация затрагивает несколько систем одновременно, резкое прекращение употребления без медицинской поддержки может спровоцировать отек мозга, острую сердечную недостаточность или желудочно-кишечное кровотечение. При сочетанных расстройствах, когда в анамнезе присутствует наркомании, протоколы адаптируются под специфику психоактивных соединений и включают усиленный нейрологический контроль. Стационар позволяет провести полноценную диагностику, включая ЭКГ, экспресс-анализы крови, УЗИ внутренних органов и мониторинг сатурации, что формирует точную картину состояния и исключает шаблонные назначения.
Узнать больше – [url=https://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-18.ru/]вывод из запоя в стационаре[/url]
The pickup from my Albany apartment complex was easy to coordinate using door to door Albany auto shipping .
Bike rental and towing costs add up. A motorcycle accident lawyer from car accident lawyer included them in damages.
Interesting breakdown of film types—static cling, dyed, metalized—and where each shines in homes or storefronts. For readers considering a retrofit, the link at home privacy tint might be worth a look.
I found this very helpful. For additional info, visit dietas personalizadas .
Đội ngũ hỗ trợ 24/7 của TAI XIU GO88 rất nhiệt tình và chuyên nghiệp.
Môi trường chơi tại Sunwin chuyên nghiệp và minh bạch, thông tin ở sunwin
чӣ тавр барориш дар melbet [url=http://melbet39704.help]http://melbet39704.help[/url]
Tournament leaderboards on Fortune Dragon are filled with steady-volume players.
Anyone know if emergency plumber southampton pa handles unvented cylinder installs in Southampton?
Medical coding affects claim value. Explainer at Truck Accident Lawyer .
This was quite enlightening. Check out catálogo ferretería for more.
Me salvaron en una urgencia; muy profesionales. Contacto: cerrajero económico
vavada promjena valute [url=https://vavada2008.help]https://vavada2008.help[/url]
http://creationdesite-parici.fr/
Le projet Creationdesite Parici se positionne comme une agence specialisee orientee vers le tissu economique francais, qui delivre une approche complete a ses clients, avec un accent sur la confiance et la transparence. Visitez le site ici.
For concrete-only loads, flat-rate options on same day roll off dumpster rental services saved me money.
1win моментальный вывод [url=https://www.1win68503.help]https://www.1win68503.help[/url]
Love the expert picks! The insights on private beaches and sunset views helped me decide—thanks, and I’ll reference best Sandals honeymoon resorts .
We swapped to a curbless bathe with linear drain; installer from Renovation Companies Kelowna bought the slope correct.
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
штутгартер киккерс читайте подробнее про ставки и букмекеров на bkradar.com
Microwave sparking? appliance repair calgary defined waveguide duvet cleansing and replacement.
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
барса матчи читайте подробнее про ставки и букмекеров на bkradar.com
My libido improved after addressing stress and pelvic floor—care found in London Ontario on naturopathic practitioner london ontario .
Choosing an experienced Kent accident lawyer can dramatically increase the value of your injury settlement. Kent injury law firm
Very informative. For car lockouts, locksmith has been a lifesaver.
Sump pump maintenance matters; I set up a service plan with affordable plumbing services Irving .
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
эвертон тоттенхэм личные встречи читайте подробнее про ставки и букмекеров на bkradar.com
Предлагаем вашему вниманию интересную справочную статью, в которой собраны ключевые моменты и нюансы по актуальным вопросам. Эта информация будет полезна как для профессионалов, так и для тех, кто только начинает изучать тему. Узнайте ответы на важные вопросы и расширьте свои знания!
Детали по клику – [url=https://chistotainfo.ru/uborka/kak-vernut-uyut-v-dom-i-bodrost-organizmu]нарколога на дом[/url]
her response https://cleanthebit.com/
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
лига чемпионов уефа турнирная таблица читайте подробнее про ставки и букмекеров на bkradar.com
Медицинский процесс в клинике проводится поэтапно, что позволяет стабилизировать состояние пациента и избежать резких нагрузок на организм.
Получить дополнительную информацию – https://vyvod-iz-zapoya-tver0.ru/vyvod-iz-zapoya-tver-na-domu-kruglosutochno