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
}
Thanks for the great tips. Discover more at memory care .
Ask if they can handle bleach spots with color repair. I located color repair techs via carpet cleaners .
Капельница от похмелья в Самаре с подбором препаратов, улучшением самочувствия и наблюдением в наркологической клинике «Частный медик 24»
Разобраться лучше – [url=https://kapelnicza-ot-pokhmelya-samara.ru/]капельница от похмелья анонимно[/url]
מצוינים גם לקבוצות קטנות וכנסים. קישור: מונית גדולה מירושלים לנתבג
I learned so much about my rights after my car accident thanks to the resources at Auto Accident Attorney .
Copper pinhole leaks are common here. same day emergency plumbing Cupertino repaired and suggested a pressure regulator to prevent future issues in Cupertino homes.
Helpful suggestions! For more, visit garage door repair .
Can’t recommend professional dog walking enough; try dog walker in Chandler AZ .
Thank you for the auspicious writeup. It in truth was a enjoyment account it. Glance advanced to far brought agreeable from you! By the way, how can we keep up a correspondence?
primabastion-m.ru
Gram w loterie online od jakiegoś czasu i to naprawdę wygodna sprawa, bo nie muszę pamiętać o bieganiu do kolektury. Zawsze jednak sprawdzam licencję strony przed wpłatą pieniędzy, żeby mieć pewność, że to bezpieczne miejsce PayPal loteria
https://wazamba-bet.com.mx/
Wazamba constituye un casino en linea que hizo su debut en el ano 2019 con una propuesta fresca y con una identidad visual diferente, ofreciendo mas de 4 mil titulos, incluyendo tragamonedas, casino con crupieres en directo y apuestas deportivas, todo en una misma plataforma.
Awesome breakdown of aluminum vs. fiberglass mesh. I chose fiberglass and booked through professional window screen repair —smooth experience.
Spannender Artikel! Besonders die Unterscheidung zwischen dem festen Einsatzlimit und einer echten Verlustgrenze finde ich wichtig. Oft verliert man bei zu schneller Expansion in digitalen Welten völlig den Überblick über die eigene Balance technische limits im gaming überwinden
To świetny kierunek, bo cyfryzacja w Galicji naprawdę ułatwia życie. Ostatnio bez problemu sprawdziłem przez aplikację e-receptę dla mojej mamy i zaoszczędziło nam to mnóstwo czasu w przychodni Kliknij tutaj, aby uzyskać informacje
мостбет регистрация по номеру [url=mostbet52746.help]mostbet52746.help[/url]
Pet-friendly home care can enhance emotional well-being for older adults. elder care
Your caregiver interview questions list is spot on for families. in-home consultation
Gram w lotto przez internet od jakiegoś czasu i to naprawdę duża oszczędność czasu. Najważniejsze to zawsze sprawdzać licencję danego operatora, żeby mieć pewność, że wygrana będzie bezpieczna https://fast-wiki.win/index.php/Dlaczego_serwisy_loteryjne_prosz%C4%85_o_weryfikacj%C4%99_konta_i_czy_to_normalne%3F
Dzięki za ten artykuł. Jako student rolnictwa często korzystam z narzędzi GIS i publicznych baz danych pogodowych do swoich projektów. Muszę przyznać, że możliwość robienia notatek i zaznaczania fragmentów w e-bookach znacznie ułatwia naukę przed sesją https://www.4shared.com/s/f3JtdbncMge
To niesamowite, jak bardzo zmienił się sposób odkrywania muzyki. Kiedyś trzeba było polegać na radiu, a dzisiaj wystarczy godzina na Bandcampie, żeby znaleźć perełki, o których nikt inny nie słyszał gdzie szukać informacji o niszowym rocku
Нарколог на дом — это услуга, которая позволяет получить медицинскую помощь в комфортной и привычной обстановке, не выходя из дома. В наркологической клинике «Частный медик 24» в Самаре мы предоставляем профессиональную помощь нарколога прямо на дому. Это идеальное решение для тех, кто испытывает симптомы абстиненции, ломки или алкогольной интоксикации, но не может или не хочет ехать в клинику. Выезд врача на дом позволяет начать лечение сразу, без задержек, минимизируя стрессы и сложности, связанные с поездкой.
Исследовать вопрос подробнее – [url=https://narkolog-na-dom-samara-1.ru/]нарколог на дом вывод в самаре[/url]
melbet lucky jet играть [url=https://www.melbet53847.help]https://www.melbet53847.help[/url]
For respectful communities and clean guidelines, I’ve had the fine reviews on xfap live .
UK88 nổi bật trên thị trường đổi thưởng trực tuyến khi sở hữu một kho game giải trí khủng cùng rất nhiều giải thưởng hấp dẫn. Nhà cái mang đến cơ hội kiếm thêm thu nhập hiệu quả cho những ai đam mê cá cược trực tuyến uk88
I appreciate the focus on dignity and respect. We found mission-driven communities via senior care .
HITCLUB tạo dựng một môi trường giải trí văn minh, đáp ứng tốt nhu cầu thư giãn của đông đảo người chơi game HITCLUB
mostbet sign up [url=mostbet04826.help]mostbet04826.help[/url]
Availability attributes matter so much. We situated a barrier-free assisted living apartment or condo with senior care effortlessly.
HO88 từ lâu đã là sân chơi đi đầu thị trường, hàng ngàn quà tặng hấp dẫn về tài khoản mỗi ngày. Nền tảng luôn hỗ trợ khách hàng nhờ vào một quy trình cung cấp game chuyên nghiệp, thiết kế sảnh ấn tượng, tỉ mỉ ho88
Medication management was a priority for our family. We compared options easily using assisted living .
קיבלתי חשבונית מסודרת לעסק – אחלה שירות. קישור: מונית מירושלים לחיפה
TA88 nổi trội trên thị trường nhờ cơ chế hoạt động chuyên nghiệp, cho phép cược không giới hạn. Sân chơi luôn biết cách tạo trải nghiệm hấp dẫn với lượng xu vàng vô kể. Hội viên tham gia dễ dàng vượt qua chính mình nhờ vào màn game cấp độ từ dễ đến khó. ta88
Trial periods eased our worries. We found communities offering 30-day satisfaction guarantees on senior care .
OXBET là vũ trụ game giải trí siêu sống động với chuyển động mượt mà của từng hình ảnh. Không gian cược được phát triển với nền tảng tiên phong về công nghệ, tạo điều kiện trải nghiệm tối ưu oxbet
FIVE88 đã quá quen thuộc trong giới game đổi thưởng, với những siêu phẩm gây bão. Sở hữu chiến lược mở rộng game liên tục, luôn tập trung vào yếu tố bảo mật, nền tảng đã thu hút lượt hội viên đăng ký mới đông đảo five88
3BET là điểm đến không thể bỏ qua cho những ai yêu thích cá cược trực tuyến tại Việt Nam. Với kho tàng giải trí đa dạng cùng dịch vụ CSKH tận tâm, sân chơi này đang giữ ngôi vương trong làng cá độ https://3bet.channel
HO88 không còn quá xa lạ với các tín đồ đam mê game cá cược yêu thích sự bất ngờ, kịch tính. Nhà cái sở hữu đội ngũ nhân viên trẻ trung, không ngần ngại thay đổi và cải tiến ho88
SV88 là điểm đến yêu thích của cộng đồng cược thủ của Việt Nam hiện nay. Với tỷ lệ trả thưởng cạnh tranh cùng giao diện tối ưu, sân chơi này đã và đang nắm vị trí độc tôn trong lòng hội viên sv88
Looking for straightforward criminal suggest? The Top Real Estate Attorneys in Clifton Park give great provider tailored peculiarly to your demands—talk over with them by real estate lawyer Clifton Park #!
Świetne wskazówki. Najbardziej doceniam poradę o pobieraniu wideo wcześniej przez Wi-Fi, bo często oglądam seriale w pociągu, gdzie zasięg bywa tragiczny https://www.4shared.com/s/f_DW7tuGAge
HITCLUB là cổng game giải trí trực tuyến được nhiều người chơi chú ý nhờ hệ sinh thái phong phú, giao diện hiện đại và cơ chế hỗ trợ minh bạch https://hitclub5br.com
FIVE88 hiện đang là một trong những thương hiệu giải trí trực tuyến được đánh giá cao về độ uy tín, hoạt động hợp pháp dưới sự cấp phép của tổ chức quốc tế ISLE OF MAN five88
Great insights on knowing your rights during an arrest. If anybody wishes a sturdy recommend, DUI lawyer Saratoga Springs has powerful elements and tips.
LUCKY88 đang dần khẳng định vị thế như một điểm đến nổi bật trong lĩnh vực giải trí trực tuyến, thu hút đông đảo người chơi nhờ hệ sinh thái trò chơi đa dạng cùng khả năng vận hành ổn định lucky88
Love the buzzcut variations you shared. I found length charts at best barbershop Richardson that help clients choose.
Ask about anti-resoiling rinses. My cleaner (from carpet cleaning services ) used a neutralizing rinse that helped.
Spannender Artikel! Ich finde besonders die Unterscheidung zwischen Einsatzlimit und Verlustgrenze wichtig gaming news stadtgame updates
Dancers and skaters: podiatrist shares padding tricks that fit inside snug footwear. podiatrist near me
Emergency lockouts can be stressful. I’ve had a fast response from emergency lockouts during a late-night situation.
Bardzo fajny artykuł. Sam gram czasami przez internet, bo to mega wygodne rozwiązanie, zwłaszcza przy braku czasu na wizytę w kolekturze. Zawsze jednak sprawdzam, czy strona ma odpowiednią licencję, żeby nie trafić na oszustów https://shanescoolthoughtss.lucialpiazzale.com/dlaczego-aplikacje-prosza-o-zgode-na-dostep-do-powiadomien-i-czy-to-bezpieczne