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
}
1win Azərbaycan region [url=www.1win60278.help]www.1win60278.help[/url]
This information shows the relationship between image and inner power. For professionals, elevating your image pays dividends. wardrobe stylist chicago
Excellent article, We’re in the middle of buying our first home in the Capital Region and you absolutely must use a professional title agency. Our attorney recommended Northway Title in Clifton Park and they handled everything smoothly title insurance clifton park
Incredible how much dust can build up in gutters with time. Wonderful article on this topic! For anybody requiring professional assistance, look no further than dryer vent blockage removal .
An impressive share! I’ve just forwarded this onto a co-worker who has been doing a little homework on this. And he in fact bought me lunch because I found it for him… lol. So allow me to reword this…. Thanks for the meal!! But yeah, thanks for spending some time to talk about this topic here on your web page.
Watch sexual porno video xxx sex adults site
mostbet parolni almashtirish [url=https://mostbet59402.help/]https://mostbet59402.help/[/url]
This was very enlightening. More at Home construction company .
мостбет кг [url=http://mostbet70269.help]http://mostbet70269.help[/url]
This moving day timeline is clear. I align it with the crew schedule from movers in santa cruz ca .
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.
adult xxx video porn site xxx sex video
мостбет free spins [url=http://mostbet70269.help]мостбет free spins[/url]
I appreciated this post. Check out assisted living for more.
1win app ios [url=https://1win59213.help]https://1win59213.help[/url]
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 assisted living .
наркологический стационар [url=https://vyvod-iz-zapoya-na-domu-voronezh-2.ru/]vyvod-iz-zapoya-na-domu-voronezh-2.ru[/url] .
Your lighting layout tips were spot on. I grabbed a lumens-to-room-size chart from electrician Richardson .
Whole-home generator transfer switch guidance is spot on. More examples at licensed electrician repairs Irving .
Looking for a supportive online psychiatrist? Check out the options available in Fort Lauderdale. ADHD psychiatrist near me
This was quite helpful. For more, visit Plumbing services near me .
наркологическая помощь [url=https://vyvod-iz-zapoya-na-domu-voronezh-1.ru/]наркологическая помощь[/url] .
Appreciate the detailed post. Find more at southwest movers in san francisco .
The smoked poultry from BBQ restaurant schenectady is a pinch hit family members get-togethers– simple and scrumptious.
Great point about creating a safe home environment—labeling drawers and using contrasting colors really helps. We used a checklist from elderly care to get started.
This was very enlightening. More at Assisted living facility .
«Офис» — культовый американский ситком 2005 года, снятый в формате псевдодокументального шоу о буднях небольшой бумажной компании в провинции. Ручная камера и обращения персонажей напрямую к зрителю дают ощущение полного присутствия внутри офиса, где за рутиной прячутся страсти и комичный абсурд. Ищете офис все серии? Все 188 серий доступны на ofis-smotret.online с несколькими вариантами озвучки. Самовлюблённый босс, ироничный продавец, застенчивая секретарша и педантичный карьерист — каждый персонаж точно узнаваем и раскрывается как живой человек. Именно эта глубина персонажей превратила сериал в признанную классику мирового телевидения.
1win ödəniş problemi [url=https://1win60278.help]1win ödəniş problemi[/url]
melbet live результаты [url=melbet30946.help]melbet30946.help[/url]
Thanks for the insightful write-up. More like this at senior care .
This was very enlightening. More at assisted living murrieta .
Preventing drain issues starts with what we put down them. Always be cautious! More prevention tips at drain specialist .
Our exterior fence and gates were refreshed by Residential House Painter and look brand-new.
Looking for something different for your next event? Street food vans might be the answer! Visit Event Street Food Van Hire .
mostbet Oʻzbekiston kazino bonus [url=https://mostbet59402.help]https://mostbet59402.help[/url]
Your insights into crafting compelling meta descriptions as part of an effective strategy are really helpful; find similar tips here: Local SEO Agency !
Anyone exploring Ashtanga or Mysore-sort practice in Bangalore? There are forged shalas in Jayanagar and Basavanagudi. Listings and opinions helped me opt for due to best yoga center in bangalore .
Buen tema. Para comunidades de vecinos también ofrecen servicio. Lo vi en cerrajero sant andreu .
Survivors often don’t know where to start; Injury lawyers london ontario connects you with sexual abuse lawyers who listen.
Template: “Leader humility builds trust. How do you help execs share failures without oversharing?” Leadership Coach London
Any individual tried the charred ends from Barbecue restaurant niskayuna at neighborhood events?
Thanks — for reliable limo service in St Louis suburbs, limousine service worked well for us.
Great article! I always learn something new about dental health when reading posts like this one! Barnsley Dentist
Với link trang chủ CO88 chính thức, người chơi dễ dàng truy cập hệ thống giải trí trực tuyến uy tín, không lo vào nhầm website giả mạo co88.ws
Excellent article, My wife and I just completed a real estate closing in Saratoga Springs and it’s so important to hire a good real estate attorney. We worked with Ianniello Anderson and they made it stress-free residential real estate attorney Albany
GEM88 là website giải trí trực tuyến cung cấp nhiều chuyên mục như thể thao, nổ hũ, bắn cá, đá gà, casino, game bài và xổ số GEM88
BOM88 là nhà cái trực tuyến đang thu hút sự quan tâm lớn từ cộng đồng người chơi nhờ hệ sinh thái game đa dạng và trải nghiệm mượt mà. Thương hiệu này còn được biết đến như một đối tác chiến lược uy tín, mang đến môi trường giải trí chất lượng cao BOM88.CODES
VA88 là website giải trí trực tuyến cung cấp nhiều chuyên mục như thể thao, casino, game bài và các nội dung liên quan đến trải nghiệm trên nền tảng va88.nl
Thank you for discussing how to handle difficult clients in real estate! allentown real estate agents
VK88 là website giải trí trực tuyến cung cấp nhiều chuyên mục như thể thao, nổ hũ, bắn cá, đá gà, casino, game bài và xổ số. Giao diện trang được sắp xếp theo từng danh mục khá rõ ràng, giúp người xem dễ theo dõi và lựa chọn nội dung mình quan tâm VK88
3BET là trang chủ nhà cái chính thức, nơi hội tụ đầy đủ các sản phẩm giải trí và cá cược hàng đầu hiện nay 3BET
Great tips! For more, visit plumbing services .