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
}
My friends and I came here for a group service before a wedding. They accommodated all four of us at the same time seamlessly. Our nails and toes look flawless, and the staff was so fun to talk to! cheap pedicure near me
Very helpful. Garage Door Repair Mesa AZ swapped my worn rollers with nylon ones—super quiet now. bing.com
Эта информационная публикация освещает широкий спектр тем из мира медицины. Мы предлагаем читателям ясные и понятные объяснения современных заболеваний, методов профилактики и лечения. Информация будет полезна как пациентам, так и медицинским работникам, желающим поддержать уровень своих знаний.
Узнать больше – [url=https://hot-music.org/kapelnicza-ot-pohmelya-bystroe-vosstanovlenie-i-oblegchenie-simptomov/]Кодирование от алкоголизма[/url]
Helpful post! I’m researching metal roofing near me and finding lots of benefits like durability and low maintenance. https://maps.apple.com/place?address=7733+Densmore+Ave%2C+%234%2C+Van+Nuys%2C+CA++91406%2C+United+States&coordinate=34.211358%2C-118.477683&name=Eclipse+Remodeling+%26+Roofing+Inc.#search_location
Эта статья освещает различные аспекты освобождения от зависимости и пути к выздоровлению. Мы обсуждаем важность осознания своей проблемы и обращения за помощью. Читатели получат практические советы о том, как преодолевать трудности и строить новую жизнь без зависимости.
Уточнить детали – [url=https://ladystory.ru/zapoj-u-blizkogo-cheloveka-kak-dejstvovat-zhenshhine-prakticheskoe-rukovodstvo/]нарколог на дом вывод из запоя[/url]
We needed urgent limb removal; emergency tree service Atlanta from Emergency tree removal Atlanta arrived before sunrise.
Don’t wait too long to consult with a car accident lawyer after an accident; time is often of the essence in these cases.
Had a wonderful experience here yesterday afternoon. I was able to get a walk-in service for a pedicure with absolutely no waiting time. The salon is beautifully maintained, offering a very clean and welcoming environment professional manicure 29928
BGN Attorneys works as a car accident lawyer in Pasco focused on practical results for clients. Pasco Personal Injury Attorney
Injuries from accidents can lead to significant medical bills—don’t face it alone! An injury lawyer can help you navigate this situation effectively at Wasilla Car accident Attorney .
Personalized bathing schedules, preferred hygiene products, and familiar routines are easier to honor in a small home setting. That kind of individual attention is what drew me to elderly care .
Your recommendation to review state inspection reports is invaluable. We direct people to those reports from dementia care frequently.
This post clarified the difference between sewer and septic backups. I’m on a septic system and didn’t realize video camera inspection could help. I’ll be reaching out to Drain Cleaning about a septic line inspection.
Insurance and permits can be confusing. We found clear guidance and compliant rental options at bounce house rental , which made the approval process straightforward with our venue.
Great insights on decluttering! If anyone in the area is overwhelmed by garage cleanouts, old furniture, or renovation debris, check out Homepage for fast, affordable Junk Removal Paso services
If you’re dealing with any electrical problems, reach out to the experts at EnglishGideon—they’re fantastic! Electrician in Phoenix AZ
If you prefer a low-renovation domestic in Perrysburg, Ohio, discover synthetic strategies with modern finishes and sturdy resources how manufactured homes are built
The most responsive tree service Atlanta I’ve used came via tree service near me Atlanta .
Roswell readers, a custom closet from Closet organizers Atlanta really boosted our storage capacity.
Thankfulness to my father who shared with me about this web site, this
blog is in fact remarkable.
Found a 24/7 emergency tree service Atlanta on tree service Atlanta that worked directly with our insurance.
The tree cutting service Atlanta we hired via emergency tree service Atlanta handled permits and stump grinding in one visit.
Seasonal tree trimming Atlanta from tree trimming Atlanta improved our curb appeal and lawn sunlight.
Thanks for the clear advice. More at contadores y asesores Saltillo .
For precise tree trimming Atlanta that won’t damage your landscape, I found a great arborist through tree cutting service Atlanta .
For precise tree trimming Atlanta that won’t damage your landscape, I found a great arborist through tree removal Atlanta .
We used tree company near me Atlanta to book tree cutting service Atlanta and got same-day debris haul-away.
Who else has utilized a Property Management Houston for their rental properties? Would love to hear your thoughts!
Practical steps for leash reactivity — see specialists in Virginia Beach at Dog Training Coastal K9 Academy .
Awesome roundup of party ideas! If you want budget-friendly packages that include delivery and setup for bounce houses and water slides, browse bounce house rental —lots of choices for different age groups.
If you need repairs, this water heater repair san jose in San Jose is definitely worth checking out.
Our old maple was diseased; tree removal Atlanta via Emergency tree removal Atlanta included a free arborist assessment.
Efficient and friendly garage door repair in Dallas — big thanks to get a quote .
Доброго!
Vitebsk State University named after P.M. Masherov, one of the oldest universities in Belarus, invites you to get the education of European quality! Undoubted advantages of studying in VSU are affordability, high level of the quality of the educational process, great experience in training foreign students.
Полная информация по ссылке – https://vsu.by/en/university/feedback-graduates.html
еЌљеЈ«з ”з©¶з”џиЇѕзЁ‹, витебск, FACULTY BELARUS
Магистрантура, вторая ступень образования, [url=https://vsu.by/sobytiya/novosti-universiteta.html]Новости машерова университета [/url], benefits for entering university
Удачи и успехов в учебе!
My neighbor recommended an incredible Roofing Company San Antonio in San Antonio, and I’m so glad I took their advice!
“The insights shared by the team at ### anyKeyWord ### are invaluable; truly experts!” best SEO company in Mesa AZ
Thank you! Hoping to find a reputable plumber in Sandpoint ID for emergency pipe bursts. https://www.google.com/maps?cid=4893866206069717073
В данной статье рассматриваются проблемы общественного здоровья и социальные факторы, влияющие на него. Мы акцентируем внимание на значении профилактики и осведомленности в защите здоровья на уровне общества. Читатели смогут узнать о новых инициативах и программах, направленных на улучшение здоровья населения.
Давай разберёмся досконально – [url=https://mmo5.info/zachem-stavyat-kapelniczy-pri-zapoe-i-kak-pravilno-ih-ispolzovat-dlya-vosstanovleniya-zdorovya.html]клиника лечения алкоголизма[/url]
Thank you for outlining how Assisted Living balances support with independence. That middle ground is exactly what many older adults need. I recently visited elderly care and it gave me even more insight into the different types of senior communities.
I’ve noticed that in small homes, meals feel more like family dinners than cafeteria service. That setting really helps with appetite and social interaction. Resources like respite care helped us prioritize this.
Yesterday, while I was at work, my sister stole my iPad and tested to see
if it can survive a 25 foot drop, just so she can be a youtube sensation. My apple ipad is
now destroyed and she has 83 views. I know this is completely off topic but I had
to share it with someone!
Superb timing on that block — I provide Sports Photography Melbourne for volleyball and basketball. Melbourne Sports Photography
Home automation is becoming a trend in remodels—check out how to include it at Home Remodeling .
Crawl space access has made repairs very expensive in the past. The crawl space clean out entry service from Drain Cleaning sounds like a smart long-term upgrade.
The legal process after an injury can be complex. That’s why having an injury lawyer by your side is so important! Find out more at dog bite lawyer .
For anyone planning a school fundraiser, bounce houses plus a water slide rotation kept lines moving and kids happy. We scheduled everything online through bounce house rental and it saved a ton of time.
Этот информационный материал подробно освещает проблему наркозависимости, ее причины и последствия. Мы предлагаем информацию о методах лечения, профилактики и поддерживающих программах. Цель статьи — повысить осведомленность и продвигать идеи о необходимости борьбы с зависимостями.
Интересует подробная информация – [url=https://comicsplanet.ru/kak-proishodit-kodirovanie-ot-alkogolizma.html]вывод из запоя на дому в Костроме[/url]
BGN Attorneys assists Pasco residents by navigating claims as a skilled car accident lawyer. Personal Injury Attorney Near Me
This was very enlightening. For more, visit opiniones pensión Arzúa .
For anyone on the fence, Overhead Door Solutions Built for Business does a great job explaining R-values and insulation types.