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
}
This was a great article. Check out roofing services for more.
מצוינים באופטימיזציה של חסכונות קיימים—ממליץ על איחוד הלוואות למשכנתא .
TOU arbitrage with batteries is complex; solar installers near me Davis, CA optimizes charge/discharge against tariffs.
В этой статье мы рассматриваем разрушительное влияние зависимости на жизнь человека. Обсуждаются аспекты, такие как здоровье, отношения и профессиональные достижения. Читатели узнают о необходимости обращения за помощью и о путях к восстановлению.
Погрузиться в детали – [url=https://chistotainfo.ru/uborka/sovety/blizkij-vypil-lishnego]капельница от запоя на дому круглосуточно[/url]
Thanks for the info. I reached out to locksmith and they were the related day locksmith I obligatory.
Cool to see tracker benefits— Danville, CA solar panel installers quoted single-axis systems for farms.
Enphase vs SolarEdge is a common debate— solar panel installation Grass Valley, CA lays out pros and cons clearly.
Appreciate the detailed information. For more, visit https://aureenjajb.raindrop.page/bookmarks-71740631 .
The peak shaving examples you gave match projects we’ve done via solar panel install Concord, CA .
My experience bringing a guest into ANA Lounge Lisbon—rules and cost: healthy food Lisbon lounge
This was highly helpful. For more, visit tubidy mp3 download .
Battery storage is a game-changer. I learned about hybrid inverters on solar providers before deciding.
The battery warranty depth chart was helpful; solar panel installation tracy summarizes cycles and throughput limits.
подробнее [url=https://vodka-bet.kz]vodka bet[/url]
Your insights on commercial OPEX budgeting helped; templates exist on solar installers rocklin Rocklin, CA .
I love how these hair ties are specifically designed for thin hair! It’s so frustrating when regular hair ties break easily. Thanks for sharing this list, I can’t wait to try some of these options! best durable hair ties for thick hair
Loved the wooden-and-glass composition of their contemporary venture; Henson Architecture continues to push thoughtful design. More at henson architecture services, .
Your discussion of microinverters is timely. We priced both with Stockton, CA solar providers before picking micros.
Поддержка во время отдыха — написали в мессенджер с вопросом по экскурсии, ответили быстро и помогли разобраться прямо из Анталии. Приятно когда агентство не исчезает после продажи. [url=https://turkey-tour-moscow.ru/]подбор тура в Турцию Москва[/url]
Thanks for the great explanation. Find more at firma de abogados en Vigo .
Excellent breakdown on repairing breezy frames. I sealed spaces with silicone, however the cold air continued up until I had the sash balances replaced– huge distinction. For anyone comparing do it yourself vs emergency window repairs near me
Solid wrap-up on solar project ROI. If anyone wants a custom quote, check affordable solar companies Yuba City .
http://qwf-instandhaltungssoftware.de/
Das Team von Qwf Instandhaltungssoftware praesentiert sich als ein vertrauenswuerdiger Partner fokussiert auf die deutsche Wirtschaftslandschaft, das anbietet ganzheitliche Ansaetze fuer alle die Effizienz schaetzen, sich auszeichnend durch auf Servicequalitaet. Besuchen Sie die Website auf dieser Seite.
Thanks for the useful post. More like this at Xeira.es comprar .
Very useful post. For similar content, visit roofing contractors .
This article replied my questions. I used locksmith near me and their same day locksmith service used to be reputable.
Loved the basement flooring tips. For moisture-resistant installs in Charlotte, try affordable flooring contractor Charlotte .
Wonderful tips! Find more at página extranjería España .
I used LoungeKey to enter ANA Lounge Lisbon—process recap on lounge access near Lisbon gates
If you want minimal downtime, solar companies Sacramento, CA lists installers with robust commissioning checklists.
Fantastic tips on keeping a clean filtration system—so important for overall pool health! Check out more at Swim and Spas Winnipeg Pool Supply Store .
Great tips on planning an office relocation to Brentwood, TN. We cut downtime by staggering our IT move over a weekend—learned that from resources like movers brentwood tn .
Your point about longevity sold me on using a specialist. For anyone else in Orange County, backyard BBQ islands contractor might be worth checking out if you want a BBQ island that holds up in the sun and coastal air.
Appreciate the safety angle. After a close call, we switched to laminated tempered glass near the stairs to meet code. If you’re weighing tempered vs. laminated for impact zones, see the comparison at sash window repair and restoration .
Well done! Discover more at tubidy mp3 free download .
The Arlington move weekend checklist (Friday cutover to Monday go-live) was exactly what we needed: mypromovers arlington
בזכות יועץ פיננסי מומלץ יש לנו היום שקט נפשי וביטחון כלכלי, ממליצים מכל הלב.
Make sure they can provide a tree risk assessment report if needed. I learned TRAQ basics through expert tree trimming .
چون چند سایت مختلف رو دیده بودم، این یکی رو هم از نظر ظاهر، توضیحات و قابل فهم بودنبا بقیه مقایسه کردم.
سلام، چون چند وقتیه درباره این فضا کنجکاو شدم گفتم اینجا هم نظرم رو ثبت کنم.
چند شب پیش وقتی داشتم دربارهبازیهای آنلاین پولی سرچ میکردم اینجا برام جالب شد.
بعد از اینکه کمی توی سایت چرخیدم حس کردم ساختارش بد نیست.
از نظر من نباید فقط به ظاهر سایت اعتماد
کرد. یکی از رفیقام به اسم پویا دنبال این بود که چند
پلتفرم مختلف رو مقایسه کنه.
برای همین به جز ظاهر سایت، متنها
و توضیحاتش رو هم نگاه کردم. یکی از بخشهایی
که بد نبود که چند بخششبرای مقایسه مفید بود.
طبیعتاً هر کسی باید خودش تصمیم بگیره.
برای افرادی که میخوان قبل از تصمیمگیری دید بهتری
داشته باشن، میتونهنقطه شروع بدی نباشه.
نکته دیگه اینکه نمونههایی مثل پلتفرم
enfejarߋnline در کنار sibbet معتبر در بین بعضی کاربران شناختهتر شدن.
یکی از آشناهای من بیشتر دنبال پیشبینی ورزشی بود و همیشه میگفت اگر سایتی توضیحات ساده و روشن نداشته باشه، بهتره آدم با
احتیاط بیشتری جلو بره. اگر بخوام خیلی ساده بگم به
نظرم میشه به عنوان یک گزینه قابل بررسی بهش نگاه
کرد. فکر میکنم منطقیتره هم تجربه بقیه رو بخونهو هم خودش بررسی کنه.
من احتمالاً بعداً دوباره برمیگردم و بخشهای بیشتری رو نگاه میکنم،
چون بعضی قسمتهاش برای مقایسه
با سایتهای دیگه قابل
توجه بود.
Here is my ᴡeb page … هاستینگ
I appreciate the recycling info; commercial solar panel install catalogs regional PV recycling partners.
Appreciate the useful tips. For more, visit horarios nutricionista cerca de mi .
Maximize your winnings today using the newest https://form.typeform.com/to/zyKsddBN. Turn your first wager into a risk-free opportunity and enjoy fast payouts.
This degree of detail in building metal job is awesome. If you’re exploring choices for bespoke barriers, facades, or gateways, take a look at roof finials — their profile goes over.
Don’t forget to ask about fiber internet in older Raleigh apartments. I used smart move llc to map providers building by building.
This was a fantastic read. Check out Mitolyn scam claims for more.
This was highly useful. For more, visit https://easypdfshare.com/s/en-0-12wS0gUQgWqf_dLZ .
Timing matters—some pruning is seasonal in Columbus. Learned that from a calendar on affordable tree trimming .
Appreciate the thorough information. For more, visit https://easypdfshare.com/s/Y-GrqVldg4_GLKAHgwpra .
Great insights! Find more at https://easypdfshare.com/s/ayEryXZMSoYj2g6Ut3Nla .
http://rethinkable-media.de/
Rethinkable Media positioniert sich als ein vertrauenswuerdiger Partner fokussiert auf den nationalen Rahmen Deutschlands, das bereitstellt ganzheitliche Ansaetze fuer Unternehmen und Privatpersonen, mit Schwerpunkt auf Servicequalitaet. Mehr Informationen ueber den Link.