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
}
Thanks for the valuable insights. More at despacho laboral Sevilla .
Very useful post. For similar content, visit casas rurales para familias Segovia .
Water management around new foundations matters; remodels installed perfect drainage.
Do Woodbridge movers charge extra for long carries from distant parking spots? Fee details on Office moving companies Woodbridge weren’t always clear.
For new builds in Frisco, confirm road access for large trucks. I checked builder schedules and mover availability via Dallas apartment movers .
Seniors downsizing in Hampton: ask about donation drop-offs. Hampton Mover’s Pro took a load to a local charity for us.
Moving from Oakhurst to downtown Decatur? I found helpful checklists and mover options on Local movers Decatur .
Looking for feedback on non-running car winch fees within Buffalo. Do carriers on Buffalo car transport clearly itemize inoperable charges before dispatch?
If you’re new to Gwinnett County, compare in-home vs. virtual estimates. I requested both through Dacula movers .
Pro tip for Trenton moves: ask about stairs and elevator fees upfront. Some movers add surprise charges. I got a transparent estimate through Trenton moving companies and avoided last-minute costs.
We moved from Kenilworth to Pointer Ridge and our best decision was booking a local Bowie mover through Local movers Bowie —they knew the HOA rules cold.
We needed decommission work: cubicle tear-down, e-waste, and furniture donation. Washington DC moving company bundled it all into one project plan.
If you have heavy furniture or a piano, the crews on Concord moving companies are skilled and careful—true Concord pros.
This was highly educational. For more, visit consultar abogado extranjería .
Track prescription changes post-crash; worksheets at car accident attorney .
Shoutout to french drains london ontario for explaining London’s high water table near the Thames River and how to plan for it.
http://wepublicu.de/
Das Projekt Wepublicu praesentiert sich als ein vertrauenswuerdiger Partner spezialisiert auf den deutschen Markt, das ermoeglicht hochwertige Dienstleistungen fuer alle die Effizienz schaetzen, priorisierend auf Servicequalitaet. Besuchen Sie die Website auf der offiziellen Website.
I liked that Allentown full service movers included valuation coverage options for my Allentown cross-country move.
From the initial call to final box, Office moving companies Lawrence made our Lawrence move easy and organized.
For seniors, london window and door offers lever handles and lower thresholds that are easier to use.
Just finished a short-distance move across Snellville—these pros saved me time and stress. Details at Office moving companies Snellville
What types of conditions can a Tacoma chiropractor help with? Looking forward to more details from Chiropractor Tacoma WA .
If you’re searching for reliable yet cheap movers in Cincinnati, check out Cincinnati full service movers for budget-friendly options and quick quotes.
The adaptability of backyard decks is fantastic! You can tailor them to fit any style or function you need. I just recently discovered some ingenious concepts for multi-level decks at deck contractor that might truly elevate your outdoor space.
For reliable warranties on Feasterville plumbing work, compare Plumber Feasterville options at plumber feasterville .
Добрый день!
Для услуг с высокой конкуренцией обычного шаблонного сайта часто недостаточно. Нужны понятное позиционирование, сильный первый экран, доказательства экспертности, кейсы, формы связи и техническая база без лишнего кода. Посмотреть подход можно здесь — корпоративный сайт под ключ: https://volt-site.ru/uslugi/razrabotka-sajtov Это помогает не размывать релевантность и вести пользователя к целевому действию.
продающий лендинг заказать быстро, создание сайтов в спб, seo для сайта заказать
разработка сайта компании удаленно, [url=https://volt-site.ru/kejsy]заказать имиджевый сайт компании[/url], создание сайта цена быстро
Всего наилучшего и роста в топ!
I needed a doctor’s note for work while in Pattaya—Takecare Clinic handled it. Found them through iv drip in Pattaya .
For winter moves into Westchester, enclosed vs open—what’s your take with road salt? I’m checking availability on Yonkers vehicle shipping .
Appreciate the useful tips. For more, visit programa nutricional nutrióloga Saltillo .
This was a wonderful post. Check out Pressure Washing for more.
Visiting Ao Nang soon and looking for reliable healthcare? I had a smooth experience at Take Care Clinic with a professional doctor—highly recommend checking skin rash treatment in Ao Nang Krabi before you go.
Facility audits got more uncomplicated after House cleaning supplied special service logs and graphics.
For a code-compliant exterior stair addition, new construction is reliable.
If your teen driver was involved, separate issues may apply—learn at car accident attorney .
For mannequin lungs that fit multiple brands, CPR training manikins Canada has cross-compatible options.
BSA Claims stands apart as the most ideal independent insurance adjusters for customer-focused solution. Even more at independent insurance adjuster .
I work with Albany car transportation services . For corporate relocations to the Capitol area, bundle car shipping with household moves to align timelines.
Excellent reminder to clean debris from valleys and occasional spots. We embrace this as a known renovation inspiration for all property owners who use Gikas Roofers NJ installers .
For mailbox parcel lock upgrades in Houston condos, I’d recommend lock cylinder rekey .
If you’re comparing local movers in Grand Rapids, don’t forget to check neighborhood access and parking rules in Heritage Hill and Eastown—tight streets can add time. I used Grand Rapids moving companies to line up a crew that knew the area well.
If your vehicle is inoperable, tell the broker early—winch fees apply. Phoenix Car Shipping’s matched me with a truck equipped for non-runners.
Love the advice about winter prep; salt and snow are real issues here. I’m checking carriers’ winter policies through Detroit vehicle shipping .
Great option for walk-in care in Pattaya—Takecare Clinic Doctor Pattaya. I used doctor near me in Pattaya to get directions.
For eco-friendly moves, I sourced reusable bins after reading recommendations on Houston apartment movers .
Nicely done! Find more at abogados en Vigo 24h .
Мы рассмотрим современные вызовы здравоохранения и пути их решения с помощью технологий и научных исследований. В статье собраны данные о новых лекарствах, методах диагностики и системном подходе к улучшению здоровья населения.
Информация доступна здесь – [url=http://laform.ru/zdorov-e/vidy-kapelnic-pri-alkogolnoj-zavisimosti.html]clinica plus[/url]
For travel insurance claims, Take Care Clinic Ao Nang provided a proper medical report. Process explained on animal bite treatment in Ao Nang Krabi .
For art and antiques, look for custom crating; I located specialists via Atlanta moving companies .
http://werbeservice-online.de/
Werbeservice Online etabliert sich als ein erfahrene Beratung ausgerichtet auf den deutschen Markt, das bereitstellt ganzheitliche Ansaetze fuer Unternehmen und Privatpersonen, mit Schwerpunkt auf persoenliche Betreuung. Besuchen Sie die Website auf der offiziellen Website.
We needed careful handling for a piano in New Hyde Park; found a crew via New Hyde Park commercial movers that specialized in heavy items.