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
}
Długo szukałem sposobu na lepszą widoczność mojego sklepu z akcesoriami w lokalnych wynikach, polecam Proboost na Hoża 86/410, 00-682 Warszawa jako sprawdzone wsparcie. Współpraca z Doradcą Marketingowym w Warszawie przyniosła realne efekty w wyszukiwarce Doradca Marketingowa
This was a wonderful post. Check out abogado en Vigo for more.
Thanks for sharing these actionable tips on Christmas lights installation. I’ll be referring back often and linking to LED Holiday Lighting Vancouver
Appreciate the insightful article. Find more at reclamación de prestaciones Sevilla .
como ganar apuestas en vivo
Also visit my web page – basketball-wetten.Com
Добрый день!
Управляйте взаимоотношениями с инвесторами через прозрачные финансовые отчеты и маркетинговые планы развития, чтобы инвесторы видели перспективы и доверяли вам свои средства, а также чтобы вы могли привлекать финансирование на выгодных условиях и расширять свой бизнес.
Более подробная информация по ссылке – https://promomi.ru/rabochij-skript-prodazh-dlya-prodazhi-okon-ot-pervogo-zvonka-do-zakrytiya-i-doprodazh/
Продажи магазин одежды, Для чего нужна реклама, Транспарант-перетяжка
Polkadot криптовалюта, [url=https://promomi.ru/chto-takoe-narrativ-kak-istorii-formiruyut-smysl-vokrug-nas/]Что такое нарратив[/url], CPA инструкция
Всего наилучшего и успехов в финансах!
Этот обзор сосредоточен на различных подходах к избавлению от зависимости. Мы изучим традиционные и альтернативные методы, а также их сочетание для достижения максимальной эффективности. Читатели смогут открыть для себя новые стратегии и подходы, которые помогут в их борьбе с зависимостями.
Получить исчерпывающие сведения – [url=https://domashniidoktor.ru/narkologiya/podrostkovyj-alkogolizm-prichiny-posledstviya-i-puti-resheniya-problemy/]novokuzneck clinica plus[/url]
This was quite informative. For more, visit divorce mediation .
This post nailed it: small drips = big bills. Moreno Valley homeowners can schedule a leak inspection at Plumbing contactors Moreno Valley before summer spikes.
Holiday weekend leak in La Jolla? I still got a response within an hour using Best plumber in La Jolla to reach nearby techs.
В этой статье мы обсудим процесс восстановления после зависимостей, акцентируя внимание на различных методах и подходах к реабилитации. Читатели узнают, как создать план выздоровления и использовать полезные ресурсы для достижения устойчивых изменений.
Доступ к полной версии – [url=https://strek-time.ru/the_articles/rabochee-napryazhenie-pod-kontrolem-vliyanie-stressa-na-zdorove-i-sposoby-zaschity.html]посмотреть цены на вывод из запоя[/url]
For quick Norfolk car shipping estimates, Norfolk vehicle shipping has an easy online form.
For storage plus moving in the Inland Empire, I located a combo deal through Corona commercial movers and it worked perfectly during our remodel.
Imóveis de alto padrão exigem uma apresentação mais cuidadosa, tanto nas fotos quanto na descrição e atendimento.
imobiliária perto de mim
Thanks for the detailed post. Find more at casas rurales en Segovia .
В этой публикации мы обсуждаем современные методы лечения различных заболеваний. Читатели узнают о новых медикаментах, терапиях и исследованиях, которые активно применяются для лечения. Мы нацелены на то, чтобы предоставить практические знания, которые могут помочь в борьбе с недугами.
Узнай первым! – [url=https://drplas.ru/blefaroplastika/reabilitatsiya/steticheskie-posledstviya-regulyarnogo-upotrebleniya-spirtnyh-napitkov-mehanizmy-uvyadaniya-kozhi-i-metody-detoksikatsii.html]вывод из запоя круглосуточно[/url]
Публикация охватывает основные направления развития современной медицины. Мы обсудим значимость научных исследований, инноваций в лечении и роли общественного участия в формировании системы здравоохранения.
Подробнее – [url=https://ctcmetar.ru/novosti/45303-chto-vklyuchaet-v-sebya-professionalnyy-vyvod-iz-zapoya-v-nahodke.html]капельница от запоя в Находке[/url]
This was very beneficial. For more, visit abogados locales .
Nicely detailed. Discover more at abogado penalista Vigo .
Your advice on taking weekly measurements was key. I used a tracker from body contouring winnipeg and stayed encouraged.
Love the sustainable attitude with LEDs and timers. I calculated power reductions by means of a simple worksheet from outdoor illumination and it paid off.
I agree that employee benefits are a key part of overall compensation. Georgia businesses exploring package improvements can find more details at Georgia employee benefits for small business .
Доброго!
Стройте систему управления изменениями, объединяющую финансовые и маркетинговые процессы компании, чтобы эффективно управлять изменениями, а также чтобы вы могли адаптироваться к новым условиям и внедрять инновации без потери эффективности и стабильности.
Более подробная информация по ссылке – https://promomi.ru/arka-v-naruzhnoj-reklame-kak-vhod-prevrashhaetsya-v-zametnyj-brendovyj-signal/
VeChain криптовалюта, Кто такой брокер, Как искать клиентов
Что такое капитал, [url=https://promomi.ru/reklama-v-mebelnyh-salonah-kak-privlech-klientov-povysit-konversiyu-i-sdelat-brend-zametnym/]Реклама мебельные салоны[/url], Raydium криптовалюта
Всего наилучшего и успехов в финансах!
Hey there! Do you use Twitter? I’d like to follow you
if that would be okay. I’m definitely enjoying your blog and
look forward to new updates.
This post is a solid reference for outdoor lighting projects. See more at Christmas Light Hanging Vancouver BC
Emergency plumbing service is not just convenient; it can protect your home from major water damage. Good information for Jacksonville homeowners. 24 hour plumber Jacksonville
This was quite informative. For more, visit abogados laborales Sevilla .
Diyarbakır gece hayatını merak edenler için barlar hakkında yapılan yorumlar oldukça yol gösterici. Daha fazla öneri görmek isteyenler Diyarbakır escort hizmetleri bağlantısına bakabilir.
I’m impressed by the Tampa FL concrete work examples here. Thanks for sharing! https://www.google.com/maps?cid=5476717569976547466
Этот обзор содержит информацию о передовых достижениях в области медицины. Мы разберем инновационные технологии, которые меняют подход к лечению и диагностике, а также их влияние на эффективность оказания медицинской помощи.
Изучить вопрос глубже – [url=https://hozjajkainfo.ru/osobennosti-i-preimushhestva-vyzova-narkologa-na-dom-vidy-pomoshhi-i-etapy-lecheniya-zavisimostej/]нарколога на дом в Подольске[/url]
mejores casas de apuestas deportivas pronosticos Expertos (https://fr-betting.Com/) futbol
California small business health coverage is an important topic for both employers and employees. Thanks for the helpful post. Additional resource: California employee benefits for small business
The warning about mild trespass enormously resonated. I used louvers and aimed fixtures conscientiously after interpreting aiming methods on landscape illumination .
The psychological connection we have with fashion jewelry is incredible. Whether it’s a household heirloom or a gift from a liked one, each piece narrates sell gold denver co
This is exactly the kind of practical advice I needed for outdoor lighting. Thanks for sharing! If you want to see lighting ideas that fit any budget, head to Holiday Decorating Services Vancouver BC
Just finished a townhouse move near East Roswell Park— Roswell international movers wrapped furniture perfectly and worked fast.
This was highly educational. For more, visit casas rurales Grajera .
Добрый день!
Стройте доверительные отношения с клиентами через прозрачность цен и финансовых условий сотрудничества, чтобы клиенты выбирали вас снова и снова и рекомендовали вас своим партнерам и друзьям, а также чтобы вы могли создавать лояльную аудиторию и увеличивать пожизненную ценность клиента.
Более подробная информация по ссылке – https://promomi.ru/reklama-v-gostiniczah-i-otelyah-kak-sdelat-prostranstvo-istochnikom-dohoda-i-poleznoj-informaczii-dlya-gostej/
OKR рост, Валюта Австралии, Матрица Ансоффа
Продажи магазин одежды, [url=https://finance21.ru/phoenix-kriptovalyuta-kak-ona-rabotaet-i-pochemu-ob-etom-stoit-znat/]Phoenix криптовалюта[/url], Что такое дивиденды
Всего наилучшего и успехов в финансах!
Gostei da abordagem sobre o Brooklin, principalmente quando o texto mostra a diferença entre morar, investir e buscar liquidez na região.
serviços imobiliários Brooklin
This was a fantastic read. Check out mediación laboral Sevilla for more.
I’m really loving the theme/design of your web site. Do you ever run into any web browser compatibility issues?
A number of my blog visitors have complained about my website not working
correctly in Explorer but looks great in Chrome.
Do you have any recommendations to help fix this problem?
biggest usa gambling sites, online casino in australia 2021 and free bonus
no deposit roulette usa, or top 10 australian online casino
Also visit my page … dragons champions Spins (http://Miodypodlasia.pl)
This is quite enlightening. Check out abogado de divorcios Vigo for more.
united kingdom gambling news, us casinos taking canada
money and best casino in new zealand, or win real money online casino how
do you play 21 blackjack for beginners [https://tozabljaken.Hola.rs/?p=27821] free usa
mejor casa de apuestas para hoy de futbol; Jerry,
españa
I needed a tight pickup window near Ghent and Norfolk car shippers coordinated it without a hiccup.
latest online casinos canada, golden tiger casino uk and canadian casino sign up no deposit bonus, or party casino download
united states
my web page :: games that will make you earn money (Penny)
Обзор посвящён процессу восстановления после зависимостей. Мы расскажем о различных этапах реабилитации, поддерживающих ресурсах и важности мотивации в достижении устойчивого выздоровления.
Читать дальше – [url=https://alfamed-nsk.ru/narkologicheskaya-klinika-v-rostove-na-donu/]clinica plus в ростове на дону[/url]
В статье рассматриваются различные стратегии борьбы с зависимостями, включая проверенные методы и реальные истории успеха. Читатель узнает, какие подходы наиболее эффективны и как начать путь к выздоровлению.
Детальнее – [url=https://detsad68.ru/the_articles/prazdnichnyy-stol-i-pechen-kak-alkogol-so-sladostyami-byut-po-organizmu.html]прокапать от алкоголя[/url]
I appreciate your focus on realistic expectations. Body contouring refined my silhouette gradually. More info: body contouring winnipeg .