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
}
I’m really feeling this pain as a small business owner. We’ve hit a point where our annual premium increases are just unsustainable for our tiny team, and it feels like we’re being priced out of providing decent benefits retain employees benefits
Thanks for the valuable insights. More at buena pensión en Arzúa .
I’ve been dealing with chronic knee pain for months and have been hesitant about where to go for treatment. This article really hammered home the importance of a sterile clinical environment for safety, which I hadn’t fully considered before https://www.mediafire.com/file/0pzgygc5lwna0n2/pdf-4729-94978.pdf/file
Nighttime truck crashes require special proof; Auto Accident knows what to look for.
how to bet horse racing calculator
my web site; Crayford Dogs Results Saturday
This is such a helpful breakdown of how to keep local listings clean. I recently spent hours dealing with duplicate listings that were tanking our SEO, so I definitely relate to the frustration Foursquare listing
I had no idea that my old posts from years ago were still floating around like that. It is honestly a bit unsettling to think about how much info is just out there for anyone to find what is the usercentrics report
We’ve been debating getting panels fitted for months to help with the energy bills. The idea of a battery pushing self-consumption up to 80% sounds like a total game changer for a family of four like ours Smart Export Guarantee explained
It’s exciting to see Japan embracing crypto payments for online platforms! I’ve personally started sticking to stablecoins for these transactions just to avoid that nagging price volatility at checkout. It makes the process way smoother Additional info
Great breakdown of the options here. As a developer, I always emphasise that people overlook the importance of local backups. Regardless of the hosting tier you choose, always make sure you have an automated off-site backup solution configured Click to find out more
This is a great breakdown. I use Crunchbase all the time for vetting leads, but I find the most value in cross-referencing those specific job start dates—like seeing a “Jul 2005” entry—against their LinkedIn profile to spot any timeline gaps Melbourne business advisory
Для загрузки последних новинок фильмов воспользуйтесь надежным [url=https://rutor-24×7.cc]рутор вики[/url].
Навигация по ресурсу интуитивно понятна и легка в освоении.
Great post. I rode down to the Angel Oak last summer and the canopy is even more impressive in person than in your photos. Definitely one of the best scenic stops in the area for a quick break from the heat Get more information
Honestly, this hits home. Being a small business owner, I feel like I’m playing a losing game every time renewal season rolls around. Those double-digit premium increases are just unsustainable for a small headcount like mine https://wiki-view.win/index.php/What_Should_I_Tell_a_Candidate_When_We_Don%E2%80%99t_Offer_a_Group_Plan%3F
grand national who to bet on
Take a look at my site; Live greyhound racing streaming video
I had no idea that my online activity was being tracked in this way. It honestly makes me feel a bit uneasy about what companies really know about me https://emilioezho292.theglensecret.com/digital-footprints-how-to-have-the-talk-without-the-eye-roll
It’s fascinating to see Japan embracing crypto payments for online platforms! I’ve personally started sticking to stablecoins for these transactions just to avoid the headache of price volatility at checkout https://wiki-site.win/index.php/What_is_the_Safest_Way_to_Start_Using_Crypto_Payments_on_a_Platform%3F
This is such a timely reminder. I’ve been struggling with old, duplicate listings for my business that show the wrong hours on Yelp and Google Maps, which is definitely driving customers away. It’s a total headache to clean up https://astro-wiki.win/index.php/How_Do_I_Find_Every_Place_My_Business_Is_Listed_Online%3F
We’ve been weighing up the costs of solar panels for a while now, and seeing that 1 to 2 day install time makes the whole project feel much more manageable with kids running around. It is a big upfront investment, but the long-term savings are so tempting You can find out more
This is a solid guide. I’ve found that cross-referencing the CB Rank (Person) against their education entries is often the quickest way to spot early career trajectory https://johnnywyan573.lowescouponn.com/what-does-number-of-current-jobs-1-mean-on-crunchbase
Great breakdown of the options. I’ve learnt the hard way that when choosing a provider, it’s vital to test their support response time during the weekend before committing to a long-term plan https://orcid.org/0009-0000-1873-5505
Thanks for the thorough article. Find more at elderly care .
I found this very interesting. Check out elderly care for more.
Appreciate the thorough information. For more, visit respite care .
Man, I really needed this list for my upcoming trip down south. I’ve been trying to map out a route that hits the coast, and checking out the Angel Oak is definitely at the top of my list now Charleston motorcycle adventure guide
I’m feeling this pain every single renewal season. We’re a tiny team, and those annual premium hikes are making it nearly impossible to keep group coverage sustainable without gutting our take-home pay. It’s reached a total breaking point small business benefits budget
I’ve been dealing with a nagging knee injury for months, and this article really hit home. The point about screening is so important; it’s scary how many places just want to take your money without checking if you’re actually a good candidate Your Health Magazine stem cell article
It’s interesting to see Japan embracing crypto payments for online platforms! I’ve personally started sticking to stablecoins for these transactions to avoid any nasty surprises from market volatility why use bitcoin for casinos
Thanks for addressing wandering and elopement. Wearable trackers and door alerts can add peace of mind. We compared options using resources from respite care .
I never really thought about how much of my personal history is just floating around out there in the cloud. It is a bit unsettling to realize how easy it is for anyone to track my past activity https://numberfields.asu.edu/NumberFields/show_user.php?userid=6636606
We’ve been looking into getting a system installed to help manage our monthly bills, but the upfront cost of £6,500 to £8,000 is still a big leap for our family budget https://daltonsexcellentwords.wordpress.com/2026/04/15/do-solar-panels-still-make-sense-if-youre-moving-in-8-to-11-years/
This is such a helpful breakdown of the citation process. I spent all of last week fighting with Google because my business hours were listed incorrectly for months. It really killed my foot traffic until I finally got it fixed Continue reading
This is a great breakdown. I use Crunchbase all the time for due diligence, and I’ve found the CB Rank (Person) is actually a solid quick filter for gauging overall industry influence https://www.mapleprimes.com/users/landontaylor9
This is such a tough spot to be in as a small business owner. Every year, I dread opening the renewal notice to see those double-digit premium hikes Have a peek at this website
Crushed granite makes a tough, draining path surface. We sourced high-quality aggregate via excavation .
I’ve been eyeing a trip down that way for a while now. Honestly, I think the highlight for me would be checking out the Center for Birds of Prey since those hours—Thursday through Saturday from 10am to 4pm—actually fit my riding schedule perfectly Southern Comfort yacht Charleston
I’ve been struggling with a persistent knee injury for months and have been researching various options, but the amount of misinformation out there is overwhelming Click for more info
I enjoy how approachable and educated the Top Real Estate Attorneys in Clifton Park are! They essentially take the time to give an explanation for every thing. Check them out at residential real estate attorney Albany .
This is a really helpful breakdown. One thing I always suggest to clients is to check if the host offers automated daily backups. It’s saved my bacon more times than I care to admit when a plugin update goes wrong http://www.video-bookmark.com/user/justin_webb32
I recently visited Putnam Place over the summer and it was incredible. The sound system is seriously impressive — definitely not your average bar venue. If you’re in Saratoga, you have to go! entertainment venue Saratoga Springs NY
It’s really interesting to see Japan embracing crypto payments for online platforms like this. I’ve personally started sticking to stablecoins for these kinds of transactions just to avoid that typical market volatility Visit website
We’ve been weighing up the costs for a while now, and seeing that 1 to 2 day install time really makes it feel manageable for a busy family house. It’s hard to justify the upfront expense, but the long-term savings are so tempting 0 percent VAT solar panels 2027
This article hits home because I just spent all morning fighting with our Google Business profile. We had three duplicate listings for the same location and it was driving me crazy managing online business listings
I definitely need to plan my route better next time to catch the Center for Birds of Prey since they are only open Thursday through Saturday from 10am to 4pm. That is a tight window when you are busy racking up miles on the bike top motorcycle roads in South Carolina
This article really opened my eyes to how much of my life is just floating around out there. I always figured that deleting a post meant it was gone for good, but clearly that is not the case https://n639q.stick.ws/
Breath scan outcome aren’t normally right due to repairs and scientific issues. A local DWI security lawyer can subpoena calibration history. I saw some priceless insights on DWI attorney Glens Falls .
This is a great breakdown. I use Crunchbase all the time for due diligence, and checking the CB Rank is definitely a solid way to gauge how established someone is in the industry https://uuc7i.stick.ws/
For hurricane-rated doors, Commercial Overhead Doors seems to have the best selection and install expertise.
This was very beneficial. For more, visit Garaginization LLC .
I am feeling this struggle every single day. Managing these constant annual premium hikes is becoming impossible with such a small headcount. We want to take care of our team, but the current group coverage model just isn’t built for businesses our size small business health insurance reviews