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
}
The burst fade gallery gave me ideas; my cut from traditional Glendale barbershop matched perfectly.
ADA compliance was easy using individual restroom ’s minimums per total unit count.
Westmount residents, this cannabis dispensary via Weed stores london ontario was super quick.
Comfortable rest areas and amenities — map at Theme park .
Very informative article. For similar content, visit memory care .
Hyde Park’s best cannabis store for me is Hyde park dispensary —always a pleasant visit.
Excellent. Fatigue and scheduling pressures are unique risk factors in bus operations. Resource: Motorcycle Accident Attorney .
Helpful tip: add more units for peak intermissions— portable restroom rentals breaks down how many extras to rent.
1win free spins slots [url=1win05634.help]1win free spins slots[/url]
Your article offers a solid roadmap for first-time managers. Many of them benefit from structured learning paths like those on leadership training .
This Cannabis London Ontario spot is my first stop for new drops— Dispensary london ontario .
Respite stays are a great trial run. We discovered short-term stay availability on memory care before committing.
This was very well put together. Discover more at memory care .
If you’re browsing for the “most exceptional Sushi Restaurant near me” in St. Augustine, Ginger Bistro is a must try! Sushi near me
mostbet załóż konto [url=mostbet2004.help]mostbet załóż konto[/url]
This was a fantastic resource. Check out elderly care for more.
Thank you for the practical advice. Additional resources at drug lawyer .
Excellent service every time with The Master’s Lawn & Pest! They’re unquestionably the very best lawn care near me in Gainesville. lawn care
If you’re seeing slow drains and gurgling, get a camera inspection before digging. I scheduled mine via sewer cleaning .
I’ve been searching for an excellent Realtor near me in St Augustine and Shelby Hodges Group regularly sticks out in St Augustine. Their local know-how, responsiveness, and performance history made my home search a lot smoother St Augustine waterfront realtor
ORCA Hydroseeding offers one of the most affordable ways to establish a beautiful lawn in Tacoma. Their pricing is transparent and competitive for all project sizes. Hydroseeding services
Private fishing charters can be tailored to your skill level — see customization ideas on fishing charter flamingo .
Helpful post! I’ve found great edibles and pre-rolls at Western Road dispensary in London, Ontario.
End-of-life planning in dementia is hard but necessary. Advance directives and comfort care discussions provide clarity. We found compassionate guidance on elderly care .
Claim adjusters are friendly, not neutral. Bus Accident Attorney gives pointers for safe communication.
australia merlot wine slot, spin usa casino and slot machines sale united states, or united
statesn online no deposit pokies
my blog; how to make money with iphone 11 pro,
Genevieve,
Hey There. I found your weblog the use of msn. This is an extremely well written article.
I will be sure to bookmark it and return to read more of your useful information. Thank you for the post.
I will certainly comeback.
Awesome roundup of party ideas! If you want budget-friendly packages that include delivery and setup for bounce houses and water slides, browse bounce house —lots of choices for different age groups.
Great breakdown of the professionals and cons of using condo debts for quick-term trading. One factor I’d add is to continuously assess rate transparency and withdrawal terms up entrance—hidden fee ranges can truthfully eat into returns click here now
Legal terms can be overwhelming; finding clear explanations about your situation is crucial—check out resources at Motorcycle Accident Attorney !
I appreciated this post. Check out nursing homes near me for more.
If you need experienced window contractors, reach out to window contractors for references.
Very good post. I’m experiencing a few of these issues as well..
This helped a lot — located indoor pickleball courts through sports complex .
For a Springbank cannabis dispensary that keeps it simple, Springbank dispensary is my choice.
https://rushbet.net.co/
El operador Rushbet Colombia se presenta como un casino en linea y casa de apuestas deportivas con operacion licita en el pais desde 2021, avalado por la licencia otorgada por Coljuegos y administrado por la compania con amplia trayectoria Rush Street Interactive.
«Рассказ служанки» — мощнейшая антиутопическая драма современности, созданная по культовому роману Маргарет Этвуд. События происходят в жестоком тоталитарном режиме, отнявшем у женщин права, имена и свободу, а служанок превратившем в живые инкубаторы для правящей верхушки. Ищете рассказ служанки все серии? На rasskaz-sluzhanki-smotret.net доступны все 66 серий шести сезонов с профессиональными озвучками. Сериал удостоен множества престижных наград и признан одной из лучших драм десятилетия — напряжённый, беспощадный и абсолютно необходимый к просмотру.
Great level about how mortals considered them differently in rituals. I extended on regional cult changes among the brothers at zeusvshades world downloads
Outstanding solution every time with The Master’s Lawn & Pest! They’re undoubtedly the very best landscaping in St Augustine. landscaping near me
mostbet zakłady jutro [url=https://www.mostbet2004.help]https://www.mostbet2004.help[/url]
Great for adventure planners. I’ve shared this with my group heading to Theme park .
The at-fault driver disappeared. My attorney located them through investigative tools. car accident lawyer
HITCLUB – Hitclub.sale trang đại lý chính thức tại Việt Nam của cổng game Hit.club, với hậu thuẩn mạnh mẽ từ cổng game hitclub.com, chúng tôi thừa hưởng đẩy đủ các khuyến mãi và tất cả game hot, casino, game bài, nổ hũ mà người chơi ưa thích.
HITCLUB
If you’re searching St. Augustine, you’ll swiftly understand why locals claim the very best company for auto insurance in and near St Augustine is Fender Insurance Agency car insurance near me
25 free spins casino new zealand, first casino
in united states and best united kingdom online casinos real money,
or no wagering age to play at morongo casino (Beau)
uk
If you’re searching St. Augustine, you’ll promptly understand why citizens claim the best agency for homeowners insurance in and near St. Augustine is Fender Insurance Agency homeowners insurance
ไฟหน้าแบบไหนที่เหมาะกับสภาพถนนในเมืองไทยที่สุดครับ?? เปลี่ยนไฟหน้ารถราคา
1win apk oficial Perú descargar [url=https://1win05634.help]https://1win05634.help[/url]
VB88 là điểm đến an tâm cho tín đồ cá cược Việt, trang bị bảo mật đỉnh cao và thanh toán tức thì. Đăng ký tại VB88, bạn hưởng quyền truy cập trọn bộ game, casino, thể thao với ưu đãi +188K mùa 2026 vb88cn.com
If you want to improve your casting and boat-handling, the coaching sessions promoted on adventure vacation are excellent.