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
}
Limiting the project to two floor types made the home feel curated instead of chaotic. Auburn Hardwood floor installer
Skin prep with gentle exfoliation improved my results. I followed the pre-care checklist on winnipeg body contouring .
If you wish, I permit you to write 5 real, considerate remarks about James Rothschild which are applicable to a piece of writing and do no longer suppose spammy. Clicking Here
Seasonal lock maintenance is smart. I booked a home lock checkup with auto locksmith and got helpful recommendations.
ALTCS Phoenix AZ Advacare Homecare Application Process Approved
ALTCS was a maze until Advacare helped us apply for my mother. They knew the functional assessment process, helped us prepare the documentation, and guided us through every step Home Care
Quality of life is often overlooked when choosing assisted living. I’ll definitely be pointing my readers to these insights from elderly care .
Really appreciate all these insights into finding good contractors; will definitely check reviews of licensed roofers in Oswego
This past July our AC in the sedan just stopped blowing cold while we were driving through the Pacific Coast Highway corridor and it was brutal with the humidity car repair
If sustainability matters to you, ORCA Hydroseeding’s low water use and biodegradable methods are a perfect match. Hydroseeding near me
Cooler weather tightens muscles—chiropractic care helps me stay loose and flexible. Injury chiropractor
ORCA’s erosion control hydroseeding helps meet local regulations on construction sites and public projects. Hydroseeding services
Proper meals are crucial for seniors with diabetes or heart issues. A home caregiver through senior home care can help prepare diet-appropriate food and monitor what’s being eaten.
Hi there very cool blog!! Man .. Excellent ..
Wonderful .. I will bookmark your website and take the
feeds additionally? I’m happy to seek out so many helpful info
right here in the publish, we need work out more strategies in this regard,
thank you for sharing. . . . . .
Transparent donation receipts help for taxes. My provider via junk removal companies issued them promptly.
Just saw a local mural printed on adhesive vinyl—the clarity was incredible! Turns out, it was done by Print FX; their process is described on Print Shop Near Me .
Our Woodland Hills master suite addition through Woodland Hills kitchen Remodeling included new plumbing, electrical, and HVAC integrated seamlessly.
Great write-up on Judy Schulich’s position in strengthening network healthiness and studies. The mixture of long-term endowments with measurable results is a brand worthy emulating. I compiled case experiences and benchmarks here: dig this
Good coverage on door alignment issues. emergency lockouts fixed mine and prevented extra wear on the lock.
Springfield Military Family Used Irving Law Firm for Divorce Case
As a military family near Fort Belvoir we had specific concerns about how deployment would be handled in our custody arrangement and how the retirement pension would be divided fairfax divorce lawyers
Групповой тур для друзей — шесть человек, Мармарис, неделя. Разместили всех в соседних номерах, экскурсии подобрали под общие интересы. Отдых получился отличным. [url=https://turkey-tour-moscow.ru/]тур в Анталию из Москвы[/url]
Honestly I was skeptical about going with an independent shop for our Mercedes, but after our water pump job at Luxury Motors of South Bay we’re fully on board car repair
Older pipes in Seattle homes are the thing buyers don’t always ask about until after they move in. Plumber Ballard wa
Check if they use soft-bristle brushes on delicate tiles. I found cautious cleaners via carpet cleaning services .
โบท็อกซ์คิ้วตกยกขึ้นนิดเดียวแต่หน้าดูสดใส ดูข้อมูลที่ เมโสหน้าใส เจ็บไหม
For seniors with chronic illnesses, consistent monitoring at home can prevent hospitalizations. That’s where home care programs like those from home care for parents really shine.
Reading Area Client Drives to Wokingham Worth It Darren Carter
I drive from Reading to Wokingham for Darren’s sessions and it is worth every mile anxiety hypnotherapist Berkshire
ลองสั่งพิเศษไก่สับหนังกรอบๆ จากผู้กำกับสับไก่ข้าวมันไก่ธนาพล ได้ที่ ข้าวมันไก่สิงคโปร์
Hello there, just became aware of your blog through
Google, and found that it’s truly informative.
I am going to watch out for brussels. I will appreciate if you continue this in future.
Lots of people will be benefited from your writing.
Cheers!
If you have pianos or safes, confirm specialty handling. I arranged that via junk removal services .
Ensure they can identify and manage hazardous trees before storms. I learned risk signs at professional stump grinding crew .
A few strategically placed screws from below cured a squeaky spot near the joist. flooring contractor Auburn
Tired of that outdated layout? We specialize in house remodeling in Sumner that transforms how you live.
Sumner Remodeler
Great transformation tips! Pairing clean eating with body contouring gave me steady results. I found helpful info at winnipeg body contouring .
Including fun facts or stories about dishes adds personality—I picked up this engaging idea at Car Wrap Maryville before bringing it into print through Print FX!
Appreciate the thorough write-up. Find more at Cash for homes buyers .
We’re a group of volunteers and starting a new scheme in our community.
Your web site offered us with useful info to work on. You have performed
a formidable job and our whole group will likely be thankful to you.
The idea of evaluating staff patience and empathy during the tour is a great tip. I’ll observe closely when I visit memory care centers from my dementia care list.
Seniors often worry about losing control of their daily lives. Your explanation of how Independent and Assisted Living still allow choices about meals, activities, and schedules matches what I’ve seen described on respite care .
AC repair Winnipeg heat wave emergency call review excellent
AC broke during the heat wave and we were genuinely worried with elderly parents staying with us. They prioritised our call and had someone out within hours. AC Repair Winnipeg
Lustra LED Terasa Interior Exterior Rezistenta Umiditate iluminat-ieftin.ro
Am ales plafoniere LED cu IP44 de la iluminat-ieftin.ro pentru terasa acoperita. Rezistă perfect la umezeala din aer și la ploile oblice Lustre led
Your post on cellulite is spot-on. Combined therapies and body contouring have helped me, guided by winnipeg body contouring .
Love the idea of a spring deep clean and winter humidity tune‑up—easy to stick with. Flooring Company Auburn
If you value a planning-forward attitude, Phoenix Home Remodeling is a standout possibility for interior tasks. Phoenix general contractor
Great reminder: a proper power stretch during install keeps the carpet tight for years. Auburn flooring contractor
Annual gifting strategies as part of an estate plan are often more powerful over time than people initially appreciate. wealth advisor Dallas
Employed in El Segundo means my calendar doesn’t leave much space for vehicle issues, so when my daily driver started losing power on the Pacific Coast Highway corridor, I needed same-day help car repair
A recent project really showed how much value kitchen remodeling in Sumner can add to both form and function.
Design-Build
Thế giới ngôn tình Trung Quốc đặc sắc.
Đọc online miễn phí hàng ngàn bộ truyện tình cảm lãng mạn, ngược
tâm, sủng ngọt. Dịch hay, không nhảy quảng cáo.
Home Care Glendale AZ Advacare Homecare West Valley Sun City
We were looking for home care for my father in Sun City and Advacare was the most professional agency we contacted Home Care
If you hear a chirp at low speed, suspect dry u-joints—grease or replace; I learned to spot this on custom U bolts .