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
}
“Feeling empowered after each appointment—thank you,# # any Keyword###for changing how I view self-care.” Facial Treatments Las Vegas
Loved the tips on creating multi-functional spaces within the kitchen; it’s essential today—check out similar concepts at Luxury Kitchen Design Los Angeles !
1win instalare pe ipad [url=1win71038.help]1win instalare pe ipad[/url]
I found this very interesting. Check out installment loans for more.
Современный мир высоких технологий предлагает большое разнообразие вариантов регистрации доменных имен. Среди популярных сочетаний выделяется простая и выразительная комбинация `slon1`. Именно такая последовательность стала основой множества доменных адресов, привлекающих внимание пользователей. Простота восприятия делает её идеальной для брендов и веб-ресурсов различного назначения.
[url=https://slon–3.cc]кракен ссылка darknet [/url]
Одним из интересных направлений стало использование национального домена верхнего уровня (.cc). Таким образом появилось популярное сочетание **slon1.cc**, которое сочетает простую и доступную ассоциацию со словом «слон» и одновременно обозначает принадлежность ресурса к определённой географической зоне. Такое решение способствует быстрому восприятию и идентификации сайта пользователями.
[url=https://slon8at.com]slon8 cc [/url]
Еще одним вариантом стал вариант **slon1.at**, в котором подчеркнута связь с австрийским сегментом сети Интернет. Такой выбор тоже имеет свою специфику и добавляет дополнительные смыслы в восприятие бренда. Благодаря своим уникальным характеристикам этот тип домена активно используется компаниями, ориентированными на европейский рынок.
[url=https://slon2-at.net]kraken market ссылка [/url]
Часто владельцы ресурсов выбирают и сокращённую форму записи своего имени. К примеру, такое написание, как **slon1cc**, придаёт сайту дополнительный шарм и облегчает процесс запоминания. Подобная форма часто встречается в международной практике брендирования и отражает общую тенденцию упрощения структуры именования.
[url=https://slon5c.cc]рабочая ссылка кракен [/url]
В заключение отметим ещё одну разновидность написания домена — **slon1сс**. Здесь упор сделан на двойное повторение буквы «с», что создаёт особое звучание и запоминающийся эффект. Такая игра букв усиливает привлекательность домена и выделяет ресурс среди прочих аналогичных предложений.
[url=https://slon5at.net]ссылка на сайт кракен [/url]
https://slon5.ca
slon8.at
שירות טלפוני אדיב וזמין, אישור מידי – הזמינו ב- מונית מירושלים לתל אביב
Современный мир высоких технологий предлагает большое разнообразие вариантов регистрации доменных имен. Среди популярных сочетаний выделяется простая и выразительная комбинация `slon1`. Именно такая последовательность стала основой множества доменных адресов, привлекающих внимание пользователей. Простота восприятия делает её идеальной для брендов и веб-ресурсов различного назначения.
[url=https://slon8c.cc]slon1 cc [/url]
Одним из интересных направлений стало использование национального домена верхнего уровня (.cc). Таким образом появилось популярное сочетание **slon1.cc**, которое сочетает простую и доступную ассоциацию со словом «слон» и одновременно обозначает принадлежность ресурса к определённой географической зоне. Такое решение способствует быстрому восприятию и идентификации сайта пользователями.
[url=https://slonl7.cc]slon2.at [/url]
Еще одним вариантом стал вариант **slon1.at**, в котором подчеркнута связь с австрийским сегментом сети Интернет. Такой выбор тоже имеет свою специфику и добавляет дополнительные смыслы в восприятие бренда. Благодаря своим уникальным характеристикам этот тип домена активно используется компаниями, ориентированными на европейский рынок.
[url=https://at-slon3.cc]ссылка на кракен 2026 [/url]
Часто владельцы ресурсов выбирают и сокращённую форму записи своего имени. К примеру, такое написание, как **slon1cc**, придаёт сайту дополнительный шарм и облегчает процесс запоминания. Подобная форма часто встречается в международной практике брендирования и отражает общую тенденцию упрощения структуры именования.
[url=https://slon9cc.com]slon8.cc [/url]
В заключение отметим ещё одну разновидность написания домена — **slon1сс**. Здесь упор сделан на двойное повторение буквы «с», что создаёт особое звучание и запоминающийся эффект. Такая игра букв усиливает привлекательность домена и выделяет ресурс среди прочих аналогичных предложений.
[url=https://slon5cc.com]кракен ссылка 2026 [/url]
https://slon1-at.net
slon6 cc
Appreciate the comprehensive insights. For more, visit rent a car toronto .
Современный мир высоких технологий предлагает большое разнообразие вариантов регистрации доменных имен. Среди популярных сочетаний выделяется простая и выразительная комбинация `slon1`. Именно такая последовательность стала основой множества доменных адресов, привлекающих внимание пользователей. Простота восприятия делает её идеальной для брендов и веб-ресурсов различного назначения.
[url=https://slon2-cc.com]slon6 at [/url]
Одним из интересных направлений стало использование национального домена верхнего уровня (.cc). Таким образом появилось популярное сочетание **slon1.cc**, которое сочетает простую и доступную ассоциацию со словом «слон» и одновременно обозначает принадлежность ресурса к определённой географической зоне. Такое решение способствует быстрому восприятию и идентификации сайта пользователями.
[url=https://slon6at.com]slon10.at [/url]
Еще одним вариантом стал вариант **slon1.at**, в котором подчеркнута связь с австрийским сегментом сети Интернет. Такой выбор тоже имеет свою специфику и добавляет дополнительные смыслы в восприятие бренда. Благодаря своим уникальным характеристикам этот тип домена активно используется компаниями, ориентированными на европейский рынок.
[url=https://slon5c.cc]slon6.cc [/url]
Часто владельцы ресурсов выбирают и сокращённую форму записи своего имени. К примеру, такое написание, как **slon1cc**, придаёт сайту дополнительный шарм и облегчает процесс запоминания. Подобная форма часто встречается в международной практике брендирования и отражает общую тенденцию упрощения структуры именования.
[url=https://slon8cc.com]кракен ссылку где [/url]
В заключение отметим ещё одну разновидность написания домена — **slon1сс**. Здесь упор сделан на двойное повторение буквы «с», что создаёт особое звучание и запоминающийся эффект. Такая игра букв усиливает привлекательность домена и выделяет ресурс среди прочих аналогичных предложений.
[url=https://slon2-at.net]slon9 cc [/url]
https://slon6-cc.com
slon8 at
You make a great point about how outdated pages hurt search rankings and erode user trust. I recently audited our service descriptions and realized how much conflicting information we were hosting. It was an eye-opener https://papa-wiki.win/index.php/Why_Your_Outdated_Website_Content_is_Sabotaging_Your_Recruiting_Strategy
I love how hosting meetings aboard yachts creates such intimate settings; it’s ideal for effective collaboration, especially here around beautiful waters like those found through charter yachts of newport beach
”Thankful everyday discovering new favorites along journeys taken throughout life—and today marks another successful chapter shared together collectively via these memories forged forward!” Men’s Waxing Services Las Vegas
The Indianapolis auto shipping process seems much simpler after reading this. Great explanation! Indianapolis vehicle shippers
продвижение веб сайтов москва [url=https://prodvizhenie-sajtov-v-moskve4.ru/]prodvizhenie-sajtov-v-moskve4.ru[/url] .
Choosing an ORM provider is always a headache because the promises rarely match the actual execution. Before signing anything, my advice is to mandate a written scope that strictly separates removal from suppression https://telegra.ph/Handling-a-Brand–Lawsuit-Query-A-Strategy-for-Outdated-Legal-Content-03-24
5dollar deposit cheap fake casino chips (Cornelius) united states, $10
deposit bonus casino nz and is casinos illegal in uk, or cash bingo
australia
It’s wild how these sites track search URLs just to rank higher. I’ve seen my cousin deal with this, and the confusion between actual removal and just paying a third party to suppress the link is infuriating follow this link
I’m a freelance designer who’s been location-independent for four years — the gear coverage is honestly what matters most to me. Lost a MacBook Pro once and the payout covered 80% of a replacement digital nomad travel insurance
When the AC quits during a heat advisory, waiting until “normal business hours” isn’t an option. That’s why I like using emergency ac repair to quickly locate companies that truly offer 24/7 emergency AC repair.
For keypad and MyQ smart setup around Spring, TX, fleet garage door repairs handled integration flawlessly.
мостбет casino slots [url=https://mostbet05638.help]https://mostbet05638.help[/url]
I’ve tried several places for Brazilian waxing in Las Vegas, but none compare to the service at Men’s Waxing Services Las Vegas .
This hits home for me. I have an old, misleading court record from ten years ago that keeps popping up whenever someone googles my name for a new job. It is honestly exhausting to deal with why negative search results hurt business
For Purdue Fort Wayne students moving into off-campus apartments, shared truck options I found on movers Minneapolis saved me money.
The dialogue approximately lengthy-cycle resources and patient capital reminded me of ways Morabito frames risk: hinder advancing the technical story while widening the investor base my response
Thanks for the informative post. More at monitores titulados .
Wonderful tips! Find more at abogado laboral Coruña .
I found this very interesting. For more, visit pensión barata Arzúa .
This was very insightful. Check out Local Medicare Agents for more.
My flight was cancelled in Istanbul during a snowstorm and I filed a claim and got reimbursed for the expenses within about 10 days. Make sure your policy actually covers cancellations caused by weather, not just mechanical issues compare travel insurance
Thanks for sharing your thoughts about online gaming sites real money.
Regards
Feel free to visit my page … Hard rock casino lake tahoe yelp
1win inregistrare rapida [url=1win71038.help]1win71038.help[/url]
For anyone navigating co-parenting challenges, check out the articles on # small business lawyer maryland #—they’re super helpful!
I recently used this tool for a client and it was a bit of a rollercoaster. It took several weeks for the changes to finally reflect across all search results. My best tip is to always take screenshots with timestamps once you submit the request https://wiki-velo.win/index.php/Demystifying_the_Google_Outdated_Content_Tool:_A_QA_Perspective_on_Reputation_Repair
Can’t believe how quick and easy it was to get my locks replaced – thank you, ###this: # # anyKey word### ! locksmith in orange county
I just Googled myself and found some cringey forum posts from ten years ago that I totally forgot existed. It is honestly a bit unsettling to see how much is still out there https://online-wiki.win/index.php/How_to_Own_Your_First-Page_Search_Results:_A_Practical_Guide
LU88 không chỉ dừng lại ở vai trò một nhà cái trực tuyến, mà được định vị như một nền tảng giải trí cá cược đa chiều, tối ưu riêng cho cộng đồng người chơi Việt lu88
KU88 là thương hiệu nhà cái trực tuyến uy tín nổi bật năm 2026, được đông đảo người chơi tin chọn nhờ hệ thống cá cược hiện đại, bảo mật cao và tỷ lệ trả thưởng minh bạch ku88at.com
9BET đang dần chiếm sóng giới cá cược trực tuyến nhờ khả năng phục vụ nhanh, giao diện mượt và ưu đãi cực ổn định. Cược thủ yêu thích địa chỉ cá cược bởi tỷ lệ trả thưởng hấp dẫn, trò chơi đa dạng và dịch vụ hỗ trợ chuyên sâu 9bet88.it.com
TX88 được biết đến là một trong những thương hiệu casino trực tuyến nổi bật tại châu Á, nơi người chơi có thể trải nghiệm đầy đủ các sảnh casino quốc tế với chất lượng hình ảnh sắc nét cùng tỷ lệ trả thưởng hấp dẫn tx88vip.com
Debet đang trở thành cái tên được tìm kiếm nhiều trong giới giải trí trực tuyến. Với nhiều điểm mạnh và khả năng tiếp cận nhanh, người tham gia nhanh chóng làm quen mà không cần mất quá nhiều thời gian thao tác debet
a/b тест баннеров [url=https://reklamnyj-kreativ13.ru/]reklamnyj-kreativ13.ru[/url] .
9BET được biết đến là một trong những nhà cái cá cược trực tuyến uy tín thu hút đông đảo người chơi tại Việt Nam và khu vực châu Á 9bet88.co.com
VIN88 được đánh giá là một trong những nhà cái uy tín trong lĩnh vực cá cược trực tuyến, sở hữu hệ sinh thái game phong phú từ cá cược thể thao, casino live đến nổ hũ và bắn cá đổi thưởng vin88org.com
Benefits benchmarking can be tough for SMBs—outsourcing solved it for us. affordable outsourced HR gave us access to better plans and rates.
Best part: upfront pricing and no upsell—my experience with 24/7 commercial garage repair in Spring, TX.
Smart assistance on wheel chocks. We bring rubber chocks for nontoxic loading—drivers shouldn’t stand at the back of the automobile in the time of winching. emergency towing
I agree that stale content damages credibility, especially when customers find obsolete pricing or old service details. My biggest takeaway is that a quarterly audit is essential to prevent these inaccuracies from piling up https://ameblo.jp/elliotodbv189/entry-12960760147.html
Thanks for the great tips. Discover more at alquiler temporal en Galicia .
I enjoyed this read. For more, visit rent a car .