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
}
Working with Isaac right now became an schooling in diamonds. His capabilities in reduce nice modified how I suggestion about what I was once shopping Chicago Jewelry Store
Appreciate the thorough insights. For more, visit Marketing agency .
Helpful post — booked corporate ORD limo for a Lake Geneva weekend and the limo added luxury to our trip.
Основные показания для проведения процедуры:
Подробнее – [url=https://kapelnicza-ot-pokhmelya-voronezh-4.ru/]капельница от похмелья вызов на дом в воронеже[/url]
Make sure you get a signed Bill of Lading with condition photos. I downloaded a template from Scottsdale door-to-door auto transport and it made delivery inspection painless.
I found a great Tacoma chiropractor through Chiropractic Tacoma and it has changed my life!
Having a car accident lawyer in Kent WA talk to the adjusters prevents them from twisting your words. Car accident lawyer in Kent
This is such an important topic; I hope more people seek out help from their local Northgate Chiropractors soon! Chiropractor in Northgate
Такие симптомы требуют медицинского вмешательства, поскольку могут усиливаться и приводить к ухудшению состояния. Капельница позволяет стабилизировать самочувствие и снизить нагрузку на организм. Услуги могут предоставляться анонимно, а при необходимости пациент направляется на лечение в стационаре.
Разобраться лучше – [url=https://kapelnicza-ot-pokhmelya-voronezh-8.ru/]капельница от похмелья на дом воронеж[/url]
Отдельного внимания требуют случаи, когда больной почти не ест, плохо пьет воду, не может спокойно лежать, жалуется на сильное сердцебиение, нехватку сна или выраженное внутреннее напряжение. В такой ситуации осмотр помогает определить, безопасно ли оставаться дома и какого объема помощи достаточно на текущем этапе. Если речь идет о выраженных проявлениях абстинентного синдрома, затягивать с обращением нецелесообразно.
Получить больше информации – [url=https://narkolog-na-dom-ekaterinburg-3.ru/]нарколог на дом[/url]
Reputable solution whenever with The Master’s Lawn & Pest! They’re certainly the most effective lawn care near me in St Augustine lawn care
Professional service whenever with The Master’s Lawn & Pest! They’re most certainly the best lawn care company in St Augustine. Their techs really detect dirt and grass problems, not just spray and pray, and their customer care is rapid and friendly lawn care st augustine
Vin88 là nhà cái cá cược top đầu với hệ thống trò chơi đa dạng: thể thao, casino trực tuyến, slot và bắn cá. App mượt, rút tiền nhanh, ưu đãi lớn, bảo mật tuyệt đối. Trải nghiệm sảnh game sống động và dịch vụ hỗ trợ 24/7 chuyên nghiệp bbc
1win tranzaksiya tarixi [url=http://1win49027.help]http://1win49027.help[/url]
Your health should come first, but don’t forget about getting legal help from a knowledgeable Truck Accident Attorney afterward!
Work travel injuries usually count. workers compensation lawyer clarifies exceptions and proof.
If you’re browsing for the “most tasty Sushi Restaurant near me” around St. Augustine, Ginger Bistro is a great decision! sushi
Real estate transactions are complicated; thankfully, there are trained legal professionals who specialize on this area right the following in Clifton Park! Explore techniques at real estate attorney clifton park !
Запой сопровождается интоксикацией, нарушением сна, слабостью, тревожностью и нестабильностью работы сердечно-сосудистой системы, что характерно для алкоголизма и других форм зависимости, включая наркомании. При этом самостоятельный выход из состояния может сопровождаться усилением симптомов, что требует медицинского вмешательства. Капельницы на дому позволяют очень быстро снизить выраженность проявлений и начать восстановление под наблюдением врача, помогая человеку стабилизировать состояние.
Подробнее можно узнать тут – [url=https://vyvod-iz-zapoya-na-domu-sankt-peterburg-11.ru/]нарколог на дом вывод из запоя в санкт-петербурге[/url]
1win onlayn kazino Azərbaycan [url=http://1win81936.help]http://1win81936.help[/url]
Excellent breakdown. If airflow is still weak, get a professional inspection via air conditioner repair .
If you’re serious about music, definitely check them out .
The lessons are way better than expected .
Legit , you’ll thank yourself later .
live music performance school
mostbet retragere MDL [url=http://mostbet87342.help]http://mostbet87342.help[/url]
Наркологическая помощь нужна не только тогда, когда ситуация выглядит критической со стороны. Она необходима и в тех случаях, когда зависимость повторяется циклично, а семья уже понимает, что прежние способы не работают. Чем раньше человек переходит от стихийных попыток справиться самостоятельно к профессиональной тактике, тем выше шансы стоновить процесс на менее тяжелом этапе.
Получить больше информации – [url=https://narkologicheskaya-pomoshh-voronezh.ru/]оказание наркологической помощи[/url]
I want to share my story. Last year, I was injured in a slip and fall along Route 9 in Saratoga Springs. I felt overwhelmed — between the hospital stays, lost income, and fighting my insurance carrier, I did not know where to turn saratoga springs law firm
If you’re searching for the “most tasty Chinese near me” in St. Augustine, Ginger Bistro is a must do! chinese food
Have visited a number of the stores on Jewelers Row through the years. dimend SCAASI is in a completely exceptional category for customer service and diamond wisdom. Worth the day out from any place in Chicago. Chicago Jewelry Store
Процедура проходит под наблюдением квалифицированного врача, что минимизирует риски для здоровья пациента и помогает ускорить процесс восстановления. Важно, что такой подход позволяет избежать госпитализации, что для многих пациентов является дополнительным комфортом.
Ознакомиться с деталями – https://vyvod-iz-zapoya-na-domu-ekaterinburg-19.ru/
I have actually been searching for a relied on Chiropractor near me in St Augustine and maintained seeing excellent reviews about Pain Relief Centre chiropractor st augustine
1win-ug [url=https://1win42605.help/]https://1win42605.help/[/url]
1win sports bonuses [url=http://1win5528.ru/]http://1win5528.ru/[/url]
sweet bonanza грн депозит [url=https://sweet-bonanza27450.help]sweet bonanza грн депозит[/url]
If you’re closing on a property very soon, do not forget about title insurance! Take a look at home title insurance saratoga county for guidance.
melbet eroare instalare apk [url=https://www.melbet63149.help]https://www.melbet63149.help[/url]
Fantastic article! really enjoyed it. nightclub Saratoga Springs NY
I found this very interesting. For more, visit greenville sc window film .
I love how chiropractic care has helped my posture! Thanks for the info, Chiropractor Tacoma .
Insurers are more respectful when they know a Kent personal injury attorney is prepared to litigate. Work injury lawyer
Exceptional service every time with The Master’s Lawn & Pest! They’re most certainly the best lawn care in Gainesville. lawn care
Продолжительное употребление алкоголя неизбежно переводит организм в состояние хронической интоксикации, при котором собственные компенсаторные механизмы перестают справиться с нарастающей токсической нагрузкой. Накапливающиеся продукты метаболизма этанола, дефицит электролитов, нарушение работы ферментных систем и дисфункция центральной нервной системы формируют клиническую картину, требующую не симптоматического облегчения, а комплексного медицинского вмешательства. Вывод из запоя в стационаре в Нижнем Новгороде в наркологической клинике «Стармед» организован с соблюдением современных протоколов доказательной медицины, где безопасность пациента, непрерывный мониторинг и персонализированный подбор терапии являются абсолютным приоритетом. Мы понимаем, что кризисные состояния не терпят отлагательств, поэтому наши квалифицированные специалисты готовы быстро оценить клиническую ситуацию, организовать безопасную транспортировку и запустить детоксикационный протокол без задержек. Все манипуляции проводятся в лицензированных условиях, с непрерывным отслеживанием витальных показателей и строгим соблюдением врачебной этики. Первичная оценка состояния начинается с дистанционной консультации, что позволяет врачам заранее подготовить необходимое оборудование, скорректировать план госпитализации и минимизировать время между обращением и началом терапии. Такой подход исключает хаотичные решения и фокусирует внимание на реальных медицинских проблемах, требующих системного решения.
Узнать больше – [url=https://vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-10.ru/]www.domen.ru[/url]
Thanks for sharing your story! I’m inspired to visit a Northgate Chiropractor after reading this. Car accident chiropractor Northgate
This helped me avoid common mistakes; workers compensation lawyer lists the top pitfalls and fixes.
Fantastic post, appreciate it!
personal stylist chicago
I savour how approachable and knowledgeable the Top Real Estate Attorneys in Clifton Park are! They truthfully take some time to explain all the things. Check them out at real estate closing attorney capital region ny .
FABET được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như casino, thể thao, đá gà và game bài, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc
UFC Georgy Shakhruramazanov vs Turpal Gediev
ACA Young Eagles 64 is a card built for grinders, pure and simple.
VIN88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như thể thao, casino, bắn cá và xổ số, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc
Стационарный формат отличается возможностью наблюдать состояние в динамике, своевременно корректировать лечение и контролировать течение абстинентного синдрома. Это особенно важно в ситуациях, когда домашнего наблюдения недостаточно, а риск осложнений требует более внимательного подхода. При выборе тактики учитывают не только текущее самочувствие, но и предшествующие эпизоды запоя, наличие хронических заболеваний, выраженность нарушений сна, поведения и вегетативных симптомов. В клинике такой подход позволяет организовать комплексное наблюдение, при котором состояние оценивают последовательно, а помощь выстраивают с учетом нагрузки на основные системы здоровья.
Получить дополнительную информацию – http://vyvod-iz-zapoya-v-staczionare-sankt-peterburg-19.ru/
1win mərc etmək Azərbaycan [url=https://www.1win81936.help]https://www.1win81936.help[/url]
RED88 được xây dựng như một nền tảng nội dung có cấu trúc rõ ràng với các chuyên mục tiêu biểu như casino, thể thao, nổ hũ và bắn cá, giúp người truy cập dễ dàng định vị và lựa chọn đúng nội dung mình quan tâm bbc