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
}
This is an important conversation for Texas employers. Small business health coverage should balance affordability, employee access, and reliable benefits. Related resource: Texas small business health coverage
В статье по вопросам здоровья мы рассматриваем актуальные проблемы, с которыми сталкивается общество. Обсуждаются заболевания, факторы риска и важные аспекты профилактики. Читатели получат полезные советы о том, как сохранить здоровье и улучшить качество жизни.
Узнать больше – [url=https://koteloksit.ru/vvyvod-iz-zapoya-kak-obespechit-komfortnoe-lechenie/]наркологическая клиника в находке[/url]
Этот информационный материал подробно освещает проблему наркозависимости, ее причины и последствия. Мы предлагаем информацию о методах лечения, профилактики и поддерживающих программах. Цель статьи — повысить осведомленность и продвигать идеи о необходимости борьбы с зависимостями.
Практические советы ждут тебя – [url=https://domashniidoktor.ru/narkologiya/podrostkovyj-alkogolizm-prichiny-posledstviya-i-puti-resheniya-problemy/]лечения алкоголизма в Новокузнецке[/url]
This post is very helpful for people relocating locally or across town. El Paso full service movers can save a lot of time when the move involves packing materials, furniture protection, and careful handling El Paso full service movers
Το άρθρο συνοψίζει τέλεια την αθηναϊκή nightlife. Για όσους όμως αναζητούν και πιο προσωπικές υπηρεσίες συνοδών, το top call girls Athens μπορεί να φανεί χρήσιμο.
This is a helpful discussion for small business owners trying to understand California health coverage options. I found this related resource useful: California employee benefit plans
Helpful information for anyone dealing with unexpected plumbing trouble. Having a 24 hour plumber available in Jacksonville gives peace of mind when emergencies happen. Plumbing contactors Jacksonville
В этой статье мы рассматриваем разрушительное влияние зависимости на жизнь человека. Обсуждаются аспекты, такие как здоровье, отношения и профессиональные достижения. Читатели узнают о необходимости обращения за помощью и о путях к восстановлению.
Получить дополнительные сведения – [url=https://toyotamark2.ru/selo-novotoreckoe-v-doneckoi-narodnoi-respyblike-pereshlo-pod-kontrol-rossiiskih-voisk/]капельница от запоя в Находке[/url]
Employee benefits are a smart way for Georgia small businesses to show appreciation for their teams. Even simple benefits can improve morale and help retain valuable employees. Georgia group health plans
Thanks for the useful post. More like this at konto firmowe z księgowością .
For Hutto townhouse moves with stairs, the prep tips on cheap local movers Hutto are spot-on.
Esse conteúdo mostra bem por que uma imobiliária local pode ajudar mais do que uma busca genérica em portais imobiliários.
corretor Zona Sul Brooklin
This was beautifully organized. Discover more at divorce mediation .
I was curious if you ever considered changing the page layout of your blog?
Its very well written; I love what youve got to say.
But maybe you could a little more in the way of content so people could connect with it
better. Youve got an awful lot of text for only having 1 or two images.
Maybe you could space it out better?
Diyarbakır’da keyifli bir akşam geçirmek isteyenler için doğru barı seçmek önemli. Mekân araştırması yaparken eskort Diyarbakır rezervasyon benim için pratik bir kaynak oldu.
Greetings from California! I’m bored to death at work so I decided to check out
your site on my iphone during lunch break. I really like
the knowledge you provide here and can’t wait to take a look when I get home.
I’m shocked at how fast your blog loaded on my phone ..
I’m not even using WIFI, just 3G .. Anyhow, wonderful site!
Highly energetic post, I liked that bit. Will there be a part 2?
I have an understanding of the policy cover on uplighting bushes. Layering narrow and large beams created depth in my landscape, encouraged by means of examples I noticed at outdoor illumination .
For condos in Providence, ask about HOA move windows and truck height limits. I pre-cleared everything with help from small apartment movers Huntsville .
Appreciate the thorough analysis. For more, visit despacho legal .
Love the sustainable attitude with LEDs and timers. I calculated vitality mark downs by means of a primary worksheet from outdoor lighting and it paid off.
Great post.
I definitely love how fashion jewelry can transform a whole attire! It’s incredible how a basic piece can include a lot beauty and personality. Have you ever considered customizing your own jewelry? It can make for a really special declaration piece sell gold denver co
https://yemaoggun.es/
Si te interesa la mejor opción en comercializadora industrial, tienes que visitar Yema Oggun. Somos una plataforma creada para proporcionarte la más alta calidad. Descubre todo lo que ofrecemos y comprueba por qué somos la elección ideal.
I think the admin of this web page is actually working hard in favor of his web site, since here every information is quality based information.
beste online casinos mit visa (https://Pestcontrolservicesnearme.ca/2026/04/04/spielbanken-ohne-einzahlung-bonus-Erhalten/) casino 50 euro cashtocode
athletic barcelona bonos casas de Apuestas nuevas
Wonderful beat ! I would like to apprentice while you amend your web site, how can i subscribe for a blog site?
The account helped me a acceptable deal. I have been a
little bit familiar of this your broadcast provided brilliant clear idea
My coder is trying to convince me to move to .net from PHP.
I have always disliked the idea because of the expenses.
But he’s tryiong none the less. I’ve been using WordPress on a variety of websites for about a
year and am anxious about switching to another platform.
I have heard great things about blogengine.net. Is there a way I can transfer all my wordpress content into it?
Any help would be really appreciated!
Good day! This is my first visit to your blog! We are a
team of volunteers and starting a new initiative in a community in the same
niche. Your blog provided us beneficial information to work on. You have done a marvellous job!
Эта публикация содержит ценные советы и рекомендации по избавлению от зависимости. Мы обсуждаем различные стратегии, которые могут помочь в процессе выздоровления и важность обращения за помощью. Читатели смогут использовать полученные знания для улучшения своего состояния.
Перейти к статье – [url=https://deti54.ru/the_articles/alkogolnaya-zavisimost-u-blizkih-kak-uberech-detey-i-nachat-lechenie.html]вывод из запоя на дому в воронеже[/url]
Excellent blog! Do you have any tips and hints for aspiring writers?
I’m planning to start my own website soon but I’m a little
lost on everything. Would you recommend starting with a free platform like WordPress or
go for a paid option? There are so many options out there that I’m completely confused ..
Any recommendations? Bless you!
Hafta sonu Diyarbakır’da nereye gidilir diye düşünenler için bar ve eğlence mekânı önerileri gerçekten işe yarıyor. Ben de Diyarbakır gece escort üzerinden birkaç yer keşfettim.
Thanks for the comprehensive read. Find more at procedimiento laboral Sevilla .
Very informative post. Understanding California group health plans is essential for companies trying to balance cost and employee satisfaction. I came across related resources at California small business health coverage too.
This is a good reminder to ask movers about customs support before booking. For El Paso international relocations, El Paso commercial movers may be a useful contact.
Great insights here. Plumbing problems like slow drains, low water pressure, and leaking pipes should be handled by experienced Jacksonville professionals. Plumbing contactors Jacksonville may be useful for readers.
Diyarbakır’da yetişkinlere yönelik güvenilir ve güncel platform arayanlar için Diyarbakır yerel hizmet dikkat çekici bir seçenek olabilir.
O Brooklin tem um perfil interessante para famílias, executivos, investidores e pessoas que buscam praticidade.
imobiliárias Brooklin Berrini
Small employers in Texas may benefit from working through their options early, comparing plan structures, and understanding how contributions affect affordability. More here: Texas employee benefit packages
Appreciate the thorough insights. For more, visit casa rural con barbacoa Segovia .
Этот обзор медицинских исследований собрал самое важное из последних публикаций в области медицины. Мы проанализировали ключевые находки и представили их в доступной форме, чтобы читатели могли легко ориентироваться в актуальных темах. Этот материал станет отличным подспорьем для изучения медицины.
Узнайте всю правду – [url=https://weburologiya.ru/pochemu-stoit-vybirat-kapelniczy-ot-pohmelya-v-klinikah-obstoyatelstva-i-preimushhestva/]кодирование от алкоголизма в Пскове[/url]
I appreciated this post. Check out bufete de abogados Vigo for more.
yukon gold casino legit, uk slots sites and united statesn no
deposit graton casino bus san mateo (Daryl) bonus codes, or can i use td canada trust visa debit for online gambling
В этой статье мы рассмотрим современные достижения в области медицины, включая инновационные методы лечения и диагностики. Мы обсудим важность профилактики заболеваний и роль технологий в улучшении качества здравоохранения. Читатели узнают о влиянии медицины на повседневную жизнь и ее значение для современного общества.
Где можно узнать подробнее? – [url=http://stroybud.com/semeynoe-konsultirovanie-pri-alkogolizme-rol-blizkih-v-vyizdorovlenii-zavisimogo/]прокапаться от алкоголя ростов[/url]
В этой статье мы обсудим процесс восстановления после зависимостей, акцентируя внимание на различных методах и подходах к реабилитации. Читатели узнают, как создать план выздоровления и использовать полезные ресурсы для достижения устойчивых изменений.
Читать полностью – [url=https://getasia.ru/lechenie-alkogolizma-v-kostrome-aktualnye-metody-i-podhody/]капельницы от запоя в Пскове[/url]
Howdy! This blog post couldn’t be written any better!
Going through this post reminds me of my previous
roommate! He always kept preaching about this. I most certainly will forward this post to him.
Pretty sure he will have a good read. Thank you
for sharing!
Apuestas de futbol Peru deportivas telegram españa
This was quite helpful. For more, visit abogado cerca de mí laboral Sevilla .
Мы рассмотрим современные вызовы здравоохранения и пути их решения с помощью технологий и научных исследований. В статье собраны данные о новых лекарствах, методах диагностики и системном подходе к улучшению здоровья населения.
Получить профессиональную консультацию – [url=https://www.kremlinrus.ru/article/175/171439/]клиника плюс тверь[/url]