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
}
Platform arayüzü sade ve anlaşılır; randevu almak için yerel escort diyarbakır ideal.
Love the level approximately documenting torque on airbag modules. I confirmed with a shop I booked on relux collision Sacramento .
Thanks for the thorough analysis. More info at Napa carpet cleaning company .
Good respond in return of this query with firm arguments and describing everything about that.
cheltenham festival free bets
Check out my webpage :: horse racing bookmaker (Jodi)
Brides and grooms prepping for the big day can find wedding-focused PTs at personal trainer melbourne South Melbourne VIC .
Ich habe mich neulich bei OASIS registriert. Der Ablauf funktionierte technisch erstaunlich reibungslos. Allerdings frage ich mich, wie lange eine Entsperrung tatsächlich dauert, wenn man diesen Schritt einmal einleitet Klicken Sie für mehr
Have you ever thought about including a little bit more than just your articles?
I mean, what you say is valuable and everything. Nevertheless imagine
if you added some great photos or videos to give your posts
more, “pop”! Your content is excellent but with images and video
clips, this site could definitely be one of the greatest
in its field. Fantastic blog!
Ich habe mich neulich bei OASIS sperren lassen, weil ich mehr Kontrolle über mein Spielverhalten brauchte. Der Prozess war überraschend einfach Folgen Sie diesem Link
Clarify whether they charge extra for heavily soiled areas. I compared surcharges on st george rug and carpet cleaning .
Das ist wirklich ein wichtiger Punkt. Nichts ist frustrierender als tagelang auf eine Bestätigung zu warten, wenn man bereits für etwas bezahlt hat. Wenn die Gutschrift sofort sichtbar ist, schafft das direkt viel mehr Vertrauen in den Anbieter https://www.4shared.com/office/c3t0iwz2ge/pdf-11933-7839.html
Mobil uyum ve hızlı yanıt hızı benim için önemliydi; Diyarbakır escort rezervasyon bu konuda oldukça pratik.
Van’da kaliteli ve düzenli bir deneyim arayanlar için pris van eskort şu ana kadar en istikrarlı adresim.
Das kommt mir so bekannt vor. Ich ertappe mich jeden Morgen direkt nach dem Aufwachen dabei, wie ich erst mal meine E-Mails checke, anstatt richtig wach zu werden. Es ist fast wie ein Reflex https://www.mediafire.com/file/y7qbdem35iareov/pdf-13035-90387.pdf/file
Crisis prevention seems stronger in small homes because changes are noticed early. With dementia, early intervention is key. senior care helped us recognize that as a critical factor.
Danke für den hilfreichen Artikel. Die Einrichtung von OASIS empfand ich als recht unübersichtlich. Ich habe mich gefragt, wie man die Sperrung nach Ablauf der Frist eigentlich am besten wieder aufheben kann https://lukassultimatecolumn.iamarrows.com/was-passiert-wenn-die-oasis-abfrage-nicht-erreichbar-ist-wenn-der-digitale-tursteher-ausfallt
The difference in visiting hours and privacy between Nursing Homes and other communities is something caregivers should ask about. I found those questions on a pre-tour checklist from senior care very helpful.
im wettbüro des teufels
my web site … Basketball wetten Tipps Heute
Thank you for outlining how Assisted Living balances support with independence. That middle ground is exactly what many older adults need. I recently visited assisted living and it gave me even more insight into the different types of senior communities.
Ich kenne das nur zu gut. Bei mir endet es meistens auch mit „nur noch eine Folge“, bis es plötzlich zwei Uhr nachts ist. Um das zu vermeiden, lege ich mein Handy jetzt in einen anderen Raum, bevor ich den Fernseher einschalte entspannung finden mit meditativen filmen
It’s refreshing to see a non-scary explanation of senior living options. There’s a lot of fear around the idea of “going to a home.” Articles like this and resources such as senior care help make the process more understandable.
Love that you encourage families not to rush the process. We have a step-by-step timeline on respite care that supports that mindset.
В данной статье рассматриваются физиологические и эмоциональные аспекты зависимости. Мы обсудим, как организм реагирует на зависимое поведение, и какие методы помогают восстановить здоровье и внутреннее равновесие.
Наши рекомендации — тут – [url=https://sumkibudni.ru/bedy-ot-alkogolizma-i-preimushhestvo-kodirovaniya-ot-alkogolizma-v-luganske/]detox24 в луганске[/url]
Thanks for the advice about prepping EVs for transport. I arranged my Joliet EV shipment through Joliet car moving services and the carrier knew the drill.
Das Thema spricht mir echt aus der Seele. Besonders bei Online-Zahlungen finde ich es extrem nervig, wenn der Status unklar bleibt und man ewig auf eine Bestätigung wartet Klicken Sie hier für mehr Informationen
Der Artikel hat absolut recht, viele Leute schauen nur auf die Mbit-Zahl und ignorieren die Latenz völlig. Besonders wenn ich versuche, im Zug zu arbeiten, merke ich diesen Unterschied extrem Server Reaktionszeit verbessern Anleitung
Der Artikel spricht mir wirklich aus der Seele. Bei mir ist es meistens der erste Blick aufs Handy direkt nach dem Aufwachen, noch bevor ich überhaupt aufgestanden bin endlos scrollen stoppen
jogos de apostas
My page: Basketball-wetten.Com
Ich habe neulich versucht, mein Konto nach einer freiwilligen Sperre wieder freischalten zu lassen. Der Prozess lief an sich gut, aber die Wartezeit fühlte sich ziemlich lang an fremdsperre oasis voraussetzungen und beweise
For dealerships moving inventory to Corpus Christi, bulk rates help. We coordinated five vehicles through Corpus Christi auto shippers near me and got a multi-car discount.
Das kenne ich nur zu gut! Bei mir endet es auch ständig mit dem „nur noch eine Folge“ Syndrom, bis es plötzlich zwei Uhr nachts ist. Um das zu vermeiden, lege ich mein Handy mittlerweile in einen anderen Raum Diese Seite überprüfen
If you need a reliable moving company in Huntington, look no further! This team was fast, careful, and very easy to work with. Huntington international moving
Vielen Dank für den interessanten Einblick in die regulatorischen Unterschiede. Es ist oft wirklich verwirrend, welche Regeln in welchem Land genau gelten dsgvo alltag
Медицинская публикация представляет собой свод актуальных исследований, экспертных мнений и новейших достижений в сфере здравоохранения. Здесь вы найдете информацию о новых методах лечения, прорывных технологиях и их практическом применении. Мы стремимся сделать актуальные медицинские исследования доступными и понятными для широкой аудитории.
Все материалы собраны здесь – [url=https://zhivotu.net/kak-trezvost-menyaet-telo-i-dushu/]врач нарколог на дом[/url]
For natural stone, ask about pH-neutral cleaners and sealing. I found stone-certified techs via affordable st george carpet cleaning .
Great breakdown on common iPhone battery myths. For those seeing rapid drain or shutdowns, a proper battery health test helps. I booked mine through Mobile Repair and the turnaround was super quick.
узнать больше [url=https://www.onlyfake.org/]onlyfake official website[/url]
I liked your focus on occurrence reporting. white card certificate adelaide has a downloadable occurrence form template that comes in handy for practice.
Your lawn care pointers reduced ticks for us. I matched them with advice from pest control contractor .
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 help families understand these benefits.
For older adults who value privacy, small homes can often provide private or semi-private rooms while still delivering close, supportive care. It’s the model that respite care seems to champion.
Our new recliner from Best Mattresses Santa Cruz SC41 Furniture & Mattresses blends with coastal decor with no searching cumbersome.
For seniors, privacy and dignity during personal care are crucial. Smaller homes are better at balancing close supervision with respect. senior care sheds light on this style of care.
For seniors who feel anxious in crowds, a smaller assisted living home can make basic activities like eating or going to the bathroom much less stressful. respite care is a good resource for exploring that option.
рейтинг лучших клининговых компаний
cheltenham ante post betting odds
Here is my website – https://Horse-Betting.Com/
Эта информационная публикация освещает широкий спектр тем из мира медицины. Мы предлагаем читателям ясные и понятные объяснения современных заболеваний, методов профилактики и лечения. Информация будет полезна как пациентам, так и медицинским работникам, желающим поддержать уровень своих знаний.
Получить полную информацию – [url=https://psihologii.ru/path-sblf/]детокс24[/url]
В этой статье мы рассматриваем разрушительное влияние зависимости на жизнь человека. Обсуждаются аспекты, такие как здоровье, отношения и профессиональные достижения. Читатели узнают о необходимости обращения за помощью и о путях к восстановлению.
Узнать больше – [url=https://golubevod.net/kak-bystro-snyat-tyazheloe.html]детокс24[/url]
Das ist ein wirklich spannendes Thema. Ich finde es besonders wichtig, dass man bei Auszahlungen sofort sieht, ob das Geld tatsächlich unterwegs ist. Diese Ungewissheit, ob die Zahlung im System feststeckt, stresst mich meistens extrem Die ursprüngliche Quelle
Читатели получат представление о том, как современные технологии влияют на развитие медицины. Обсуждаются новые методы лечения, персонализированный подход и роль цифровых решений в повышении качества медицинских услуг.
Читать дальше – [url=https://systawy.ru/narkolog-na-dom-kogda-neobhodima-pomosch-spetsialista/]alco rehab[/url]