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
}
Make sure your car is under a quarter tank before shipping to or from Philadelphia. Good reminders here: Philadelphia auto transport companies
Just wanted to spread the word about a great plumber I found using emergency plumbers near me here in Sandpoint!
I revel in discovering how specific cultures interpret the colours and emblems on their historic flags! buy flag online
Awesome article! Discover more at Hampton Bay’s #1 Power Washing | House & Roof Washing .
1win комиссия элсом [url=http://1win95124.help]http://1win95124.help[/url]
В Нижнем Новгороде стационарный формат лечения применяется при наличии факторов, повышающих риск осложнений или снижающих эффективность домашней терапии. Врач принимает решение на основании осмотра, консультации и анализа данных, оценивая текущее состояние пациента и его реакцию на предыдущие попытки лечения. При необходимости можно заранее обратиться в центр лечения алкоголизма и наркомании или заказать услугу по телефону.
Ознакомиться с деталями – [url=https://vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-2.ru/]вывод из запоя капельница на дому[/url]
mostbet belépés link [url=www.mostbet2025.help]www.mostbet2025.help[/url]
mostbet befizetés visszatartva [url=https://mostbet2025.help/]https://mostbet2025.help/[/url]
My cycling performance improved after working with a chiropractor on spinal alignment. Car accident chiropractor Tacoma
mostbet aktualizace aplikace [url=mostbet2020.help]mostbet2020.help[/url]
Their customized rehabilitation programs ensure patients recover fully from injuries with exercises designed to restore strength and mobility. Injury chiropractor
Just reached out to a couple of ###key phrase### for quotes; hoping to choose quickly! pool installation Royal Pools
Patients come from Pasco, Richland, and beyond to receive the area’s most trusted chiropractic care. Chiropractor
Капельница от похмелья может быть необходима в самых разных ситуациях, когда симптомы становятся слишком выраженными и мешают нормальному функционированию пациента. Если вы или ваши близкие сталкиваетесь с такими признаками, как сильная головная боль, рвота, слабость и головокружение, то немедленный вызов нарколога на дом станет необходимостью. Важно не откладывать помощь, так как интоксикация может усугубить состояние пациента и привести к осложнениям, таким как обезвоживание или нарушения работы сердца.
Получить больше информации – [url=https://kapelnicza-ot-pokhmelya-ekaterinburg-8.ru/]капельница от похмелья цена[/url]
mostbet kombinovaný tiket [url=www.mostbet2020.help]www.mostbet2020.help[/url]
If you’re self-employed, Car Accident shows how to prove income loss properly.
В Санкт-Петербурге вывод из запоя на дому рассматривается, когда состояние пациента позволяет проводить лечение вне стационара, но требует контроля специалиста. Врач оценивает общее состояние, длительность запоя и выраженность симптомов, после чего принимает решение о формате помощи при алкоголизме. Важно, что лечение начинается сразу после осмотра, без необходимости ожидания госпитализации. При необходимости можно заказать услуги на сайте клиники или получить консультацию специалистов.
Ознакомиться с деталями – http://vyvod-iz-zapoya-na-domu-sankt-peterburg-8.ru
This was a fantastic read. Check out Denver Regenerative Med for more.
Всем любителям кино, наткнулся на удобную платформу смотреть кино онлайн — называется KinoStart.
Смотрите фильмы онлайн с KinoStart и наслаждайтесь каждым моментом. Мы собрали для вас лучшие работы режиссеров со всего мира. [url=https://www.kinostart-1.top]кино база[/url] Откройте для себя шедевры киноискусства.
Если интересно, то вот: — https://www.kinostart-1.top
лучшие фильмы онлайн
фильмы фэнтези онлайн
фильмы онлайн без скачивания
Наслаждайтесь кино на KinoStart!
1вин Бишкек [url=http://1win95124.help]1вин Бишкек[/url]
мостбет скачать на андроид [url=https://mostbet09754.help]https://mostbet09754.help[/url]
This was quite useful. For more, visit Paxos Electric Company .
If you need backup on long workdays, find a dog walker Chandler AZ has dependable walkers.
Love how accommodating ## anyKeyWord # # is when it comes to scheduling—I can always find what works best for me. commercial cleaning company near me
Hi there just wanted to give you a quick heads up and let
you know a few of the pictures aren’t loading properly.
I’m not sure why but I think its a linking issue. I’ve tried it in two different internet browsers and both show
the same outcome.
mostbet setări limbă [url=https://mostbet57648.help]https://mostbet57648.help[/url]
For herds battling heat stress and anxiety, we shifted OPU to early mornings and boosted cooling pre-collection. Situation keeps in mind at cattle IVF service providers mirror the renovations we observed in oocyte quality.
После того как вы вызвали нарколога на дом, врач проводит первичную консультацию и осмотр пациента, чтобы оценить его состояние. На основе полученных данных подбирается подходящая терапия, которая может включать в себя капельницу, препараты для снятия симптомов похмелья и других проблем, связанных с интоксикацией. Процесс лечения проводится с использованием препаратов, которые помогают восстановить нормальное функционирование организма и снять токсическое воздействие алкоголя на сердце, печень и другие органы.
Получить дополнительные сведения – [url=https://kapelnicza-ot-pokhmelya-ekaterinburg-6.ru/]kapelnicza-ot-pokhmelya-ekaterinburg-6.ru/[/url]
1win депозит через мегапей инструкция [url=http://1win95124.help/]http://1win95124.help/[/url]
I kept communication in writing as Auto Accident Attorney advised, preventing misunderstandings.
The airflow versus filtration section was clear. window screen services helped pick a mesh that suits our climate.
мостбет бонус без депозита [url=https://www.mostbet26849.help]https://www.mostbet26849.help[/url]
mostbet nowy użytkownik [url=www.mostbet2001.help]www.mostbet2001.help[/url]
melbet промокод киргизия [url=https://www.melbet16740.help]melbet промокод киргизия[/url]
I learned to avoid abrasive brushes the hard way— vinyl fence panel repair has a tool list that won’t scratch.
Эти симптомы характерны для алкогольной интоксикации, и их быстрое устранение с помощью капельницы позволяет пациенту почувствовать себя лучше и избежать более серьёзных последствий. В клинике «Частный медик 24» мы подбираем индивидуальную программу лечения, чтобы ускорить восстановление организма и улучшить общее самочувствие пациента.
Подробнее можно узнать тут – https://kapelnicza-ot-pokhmelya-ekaterinburg-5.ru/
Your before-and-after shots tell the story. I’ve posted mine on best barber shop in Richardson to track progress.
Just reached out to a couple of official corporations that specialize in residential pools—hoping they’re as very good as every body says they are! solar pool heater Royal Pools
Discover the amazing features of [url=https://hghjfjdossa.netlify.app]hghjfjdossa[/url] and elevate your experience today.
The outlook for hghjfjdossa is optimistic with many opportunities.
Наркологический стационар в Санкт-Петербурге предоставляет пациентам комплексное лечение зависимости от психоактивных веществ. Проблемы, связанные с алкоголизмом, наркоманией и другими формами зависимости, требуют индивидуального подхода и профессиональной помощи. Комплексное лечение в таких учреждениях позволяет не только пройти детоксикацию, но и получить полноценную реабилитацию, что дает пациентам шанс на долгосрочную ремиссию и улучшение качества жизни. В некоторых случаях, при запое или необходимости выезда на дом, может быть предложен центр, где решаются все вопросы, связанные с лечением зависимости и восстановлением пациента.
Подробнее – [url=https://narkologicheskij-staczionar-sankt-peterburg-1.ru/]наркологический стационар санкт-петербург[/url]
Fortune Dragon foi destaque entre os lançamentos mais comentados.
https://uu666.camp/
условия ипотеки Это позволяет быстрее стать владельцем нового жилья.
“Капельница с мягким восстановлением идеально подходит тем, кто ищет постепенный и безопасный способ вернуть себе нормальное состояние после пьянки. Такой подход не перегружает организм и помогает избежать нежелательных эффектов от слишком резкого восстановления.” — Алексей Смирнов, нарколог, клиника восстановления.
Выяснить больше – [url=https://kapelnicza-ot-pokhmelya-samara-12.ru/]капельница от похмелья[/url]
подробнее http://www.google.td/url?q=https://travelanswer.ru/questions/gde-v-namibii-mozhno-uvidety-nosorogov-v-estestvennoy-srede-obitaniya.html
Капельница от похмелья в Самаре с устранением симптомов интоксикации и контролем состояния в наркологической клинике «Частный медик 24»
Изучить вопрос глубже – [url=https://kapelnicza-ot-pokhmelya-samara-2.ru/]www.domen.ru[/url]
cum primesc bonus la mostbet [url=www.mostbet57648.help]cum primesc bonus la mostbet[/url]
мостбет в узбекистане [url=mostbet26849.help]mostbet26849.help[/url]
В таких ситуациях врач оценивает риски, определяет тактику лечения и при необходимости рекомендует дальнейшую госпитализацию. Однако во многих случаях помощь на дому оказывается достаточной для стабилизации состояния.
Подробнее тут – [url=https://narkolog-na-dom-nizhnij-novgorod.ru/]нарколог на дом[/url]
typy mostbet [url=www.mostbet2001.help]www.mostbet2001.help[/url]