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
}
Здорова, народ Отец не встаёт с кровати Жена рыдает Платная клиника просит бешеные деньги Короче, спасла только госпитализация — вывод из запоя самара стационар с палатой Положили в палату В общем, вся инфа по ссылке — вывод из запоя стационарно [url=https://klinika.vyvod-iz-zapoya-v-stacionare-samara13.ru]вывод из запоя стационарно[/url] Звоните прямо сейчас Это может спасти жизнь
There’s nothing rather like delighting in a summertime night on a well-designed yard deck. I recently started investigating the best options for developing one, and I discovered some important insights at deck builders that helped me limit my options.
Bleeding gums should never be considered normal, and this article makes that clear. For Gum Disease Treatment in Ventura, Gum Disease Treatment in Ventura may be helpful.
Thanks for the valuable insights. More at despido improcedente .
Wonderful tips! Find more at recursos para pacientes con reuma .
This post does a fantastic task highlighting the difference in between minor maintenance and repairs that need experienced assistance. Higgins Overhead Door Residential Garage Doors
Слушайте кто кухню недавно заказывал Цены космос а качество мыло То фасады кривые Короче, нашел наконец нормальное производство — кухни на заказ в спб с бесплатным проектом Сделали за две недели В общем, вся инфа вот здесь — кухни на заказ спб [url=https://kuhni-spb-lvk.ru]кухни на заказ спб[/url] Проверяйте производителя Перешлите тому кто ищет
If you might be doubtful approximately which kind of fence to pick, discuss to the consultants at Hiring fencing contractors tips ; they’ll consultant you effectively!
Wonderful tips! Discover more at divorce mediator near me .
Здравствуйте!
Качественное сео продвижение сайтов требует регулярного обновления контента и структуры проекта. Мы создаем полезные материалы, которые отвечают на вопросы вашей целевой аудитории точно. Это повышает экспертный статус бренда и удерживает пользователей на страницах сайта дольше. Поисковые системы видят активность и награждают ресурс высокими позициями в выдаче. Ваш сайт станет источником ценной информации и надежным каналом продаж одновременно.
Самая точная информация на сайте – https://linkbooster.space/
сео продвижение сайтов, seo продвижение сайтов в москве, заказать раскрутку
услуги seo продвижения, продвижение сайта воронеж, seo оптимизация
Всего наилучшего и роста в топе!
Thanks for protecting protection along steps. Low-glare step lighting fixtures greater visibility at my region; I planned placements with help from landscape lighting .
I agree that preparation is key before moving an office. Boston businesses should make a checklist and choose movers familiar with commercial relocations. moving companies Boston
Allentown apartment moves can be stressful, but the right movers can make everything feel more organized. Allentown apartment movers seems like a useful option for moving help.
A good long distance moving company should protect your belongings and keep you informed throughout the process. For Clifton moves, Clifton apartment movers is worth visiting.
Office moving involves more than just packing boxes. Businesses in Seattle can benefit from services offered by Seattle moving companies .
Greensboro car shipping services are a great solution when driving the vehicle yourself isn’t practical. Greensboro vehicle shippers is a helpful resource for learning more.
New to Friendswood? The movers from Friendswood Movers even shared local tips on utilities and trash schedules after unloading.
Anyone planning a Nashville apartment move should take time to compare moving options and prepare early. Having reliable movers can make the entire experience smoother. budget movers in Nashville is worth checking out.
I can write Google Business Profile posts for a moving company. Long distance movers Everett
This is a great reminder that office moves are not just about transporting furniture. Managing timing and setup is just as important. Springfield businesses can check Long distance movers Springfield for moving support.
Great tips for anyone preparing for a long distance move. Atlanta traffic, apartment access, and scheduling can all affect moving day, so professional help is worth considering. More details here: Best Atlanta Mover’s
I like the practical approach in this article. Moving is much easier when you hire professionals who are careful and reliable. For Bowie moving needs, Best Bowie movers may be a good place to start.
Local moving can be easier when you find professionals who understand the area. For affordable moving support, North Hempstead Mover’s seems like a solid resource.
I was nervous about delivery spreads; the mover I picked via Fulshear international movers offered a narrow window and hit it exactly.
Народ всем привет Объездил кучу салонов — везде перекупы То сроки по полгода обещают Короче, единственные кто не наваривается — кухни на заказ спб с установкой Сделали за две недели В общем, там цены и каталог — кухни на заказ в санкт-петербурге [url=https://kuhni-spb-qmz.ru]https://kuhni-spb-qmz.ru[/url] Проверяйте производителя по этому списку Сам мучался теперь делюсь
It’s very simple to find out any topic on net as compared to books, as I found this paragraph at this site.
Привет всем!
Маркетинг продвижение сайта объединяет SEO, контент-стратегию и работу с репутацией бренда. Мы разрабатываем комплексный план с учётом целей и аудитории клиента. Каждый инструмент подбирается индивидуально под специфику бизнеса. Регулярные отчёты позволяют отслеживать динамику роста на всех уровнях. Маркетинг продвижение сайта с нами — системный подход к результату.
Самая подробная информация на сайте – https://linkbooster.space/
продвижение сайта компании, seo оптимизация и продвижение сайтов, продвижение вашего сайта
продвижение сайта в поисковиках, сеть продвижение сайта, продвижение сайта воронеж
Всего наилучшего и роста в топе!
If you need help with a piano or safe, check specialty-item experience. Copperas Cove commercial movers lets you flag those items during the quote.
Always confirm the moving date, estimated cost, and services included before signing anything. If you’re looking for movers in Dacula, Long distance movers Dacula can help.
I agree that choosing the right moving company is important. Full-service movers can make packing, lifting, and transporting much easier for Milwaukee residents. You can check international movers for more information.
This is useful information for anyone relocating soon. Those looking for Best Lawrence movers may find Office moving companies Lawrence helpful.
Packing, lifting, and transporting everything can be overwhelming without the right help. If you’re moving in Marietta, Everett moving company is a resource worth checking.
Great information for local residents preparing for a move. It is always smart to compare Woodbridge moving companies before choosing the right team. Helpful moving resources can be found at Woodbridge commercial movers .
I like the focus on choosing trustworthy professionals. People moving in Snellville should look for movers who are careful and efficient: Office moving companies Snellville
Привет всем!
Продвижение сайта в топ 10 Яндекса требует системной работы над всеми факторами. Мы прорабатываем технику, контент и внешние ссылки одновременно. Стратегия строится на анализе конкурентов из первой десятки выдачи. Клиент получает регулярные отчёты с динамикой роста позиций. Продвижение сайта в топ 10 Яндекса с нами — устойчивый путь к результату.
Самая подробная информация на сайте – https://linkbooster.space/
продвижение сайтов ру, продвижение сайта социальными сетями, продвижение сайтов в яндексе москва
seo ссылками, сео продвижение сайтов, seo система продвижение сайтов
Всего наилучшего и роста в топе!
The psychological connection we have with precious jewelry is incredible. Whether it’s a family treasure or a gift from an enjoyed one, each piece tells a story buy gold denver co
Appreciate the comprehensive advice. For more, visit encuentra tu alojamiento .
Quality posts is the key to attract the viewers to pay a
quick visit the web page, that’s what this web page is providing.
Thanks for the detailed guidance. More at kitchen remodeling services .
Appreciate the thorough information. For more, visit portal de animales y mascotas .
Bon rapport qualité prix pour l’ensemble des travaux réalisés sur notre toiture. Couvreur
basketball viertel wetten gewinn ideen
Состояние пациента отслеживается на каждом этапе, от первичной консультации до дальнейших рекомендаций.
Получить дополнительную информацию – [url=https://vyvod-iz-zapoya-v-gelendzhike4.ru/]вывод из запоя на дому недорого геленджик[/url]
Nicely detailed. Discover more at abogado cerca de mí Coruña .
This was highly useful. For more, visit reclamación de cantidades .
I read this paragraph completely about the resemblance of
latest and earlier technologies, it’s amazing article.
Appreciate the detailed post. Find more at clear drug information .
Thanks for the useful suggestions. Discover more at rehabilitación para pacientes con reuma .
I located your maintenance ideas functional and simple to follow, specifically for homeowners with older doors. Higgins Overhead Door Residential Garage Door Accessories
Народ всем привет Фурнитуру ставят китайскую То фасады кривые Короче, реальные мужики с цехом — заказать кухню с гарантией Проект бесплатно В общем, вся инфа вот здесь — изготовление кухни на заказ в спб [url=https://kuhni-spb-qmz.ru]https://kuhni-spb-qmz.ru[/url] Проверяйте производителя по этому списку Сам мучался теперь делюсь