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
}
After marathon training left me with hip pain, chiropractic adjustments helped restore my mobility. Chiropractor near me
It’s so important to evaluate activities and engagement, not just the room. I’ll be adding some of your suggestions to my content on respite care .
Body contouring helped me break through a plateau. I planned a post-care routine using the guide on body contouring .
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
Thanks for the valuable insights. More at before and after transformation Slough .
This was quite helpful. For more, visit roofing nearby .
For mailboxes and gate locks, don’t DIY if you’re unsure. locked keys in car handled our setup efficiently.
My aunt felt embarrassed asking for help in a big facility, but in a small home she formed real bonds with caregivers and felt comfortable getting support with personal care. senior care reflects these benefits well.
For families living far away, knowing their loved one is in a small, attentive home can bring real peace of mind. Sites like respite care make it easier to understand how this model works.
QDRO Drafted Correctly First Time by Irving Law Firm Fairfax VA
I have heard horror stories about QDROs being rejected by plan administrators because they were drafted incorrectly. The Irving Law Firm got my QDRO right the first time fairfax divorce lawyers
Home-based rehab after hospitalization can accelerate recovery. home care for parents
What I love about intimate memory care homes is the familiar routine and stable staff. It’s much easier for residents with dementia to feel safe when they see the same faces every day. Sites like memory care home help families understand these benefits.
Some companies charge extra for stairs or long carry distances. I appreciated the transparent add-ons listed at junk removal services .
Updating wine lists seasonally keeps things fresh—Print FX makes short-run prints easy and affordable; learn more at Car Wrap Maryville if you’re interested.
Quality workmanship shows up in the details. The neatness of a finished connection is one of the signs. Plumber Ballard wa
Curious how home additions in Sumner can increase property value? We’re happy to offer a free consultation.
Sumner Remodel Company
We sealed the pad in the pet zone; cleanup is way easier and no lingering odors. Auburn Hardwood floor installer
Great post. We’re dedicated Manhattan Beach drivers and after too long of getting rushed at the dealership, we switched to Luxury Motors of South Bay for our car repair needs and never regretted it car repair
ไฟหน้าโปรเจคเตอร์ที่มี AFS หมุนตามพวงมาลัย แจ่มมาก รายละเอียดระบบอยู่ใน ร้านเปลี่ยนหลอดไฟรถยนต์
For secure padlocks on my storage unit, locked keys in car recommended a shrouded shackle model.
Catching it at light wear meant a quick screen‑and‑recoat instead of a full sand. Auburn flooring contractor
Thanks for breaking down the difference between assisted living and nursing homes. That’s a topic we discuss in depth on respite care too.
Hydroseeding from ORCA gave us a lush, safe lawn where our kids can play—without harsh chemicals. Hydroseeding
Hydroseeding grows directly into your soil, unlike sod, which helps promote deeper, healthier roots. Hydroseeding
For greasy restaurant-style tile, confirm high-alkaline degreasers. I found commercial-capable teams on carpet cleaning .
Chiropractic care has been a game changer for my posture. It’s amazing how much better I feel after just a few visits. Tacoma Chiropractor
I appreciate your emphasis on touring both assisted living and memory care before deciding. We provide printable tour questions and checklists on assisted living mckinney that align with your suggestions.
Navigation is a huge issue—fewer corridors and clear visual cues can prevent frustration and falls. Smaller homes are naturally better suited to this. I saw detailed explanations of this on memory care home .
ร้านนี้เขาเด่นเรื่องไก่สับเรียงสวย ถ่ายรูปขึ้นมาก ผู้กำกับสับไก่ข้าวมันไก่ธนาพล เข้าไปดู ข้าวมันไก่
Наркологическая помощь клиники направлена не только на снятие острого состояния, но и на дальнейшее лечение алкогольной зависимости. Вывод из запоя на дому подходит пациенту, если нет признаков тяжелого отравления, психоза, судорог и опасных осложнений. Если состояние больного тяжелое, врач может рекомендовать лечение в стационаре клиники, где пациент находится под наблюдением медицинской команды, а терапия проходит безопаснее.
Узнать больше – [url=https://vyvod-is-zapoya-sochi24.ru/]вывод из запоя дешево[/url]
Mulch depth and placement after work matters—good companies advise on that. I saw tips on local stump grinding company .
Stop Vaping Darren Carter Berkshire Wokingham Success
I had tried to stop vaping multiple times without success. After one session with Darren the compulsion simply was not there anymore. The personalised recording he provided reinforced the change anxiety hypnotherapist Berkshire
I’ve noticed that seniors with home care tend to stay more active. Caregivers from albuquerque home care can encourage short walks, simple exercises, or light activities.
Genuinely relieved we came across Luxury Motors of South Bay just twelve minutes from our place in Redondo Beach car repair
It’s helpful when they provide photos after pickup. junk removal companies made documentation easy for my landlord.
Has anyone tried using a Tennessee custom print and design company for wedding invitations? I’ve heard Print FX does incredible work with personalized designs. Printing Maryville
I appreciate that small senior homes can tailor ADL support around what the resident can still do independently. That focus on ability instead of disability is something memory care mckinney really emphasizes.
Smaller senior care homes seem better at encouraging families to visit and participate. It’s less intimidating for everyone. I found a lot of helpful questions to ask providers on dementia care .
So glad you covered contraindications. I verified mine using the checklist at body contouring before booking.
I like that you covered both medical and social aspects of assisted living. I plan to share this from our blog at respite care .
Verify they won’t oversaturate to avoid carpet backing damage. I saw good protocols on carpet cleaning services .
Spot LED GU10 Bucatarie Iluminat Perfect iluminat-ieftin.ro Bucuresti
Am înlocuit 12 spoturi halogen din bucătărie cu spoturile LED GU10 de la iluminat-ieftin.ro Lustre led
We’re proud to deliver custom home remodels in Sumner that reflect each homeowner’s unique taste and lifestyle.
Sumner Remodel Contractor
Snapping lines from the main entry kept cuts symmetric and the room visually balanced. flooring contractor Auburn
I’ve seen firsthand how smaller senior care homes can make a huge difference in dementia care. The personalized attention and calm environment often reduce confusion and anxiety assisted living
AC repair Winnipeg satisfaction guarantee floor protection review
Technicians protected our floors and worked cleanly throughout the AC repair. They explained every step which gave us real confidence in what was happening AC Repair Winnipeg
Disposal and cleanup policies should be in the contract. I used a template from commercial tree removal solutions to ensure it was covered.
โปรโมชั่นจับคู่บริการคุ้มสุดๆ ลิงก์อยู่ที่ กัวซา
Раннее бронирование тура на летний сезон — взяли в феврале, сэкономили значительно. Менеджер подсказал оптимальные даты и отель с лучшим соотношением цены и качества. [url=https://turkey-tour-moscow.ru/]туры в Турцию из Москвы[/url]
The Park Cities area of Dallas has such a distinct character. Really unlike anywhere else in Texas. financial advisor near me