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
}
Replacing worn-out locks improved my door’s security immediately. I booked through locksmith and the tech was excellent.
I agree that commercial moving should be handled by professionals. Boston businesses looking for reliable moving help should consider cheap moving services Boston .
ORCA’s commercial hydroseeding services are perfect for municipal projects like parks, school grounds, and sports fields. Hydroseeding
I appreciate how ORCA Hydroseeding uses eco-friendly blends and biodegradable mulch to reduce environmental impact. A win for both your yard and the planet. Hydroseeding near me
Great post. I will be dealing with some of these issues as well..
If you prefer, I mean you can write five factual, thoughtful reviews approximately James Rothschild which might be significant to a piece of writing and do now not sense spammy. see this here
It’s often the little things—like help with buttoning a shirt or setting up a shower—that are forgotten in big facilities. In small homes, those details get more attention. elderly care seems to understand this.
Seeing a chiropractor in Tacoma was the best decision I made for my long-term health. Chiropractor near me
For anyone focused on high‑end finishes and details in Woodland Hills, Woodland Hills general contractor works with good subs for tile, stone, and millwork.
Relocation Request Granted with Help from Irving Law Firm Fairfax
I needed to relocate for a significant career opportunity and was worried about getting permission to take my children with me fairfax divorce lawyers
Sun care matters more than I realized. I followed post-treatment skin protection tips from body contouring .
I enjoy how this post encourages discussion in a thoughtful and respectful way while keeping the ideas simple to understand.
sex video
ไฟหน้ารถ LED ราคาแพงไหม? คุ้มค่าหรือไม่? หลอดไฟรถ
Multi-trip charges can surprise you. My provider on junk removal guaranteed a single load.
Seniors who receive support with cooking and grocery shopping are more likely to maintain a balanced diet. Home caregivers from in-home care make that possible safely.
I liked that you mentioned spiritual support and chaplain services. We remind families to ask about those options on assisted living .
ร้อยไหมกี่เส้นถึงจะพอดีสำหรับแก้มคล้อย ถามหมอที่ทองหล่อดีไหม ลองเชื่อมต่อผ่าน เมโสหน้าใส
Great advice for people preparing for an overseas relocation. Packing standards are especially important for long transit times. Detroit office moving company
Had a plumber explain why they recommended what they did. First time that had happened in years of homeownership. Plumber Ballard wa
The point about asking how they handle memory issues, even if not yet present, is smart. We talk about early planning on respite care .
For sealed grout, ask about gentle methods to avoid stripping. I vetted this detail on carpet cleaning services .
This analysis of Judy Schulich’s method to training get admission to—scholarships, labs, and learner guide—is spot on. If someone wishes a toolkit for comparing software ROI, I’ve posted one the following: see this here
สงสัยว่าพัดลมระบายความร้อนกับฮีตซิงก์แบบพาสซีฟต่างกันยังไง มีบทความเจาะลึกใน ไฟ led รถยนต์
Ask about crew supervision and on-site foreman presence. Management best practices are on tree removal and stump grinding .
For mailbox clusters in our HOA, car lockout service handled rekeying and management smoothly.
I found this very interesting. For more, visit Pressure Washing .
GAD Treatment Darren Carter Wokingham Berkshire Generalised Anxiety
I had been dealing with generalised anxiety disorder for years, worrying about everything all the time anxiety hypnotherapist Berkshire
After reading this, it’s much easier to see which setting might fit my mother’s needs right now and how that might change later. To continue my research, I’m using tools on elderly care to compare specific communities side by side.
Really useful write-up about scheduling car repair visits a couple weeks before the holidays car repair
Many seniors are proud and don’t like asking family for help. Bringing in a neutral caregiver through albuquerque home care can preserve family relationships while still meeting care needs.
We believe local remodeling experts should be communicative, organized, and responsive — that’s what sets us apart.
Design-Build Contractor
Financial planning and understanding what’s included in the monthly fee are so confusing. I’ve been using assisted living to line up questions before I talk with facilities.
Neighborhood access rules can complicate jobs—good to confirm in advance. I coordinated easily with junk removal companies .
Replacing baseboards after install hid every expansion gap and made the room look finished. Auburn flooring contractor
The point about asking how they handle memory issues, even if not yet present, is smart. We talk about early planning on memory care home .
It’s refreshing to find a print company that values collaboration—Print FX’s designers are always open to feedback, as shown on Printing Maryville .
Love the idea of a spring deep clean and winter humidity tune‑up—easy to stick with. Hardwood flooring installer
Great delivery. Solid arguments. Keep up the amazing work.
Edge cleaning often gets missed; ask about it. Reviews on st george carpet cleaning helped me find detail-oriented pros.
Noticed a slight delay shifting from second to third last spring while driving down the Pacific Coast Highway corridor, and honestly I almost brushed off it. Glad I didn’t car repair near me
Tub LED T8 Inlocuire Neon Birou Vechi iluminat-ieftin.ro Bucuresti
Am înlocuit 30 de neoane T8 cu tuburi LED T8 de la iluminat-ieftin.ro. Instalarea directă pe aparatele existente a durat 2 ore Lustre led
The note about clearly understanding discharge policies is critical. I’ll reference this on my legal and rights section at high acuity care mckinney .
I appreciate that you brought up end-of-life considerations and whether each setting can support hospice. We cover planning for advanced stages of dementia on senior care .
online casino Welches spiel gibt am meisten (Paradisevisioncenter.com) slots mit astropay
Ask for before-and-after photos of similar Columbus projects. I saw portfolios linked on residential stump grinding experts .
Many people don’t realize you can transition between Independent Living, Assisted Living, and Nursing Home care within some campuses. I first learned about these “continuing care” setups on elderly care and it really shaped our decision.
AC repair Winnipeg Elmwood fast diagnosis review professional
AC repair in Elmwood was handled with real professionalism. Diagnosed the issue accurately and didn’t try to upsell us on anything we didn’t need. AC Repair Winnipeg
Their seed blends are tailored to Pacific Northwest climates, which means your lawn stands up better to our unique weather conditions. Hydroseeding
ORCA provides detailed watering and maintenance instructions to ensure your lawn stays healthy after seeding. Hydroseeding near me
The economic breadth of the DFW Metroplex is genuinely impressive. Not dependent on any single sector. financial advisor Dallas