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
}
These moving tips are gold! Hiring a Camden moving company will be my next step. Long distance movers Camden
What I most appreciated about Plumbing Matters was that the technician explained exactly what was wrong and why before touching anything. I felt informed rather than just handed a bill at the end. Plumber Riverside CA
For multi-stop moves across Staten Island and Manhattan, Staten Island commercial movers builds route plans that keep crews on time.
авто сайт автомобильный сайт
Murrieta Valley Plumbing quoted a price and that was the price. No additional charges at the end of the job. Honest, straightforward business that respects its customers. Plumber Murrieta
If you’re curious approximately water heater potency in Lake Zurich IL, ask approximately tankless innovations and log findings at Tankless water heater .
Smart advice on countertop overhangs. We tailor edges and overhangs for Tampa bathrooms for comfort and style. master bathroom remodel Tampa
Great reminder about photo-documenting furniture. I uploaded pics to my job file on Schertz moving company for my Schertz-to-NC move.
apartments in phuket thailand for sale [url=https://apartments-for-sale-in-phuket-4.com]apartments in phuket thailand for sale[/url]
Anyone else moving during hurricane season? We packed water-resistant totes and used shrink wrap; also booked with Local movers Tamarac just in case of weather delays.
Great care ideas for oiled floors. Flooring Contractor offered a renovation kit and walkthrough after installation.
Anyone have tips on securing COIs for Honolulu high-rises? Honolulu apartment movers provided building-specific insurance docs same day.
American Home Repair Services technicians are respectful of your home. They arrive in clean uniforms, protect floors during work, and clean up completely. This respect for the client’s property is part of Seda’s standard. Plumber in Encino CA
Dois bônus seguidos no Three Monkeys, ambos uns 30x. Estranho.
Легендарная охота за богатствами продолжается! Новые загадки древних династий, опасные экспедиции и тайны, скрытые веками. Кто разгадает шифры прошлого и доберётся до бесценных артефактов? Захватывающие повороты, рискованные ставки и неожиданные союзники ждут тебя: Сокровища императора 3 сезон смотреть бесплатно
They beneficial a superior layout for the island—spot on: remodeling company
We departed from Kaanapali Beach and were immediately surrounded by a massive pod of spinner dolphins. The crew was thrilled and so were we. Before we even reached the snorkel site the tour had already exceeded our expectations. Kaanapali Snorkel Tours
This was a fantastic resource. Check out hauling services for more.
Great overview of foam roofing benefits — we’ve seen excellent results with foam systems in Scottsdale. More info at spray foam specialists Scottsdale .
This was a fantastic read. Check out Best chiropractor in Campbell for more.
Thinking about switching to LED lighting throughout my house—is it worth consulting with an electrician first? emergency electrician phoenix az
Called Plumbing Matters for our Grand Terrace home. Fast response, same professional standards as all the Riverside reviews. Flat-rate pricing, clean work, and done right the first time. Plumber Riverside CA
We need temporary storage while build-out finishes. Looks like Office moving companies Henderson has short-term warehousing.
A Auto Express keeps a clean, organized shop which tells you something about how they approach their work. Professional staff, clearly organized workflow, and the quality of the finished work matches the professional environment. Auto Repair Raytown
The versatility of yard decks is fantastic! You can tailor them to fit any design or function you require. I recently discovered some ingenious concepts for multi-level decks at deck builders that might really elevate your outdoor space.
Состояние запоя представляет серьёзную угрозу для здоровья, особенно при многодневном приёме алкоголя. В таких случаях самостоятельное прекращение употребления может привести к тяжёлым последствиям — судорогам, делирию, обезвоживанию и даже летальному исходу. Капельница от запоя в Первоуральске — это проверенный метод медицинской детоксикации, позволяющий быстро восстановить водно-солевой баланс и стабилизировать общее состояние пациента.
Исследовать вопрос подробнее – [url=https://kapelnicza-ot-zapoya-pervouralsk11.ru/]сколько стоит капельница от запоя[/url]
Anyone moving from San Marcos with pets? We did a vet check and go-bag. Coordinated the schedule with our movers through Local movers San Marcos so it all aligned.
Awesome breakdown of donation vs. disposal. same day Sydney rubbish removal helped me sort everything properly.
вывод из запоя цены самара [url=https://kapelnicza-ot-pokhmelya-samara-23.ru]вывод из запоя цены самара[/url]
We moved from Denver and needed a new TKD home; Kids Taekwondo Colorado Springs made it smooth.
Thanks for the insightful write-up. More like this at exterior painting .
Handy advice. For property managers in Los Angeles, affordable rodent control services Los Angeles is a good contact.
Ripped duct insulation in the attic wasted energy. local AC repair repaired it in Tampa.
Helpful information. If you’re searching for a plumber in South Knoxville, I recommend plumber for honest quotes.
Thanks for the informative post. More at Hair colorist .
Persistent drain problem in our kitchen for months. Murrieta Valley Plumbing cleared it with hydro jetting and explained what was causing it. Problem has not come back. Very satisfied. Plumber Murrieta
Nicely done! Find more at Pure Plumbing Company .
Excellent take on prefabrication. We toured a modular plant and I recapped it here: landon dean tinker linkedin
Our Battle Ground basement essential flood-resistant floor. Flooring Contractor near me really useful SPC with genuine expansion gaps; it’s held up immense.
This was very enlightening. More at web designer near me .
Thanks for this — if anyone needs roof snow removal or winter prep in Mechanicsville, roof repair contractor provided solid service.
Packing tip: reusable crates beat boxes for Irvine apartment elevators. Saw that idea on Irvine Movers and it sped up my move.
For repipe initiatives in Lake Zurich IL, evaluation elements and warranties; I integrated a precis with Sump pump plumbing .
Great coverage of furnace lifespan. When repair time came, best furnace repair Charlotte gave honest options.
Thanks for the useful post. More like this at best kitchen countertop fabricators .
We did a two‑tone kitchen—Prestige sprayed the conclude flawlessly: remodelers
Good reminder to measure the space. I confirmed truck clearance with the hauler from construction dumpsters Fresno CA .
Thanks for the guidance on contractors’ references. commercial and residential remodel Waxahachie supplied several satisfied Waxahachie clients to contact.
I enjoyed this post. For additional info, visit santa cruz movers .
Their ground care know-how is outstanding. Go with Office Cleaning service —Office Cleaning service Phoenix AZ.