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
}
That is really interesting, You are a very skilled blogger. I have joined your rss feed and sit up for in search of more of your wonderful post. Also, I’ve shared your web site in my social networks
buy cannabis online for xxx adult porn video
The section on early signs of cognitive change was spot-on. Early assessments open the door to planning and support. We learned what to expect next at respite care .
http://comcassandre.fr/
Le projet Comcassandre s’impose comme une agence specialisee focalisee sur le cadre national francais, qui propose des solutions sur mesure a ceux qui valorisent l’efficacite, en valorisant sur l’excellence du service. Plus d’informations sur le site officiel.
We wanted a place with on-site therapy. senior care made it easy to find communities offering PT and OT.
After a bad experience with another Phoenix Mold Remediation company, I was skeptical about calling Urgent Mold Removal Phoenix. They completely changed my perspective — honest about maintenance costs, did quality work, and cleaned up after themselves. Urgent Mold Removal Phoenix 623-343-8617 Mold Remediation
The biggest dilemma for me is preserving the room geometry. A lot of those AI indoors design apps just generate a completely other room structure, which defeats the factor should you’re attempting to plot something realistic AI interior design app Android
Autumn rain tracks water into entrances and stairways. Non slip mats and timely cleanup reduce risks. Report hazards and request incident forms when injuries occur. Kent injury Lawyer
Yield prediction improved using mid-season indices. Model details at Drone Spraying .
Memory care often partners with therapists for on-site support, which enhances safety beyond assisted living. Info: elderly care .
FABET được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như hướng dẫn, thể thao, live casino và game bài, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc
Sharpening skills related directly towards refinishing leads individuals toward greater confidence levels while tackling future endeavors ahead. Commercial Floor Restoration
LUCKY88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như hướng dẫn, game hot, cẩm nang casino và giải mã giấc mơ, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc
aviator slots download [url=aviator67093.help]aviator67093.help[/url]
перейти на сайт https://hpc.name/thread/c252/128826/ocenka-asinhronnogo-dvigatelya.html
This article is a treasure trove of knowledge for anyone considering a new roof—thank you for sharing your expertise! Flat Roofing
Your advice around maintaining updated privacy policies ensures trust among users—a critical aspect well discussed throughout various platforms including mine which shares fundamental concerns faced across all industries alike: ### anyKeyWord### ! Google SEO
Wallpaper can transform a space. Kitchen Cupboard Painter handled our installation perfectly without bubbles or seams.
Your point about community culture is spot on. Reviews on respite care gave us insight beyond brochures.
It’s encouraging to read about attorneys helping clients in Tacoma and Kent, not just Seattle. Immigration Lawyer
Super worthy ebook on thermostat placement; I discovered a pro to relocate mine as a result of Canadian Heating and Air Conditioning Inc. Hamilton .
VB88 là nhà cái trực tuyến hàng đầu, quy tụ hàng nghìn trò chơi hấp dẫn từ cá cược thể thao, casino trực tuyến, slot game cho đến game bài đổi thưởng bbc
This post sheds light on the complexities of the real estate market; thank you! realtor las vegas
TX88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như hướng dẫn, thể thao, casino và xổ số, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc
мелбет ординар шартгузорӣ [url=https://melbet39704.help]мелбет ординар шартгузорӣ[/url]
melbet зеркало без vpn [url=https://www.melbet94130.help]https://www.melbet94130.help[/url]
I love the emphasis on purpose-driven activities. Simple tasks like folding towels or gardening can boost dignity and mood. We found more activity plans on memory care .
Наркологическая клиника «Трезвый Север» организует быстрый и безопасный вывод из запоя с круглосуточным выездом врача, индивидуальными капельницами и бережной психоподдержкой. Мы работаем по принципу «одно вмешательство — одна цель — один маркер результата»: так пациент видит логику лечения, а команда гибко подстраивает тактику под реальную динамику — без избыточных назначений и суеты. В основе — деликатная логистика, анонимность и пошаговое восстановление сна, гидратации, электролитного баланса и нервной регуляции.
Ознакомиться с деталями – [url=https://vyvod-iz-zapoya-petrozavodsk0.ru/]вывод из запоя на дому цена петрозаводск[/url]
Букмекерские конторы: отзывы, ставки на спорт, новости спорта, прогнозы и
капишаба читайте подробнее про ставки и букмекеров на bkradar.com
Replacing cracked lids and adding risers was quick and affordable with high-pressure hydro-jetting .
TX88 là nền tảng cá cược trực tuyến hàng đầu châu Á, được cấp phép hợp pháp quốc tế như PAGCOR, MGA, và Curacao, cam kết hoạt động minh bạch và an toàn. Nền tảng cung cấp hơn 10 bbc
Rock Academy completely changed how my kid connects with music. The instructors are actual working musicians who care about each student’s growth, and the live performances are unreal. It’s not just lessons — it’s confidence, teamwork, and pure fun performance based music school hudson valley
мелбет майнс [url=https://melbet94130.help/]мелбет майнс[/url]
VIN88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục trọng tâm như đăng ký, đăng nhập, nạp tiền và rút tiền, giúp người truy cập dễ dàng nắm bắt quy trình sử dụng ngay từ đầu bbc
Do you supply smoker-on-site experiences for visitors? Asking Smoked meat niskayuna for an interactive touch.
Thanks for outlining the potential penalties. Understanding the stakes pushed me to get proper legal help—see Criminal Defense Law .
Thoughtful article! We especially liked the explanation of web design.
local SEO Schenectady
Sentencing enhancements add years. See common enhancements at Criminal Defense .
Kelowna summers get warm—our warmness pump retrofit contractor got here from Elemental Builds Ltd. Kelowna and nailed the deploy.
XO88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như giới thiệu, hướng dẫn, casino và khuyến mãi, giúp người truy cập dễ dàng định vị và tiếp cận đúng thông tin mình cần bbc
I’ve found that using baking soda and vinegar works wonders for minor blockages! For more DIY solutions, see emergency drain unblocking .
Your article captures the shift from command-and-control to coaching-based leadership. I’ve seen that shift supported well with tools from leadership tools .
I mounted an errors code E24 on my dishwasher after consulting appliance repair .
Red88 là nhà cái cá cược online quốc tế, cung cấp đa dạng sản phẩm từ bóng đá, casino, bắn cá đến slots. Với bảo mật cao, tỷ lệ kèo chuẩn châu Âu và nhiều ưu đãi, Red88 mang đến trải nghiệm cá cược chuyên nghiệp bbc
Tasks calendars inform you a great deal concerning an area’s spirit. We contrasted schedules straight on respite care .
melbet время вывода [url=http://melbet94130.help]melbet время вывода[/url]
Template: “Interesting data on burnout. In Canary Wharf, leaders cite meeting overload. We’ve piloted meeting-free mornings plus decision logs. Have you seen durable meeting hygiene practices?” Leadership Coaching London
I found this very interesting. Check out senior care for more.
В этой статье представлен занимательный и актуальный контент, который заставит вас задуматься. Мы обсуждаем насущные вопросы и проблемы, а также освещаем истории, которые вдохновляют на действия и изменения. Узнайте, что стоит за событиями нашего времени!
См. подробности – [url=https://life-sovet.ru/effektivnoe-vosstanovlenie-pri-silnoj-alkogolnoj-intoksikacii/]вывод из запоя цены[/url]
Transportation solutions are often ignored. We found an area with set up experiences and companions using assisted living .
I appreciated the focus on gentle progress; I found that approach in London via bioidentical hormone replacement therapy .