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
}
For families out of state, virtual tour links to Gulf Breeze communities on respite care are a lifesaver.
1win slot bonus Azərbaycan [url=https://www.1win19435.help]https://www.1win19435.help[/url]
I appreciated this article. For more, visit Foothills Paving Maintenance .
Appreciate the useful tips. For more, visit TheBud Depot .
1win безопасность [url=http://1win95124.help/]http://1win95124.help/[/url]
TripScan — Надежность путешествий начинается здесь
Планируете поездку и хотите убедиться, что всё пройдёт гладко? Тогда вам нужен TripScan! Это удобный онлайн-сервис, позволяющий проверить наличие ваших билетов и бронировок всего одним кликом.
[url=https://tripc63.cc]tripscan[/url]
¦ Что такое TripScan?
TripScan, также известный как трип скан, представляет собой инновационный инструмент для путешественников. Сервис позволяет быстро сверять ваши бронирования авиабилетов, отелей и арендованных автомобилей с официальными базами данных авиакомпаний и гостиниц.
Просто введите номер вашего билета или бронировки на сайте TripScan. Если информация совпадает, сервис подтвердит вашу бронь, предоставив дополнительную информацию о рейсе или отеле. Это особенно полезно перед длительными путешествиями, когда важно быть уверенным в точности всех деталей.
¦ Как пользоваться TripScan?
Использование сервиса невероятно простое:
1. Перейдите на официальный сайт TripScan (трипскан сайт) и зарегистрируйтесь или войдите в свою учетную запись.
[url=https://tripc63.cc]tripscan top[/url]
2. Выберите тип проверки: авиабилеты, отели или аренда автомобиля.
3. Введите необходимые данные вашей бронировки.
4. Получите мгновенный отчет о статусе вашей брони.
[url=https://tripc63.cc]трипскан сайт[/url]
Это занимает считанные секунды и избавляет вас от стресса и неопределенности.
¦ Почему выбирают TripScan?
Сервис предлагает ряд преимуществ, делающих его незаменимым помощником любого путешественника:
– Быстрая проверка бронирований
– Дополнительная уверенность в поездке
– Удобство и простота использования
– Доступность круглосуточно
Кроме того, TripScan регулярно обновляется, обеспечивая точность предоставляемых данных.
¦ Где найти TripScan?
Чтобы воспользоваться сервисом, посетите официальный сайт TripScan: Здесь вы найдете всю необходимую информацию и сможете начать проверку прямо сейчас!
Также доступна мобильная версия сайта, доступная на смартфонах и планшетах. Просто откройте браузер и перейдите на трипскан сайт.
Для тех, кто хочет больше узнать о сервисе, существует подробная инструкция по использованию, доступная на главной странице.
¦ Заключение
TripScan — это надежный помощник для каждого путешественника. С ним вы можете быть уверены, что ваша поездка пройдет гладко и без неожиданностей. Проверяйте свои билеты и бронировки заранее и наслаждайтесь путешествием!
tripskan
https://tripc63.cc
I love the point about thermal imaging. It helps identify insulation gaps. More on thermal scans at home inspector .
мостбет промокод на бонус [url=https://mostbet09754.help]https://mostbet09754.help[/url]
This was very insightful. Check out assisted living for more.
Hi this is kind of of off topic but I was wondering if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon but have no coding experience so I wanted to get guidance from someone with experience. Any help would be enormously appreciated!
https://share.google/e4BOTOog51mMMFgTT
For Euro automobiles, approvals like LL-01 count; I tested mine at brake service in Greensboro .
Workers’ compensation can be daunting, but having a knowledgeable car accident lawyer helps ease the burden.
Loved the upfront estimate and no surprises—booked our Fair Oaks drain cleaning with Plumbing company Fair Oaks .
From start to finish, my journey with this # anyKeyWord# has been supportive and enlightening.” Pedestrian Accident Attorney
Thanks for shedding light on the importance of personalized treatment plans at local clinics throughout **Dunfermlines** area!! Keep up these informative posts!! # # anyKeyWord# Orthodontics
Just moved to La Jolla and needed a garbage disposal install; scheduled it in two clicks via Plumbing contactors La Jolla .
I’ve seen some amazing themed properties where even the electronic fence fits beautifully into their decor! Gate Automation Rotherham
Существует ряд ситуаций, при которых вызов специалиста на дом является обоснованным решением:
Ознакомиться с деталями – [url=https://narkolog-na-dom-nizhnij-novgorod.ru/]запой нарколог на дом[/url]
sweet bonanza apuesta en vivo [url=https://sweet-bonanza45713.help/]https://sweet-bonanza45713.help/[/url]
мелбет official site [url=http://melbet63047.help]http://melbet63047.help[/url]
melbet depunere cu webmoney [url=melbet89725.help]melbet89725.help[/url]
I’ve finally found my go-to dental clinic in Edinburgh—thanks to Teeth Retainers for being so accommodating.
This is highly informative. Check out assisted living for more.
Your attic fan wiring warnings were helpful. We hired a safe installer through licensed local electrician .
Thanks for the valuable article. More at senior care .
Family members interaction is key. The treatment team we discovered through assisted living gives normal updates and peace of mind.
Slab leaks are a real headache in Moreno Valley clay soils. Non-invasive detection saved my floors—found a solid team via Local plumbers Moreno Valley .
Наркологический стационар в Санкт-Петербурге предоставляет пациентам комплексное лечение зависимости от психоактивных веществ. Проблемы, связанные с алкоголизмом, наркоманией и другими формами зависимости, требуют индивидуального подхода и профессиональной помощи. Комплексное лечение в таких учреждениях позволяет не только пройти детоксикацию, но и получить полноценную реабилитацию, что дает пациентам шанс на долгосрочную ремиссию и улучшение качества жизни. В некоторых случаях, при запое или необходимости выезда на дом, может быть предложен центр, где решаются все вопросы, связанные с лечением зависимости и восстановлением пациента.
Углубиться в тему – [url=https://narkologicheskij-staczionar-sankt-peterburg-1.ru/]наркологический стационар[/url]
I’ve always struggled with acne, and your tips are really helpful! Can’t wait to explore solutions from laser hair removal .
Every story shared about successful restorations encourages others not just locally but across communities worldwide. Floor Restoration
Главная особенность стационара с круглосуточным наблюдением — это постоянное присутствие врачей и медсестёр, готовых оказать помощь в любой момент. Это особенно важно на этапе снятия острых симптомов, когда организм находится в состоянии максимальной интоксикации. Наблюдение за пациентами в условиях стационара позволяет оперативно подбирать необходимые препараты и вмешиваться при первых признаках ухудшения состояния. В результате такого подхода повышается эффективность лечения и снижается риск осложнений, что делает процесс восстановления более быстрым и безопасным.
Детальнее – [url=https://narkologicheskij-staczionar-sankt-peterburg.ru/]частный наркологический стационар[/url]
В таких ситуациях стационарный уход позволяет обеспечить безопасность пациента, эффективно справиться с его состоянием и подготовить его к дальнейшему лечению или реабилитации. В случае алкоголизма может быть назначена капельница для снятия острых симптомов интоксикации, а также лечение в специализированном центре для комплексного восстановления и профилактики рецидивов.
Подробнее тут – [url=https://narkologicheskij-staczionar-sankt-peterburg-2.ru/]наркологическая клиника стационар в санкт-петербурге[/url]
Super efficient post! If all and sundry is on the lookout for a quick blood verify Montreal choice or maybe “prise de sang Montreal” with immediate outcomes, I had a smooth ride booking on line by std testing montreal
Touring multiple communities made a big difference for us. memory care helped create a thorough tour checklist.
If you’re new on the town and looking out “blood verify near me,” I had a glossy revel in booking a fast blood attempt appointment in the town blood test near me
This topic is overwhelming, so thank you. We used memory care to create a shortlist and schedule tours.
Работа с пациентами в наркологическом стационаре начинается с диагностики, которая помогает определить степень зависимости и сопутствующие заболевания. На основе этих данных разрабатывается индивидуальный план лечения. Врачи, наркологи и психотерапевты работают в тесном контакте с пациентом, что позволяет достичь наилучших результатов в процессе восстановления. Важно также убедиться, что клиника имеет необходимую лицензию, а для эффективного лечения могут быть предложены такие процедуры, как прием психотерапевта и кодирование от зависимости.
Получить больше информации – [url=https://narkologicheskij-staczionar-sankt-peterburg-3.ru/]наркологическая клиника стационар[/url]
Wonderful tips! Find more at Walters Bar-B-Que .
1win как вывести на карту [url=http://1win25340.help]1win как вывести на карту[/url]
1вин кыргызча катталуу [url=http://1win43592.help]http://1win43592.help[/url]
Very useful post. For similar content, visit respite care .
This is very insightful. Check out Denver Regenerative Med Clinic for more.
”Creating community-focused events showcasing impressive transformations achieved reinforces positivity surrounding dental health overall!” ## Clear Braces
Clear overview of spoliation letters. Samples at Accident Lawyer .
Great breakdown of structural red flags. A comprehensive check from home inspection is a must.
Nicely detailed. Discover more at Foothills Paving and Maintenance .
В Екатеринбурге выезд нарколога на дом становится необходимостью, когда симптомы похмелья слишком выражены и пациент не может справиться с ними самостоятельно. Алкогольная интоксикация может привести к ряду проблем, таких как головная боль, слабость, тошнота и рвота, а иногда даже к более серьёзным состояниям, таким как аритмия или психоз. Выезд нарколога на дом позволяет быстро начать лечение, не тратя время на дорогу, что особенно важно в экстренных ситуациях.
Разобраться лучше – [url=https://kapelnicza-ot-pokhmelya-ekaterinburg-7.ru/]капельница от похмелья на дому в екатеринбурге[/url]
Awesome article! Discover more at The Winslow NYC .
ufc fight stats
Khamzat Chimaev appears invincible, yet Sean Strickland is so unorthodox and tough that he has the potential to shock everyone, while the remainder of the event includes a stand-up fighter against a submission expert with no losses at 125 pounds, two heavyweight knockout artists with granite chins, a strategic slugfest in the 170-pound division, along with a throwback, all-out brawl featuring two lightweight old-guard fighters, with every single fight built around someone’s perfect plan potentially falling apart.
This consultant hits the spot. I wanted mobilephone-pleasant reserving and clean pricing for STD testing Montreal, plus a fundamental means to set a blod examine appointment devoid of calling around std testing montreal