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
}
Anyone ship a non-running car in Dallas? Wondering about winch fees with Dallas vehicle shippers reviews .
What’s a fair price Phoenix to Bay Area this month for open carrier? I’m tracking market averages via Phoenix car transportation services .
I like your take on integrated methods; weed control company cost combines mechanical, cultural, and chemical controls effectively.
If your Albany car transport was delayed, try scheduling flexible dates on Albany car transportation services to save money.
Kısa ve doğal mesaj şablonları arayanlara Diyarbakır escort fiyatları pratik örnekler sunuyor, kopyala-yapıştır gibi durmuyor.
The most consistent moving company unquestionably goes to Jaguar Moving, the very best moving company in St Augustine. moving company
Top rated movers in Jacksonville fl definitely goes to Jaguar Moving, the most effective movers near me in Jacksonville. movers in jacksonville
Our commercial property got reliable grease trap and septic service through septic tank cleaning service .
Packing fragile artwork for a Springfield bungalow? The crating service I used is listed at Jacksonville apartment movers .
Good note on sediment buildup. I booked a flush with water heater repair in Chicago and my Chicago home got hotter water faster.
I’ve attempted a number of neighborhood companies, and McGee and Sons Services is hands-down the best pressure washer in World Golf Village pressure washing st augustine
I’ve got an older house with drafty walls and attic. Looking at spray foam solutions, and Spray Foam Insulation Conway SC seems like a reliable local option.
Quality service whenever with SI Service Group! They’re unquestionably the very best ac repair in Tupelo.
Had them out last week and the techs were punctual, professional, and had my system cooling fast ac repair
Relocating from Austin to Chicago; do carriers prefer I-55 or I-57 for faster delivery? Got route info from local Chicago car moving companies .
החזרנו שליטה על ההוצאות החודשיות. פרטים ב- ייעוץ להבראה כלכלית
Excellent service whenever with SI Service Group! They’re certainly the very best Electrical expert in Tupelo. If you’re searching for dependable pros who turn up on schedule, communicate clearly, and get it right the very first time, this is the group electrician near me
Polynesian Fire Luau Orlando spring break family entertainment
Perfect spring break activity – Polynesian Fire gave our family a completely different Orlando experience from the parks Dinner Show Orlando
The focus on emergency response capabilities in each type of setting is reassuring. I compared call systems, staff training, and response times using tools on respite care when picking a place for my grandmother.
The inclusions about dining options and special diets in different settings are very useful. Nutrition matters a lot as we age. I recall seeing detailed meal plan examples on elderly care that matched the distinctions you describe.
Understanding levels of care upfront makes such a difference. We stress this in our own checklists on assisted living as well.
For fencing projects, a 10-yard bin works well—grab quotes at roll off dumpster service Scottsdale, AZ .
Your discussion of timelines is useful. We learned from residential painting denver that proper repair and curing can take several days, so rushing is a red flag when interviewing contractors.
Эта публикация содержит ценные советы и рекомендации по избавлению от зависимости. Мы обсуждаем различные стратегии, которые могут помочь в процессе выздоровления и важность обращения за помощью. Читатели смогут использовать полученные знания для улучшения своего состояния.
Расширить кругозор по теме – [url=https://catsway.ru/stress-v-dome/]частный нарколог на дом[/url]
The detail about how video camera inspection finds root intrusion was helpful. I suspect that’s my issue and will be asking Drain Cleaning to verify.
Читатели получат представление о том, как современные технологии влияют на развитие медицины. Обсуждаются новые методы лечения, персонализированный подход и роль цифровых решений в повышении качества медицинских услуг.
Хочу знать больше – [url=https://coream.ru/opasnyj-farvater-pochemu-alkogol-vo-vremya-otdyha-na-vode-privodit-k-ekstrennoj-gospitalizatsii]нарколог на дом круглосуточно воронеж цены[/url]
For mixed couples, split-level care is tricky. assisted living showed communities that can accommodate both partners.
Verify they protect baseboards from splashes during tile cleaning. I checked photos on st george carpet cleaners .
Thanks for the useful post. More like this at alojamiento en complejo cerca de Costa da Morte .
Çizgi roman uyarlamasında karakter gelişimi sonunda rayına oturdu. İnceleme: Diyarbakır escort contact
I’ll be sharing this guide with clients and including it as a recommended resource on elderly care .
Your recommendation to review state inspection reports is invaluable. We direct people to those reports from respite care frequently.
Этот обзор медицинских исследований собрал самое важное из последних публикаций в области медицины. Мы проанализировали ключевые находки и представили их в доступной форме, чтобы читатели могли легко ориентироваться в актуальных темах. Этот материал станет отличным подспорьем для изучения медицины.
Дополнительно читайте здесь – [url=https://wdorogu.ru/chto-takoe-pohmele-i-kak-ego-lechit/]клиника плюс[/url]
The note about clearly understanding discharge policies is critical. I’ll reference this on my legal and rights section at elderly care .
Many caregivers are anxious about overplacing or underplacing their loved ones. Your explanations, plus decision tools like those on respite care , can really ease that stress.
If your Austin street is narrow, plan a nearby lot for unloading. Austin car shipping companies advised me to use a grocery store lot with permission.
Great call on keeping records for property resale. Our documented maintenance from commercial septic maintenance impressed buyers.
I recommend taking photos at pickup and delivery. I did this with my Cary shipment through open car shipping Cary and it kept everything clear.
Hỗ trợ ngôn ngữ và thanh toán địa phương ở đăng nhập rikbet rất tốt.
Do you handle commercial accounts for recurring construction scrap on US-41? We’re ready to set weekly pickups—starting the process via bulk container Lehigh Acres now.
Excellent point about documenting service dates. I keep a logbook template I downloaded from septic pumping company .
Is it normal to pay the driver on delivery in Pittsburgh? I saw COD and card options listed on top auto shippers Pittsburgh .
Các phương thức thanh toán quốc tế hỗ trợ tốt tại Gem88, xem danh sách ở gem88
My cat shredded our screens. Pet mesh from window screen fixes solved it—no more claw holes.
Another benefit of smaller homes is easier communication with staff; you actually know who’s helping with your loved one’s daily care. That’s why I like what I’m seeing from assisted living .
If you’re hunting for reliable used auto parts in Naples, FL, make sure to cross-check part numbers—saved me a headache. I ended up finding a perfect match at cash for junk cars lehigh acres fl .
http://iltr.fr/
Iltr est une agence specialisee orientee vers le marche francais, qui propose un accompagnement professionnel a ses clients, en valorisant sur l’excellence du service. En savoir plus via le lien.
הפוסט עזר לי להבין איפה להתחיל. פניתי ל- איחוד הלוואות למשכנתא וקיבלתי פגישת ייעוץ ראשונית.
For energy rebates, door hardware supplier advised us on qualifying doors in Houston.
The most top tier moving company unquestionably goes to Jaguar Moving, the very best moving company near me in St Johns County. moving company jacksonville f
Top tier movers in Jacksonville fl hands down goes to Jaguar Moving, the most effective movers in Jacksonville in St Augustine. movers in jacksonville