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
}
For offices, ask about data-safe e-waste protocols. I booked compliant recycling via junk removal companies .
ставки на спорт, новости спорта, прогнозы и
спорт и термины спорта читайте подробнее про ставки и букмекеров на bkradar.com
That 30% CTR drop is hitting our European enterprise clients hard as AI answers take up more real estate. It is definitely a major shift for the industry https://canvas.instructure.com/eportfolios/4299058/home/what-does-hyper-targeted-mean-and-how-do-i-do-it-responsibly
В этой статье представлен занимательный и актуальный контент, который заставит вас задуматься. Мы обсуждаем насущные вопросы и проблемы, а также освещаем истории, которые вдохновляют на действия и изменения. Узнайте, что стоит за событиями нашего времени!
Более того — здесь – [url=https://dizzwizz.ru/zdorovie/kibersport-dofamin-i-butylka.html]вывод из запоя нижний новгород[/url]
It is wild to see how many agencies are finally making the jump into SaaS. Scaling an SEO agency is tough, but the 30 percent service margin compared to the 70 percent margin of a subscription product is a total game changer https://www.instapaper.com/read/2008523551
В этом исследовании рассмотрены методы лечения зависимостей и их эффективность. Мы проанализируем различные подходы, используемые в реабилитационных центрах, и представим данные о результативности программ. Читатели получат надежные и научно обоснованные сведения о данной проблеме.
Тыкай сюда — узнаешь много интересного – [url=https://chistotainfo.ru/uborka/chistyy-dom-zdorovoe-soznanie]вызвать врача нарколога на дом москва[/url]
Погружайся в захватывающие сюжеты вместе с нами! Голливудские блокбастеры, культовые сериалы, добрые мультфильмы и зрелищные премьеры – всё доступно в отличном качестве. Никакой рекламы, только чистое удовольствие от просмотра. Создай свою коллекцию любимых фильмов и наслаждайся: смотреть кино
That shift towards AI visibility tracking is definitely becoming a top priority for enterprise teams. Seeing the rise in zero-click results makes it harder to rely on traditional search volume metrics alone Click to find out more
The Joondalup venue had good parking and equipment—booked on CPR and first aid Jondalup .
1win мобильное приложение скачать [url=www.1win68503.help]1win мобильное приложение скачать[/url]
This breakdown of AI visibility tracking is a solid start, but it often misses the nuance of temporal variances. For instance, testing rankings in Berlin at 9am vs 3pm shows significant flux due to model caching Click here
Anyone here used out-of-hours Dentists Edinburgh? I noticed some on-name expertise with the aid of dental practices Edinburgh .
I love the push for more engineering in SEO. Relying solely on third-party suites usually leaves us chasing the same metrics as everyone else. Investing in proprietary tools has definitely been a game changer for our custom reporting needs https://hotel-wiki.win/index.php/Why_Bootstrapped_SEO_Agencies_Build_Better_Internal_Tools_(And_Why_You_Should_Care)
Recentemente estamos vivendo uma “nova revolução” na maneira de amparar,
diagnosticar, orientar e cuidar os homens com complexidade de ereção.
Para homens que não respondem aos remédios orais, as opções incluem injeções penianas de Alprostadil, que envolve a
aplicação direta de remédio no pênis pra induzir
uma ereção, ou supositórios uretrais, que é inserido
pela uretra. Quanto tempo dura a ereção depois da aplicação?
A ereção costuma surgir entre cinco e 15 minutos após a aplicação, oferecendo previsibilidade e controle sobre o tempo de resposta.
Para comparação, estudos notabilizam que o tempo médio de latência (da penetração até o orgasmo/ejaculação) é
de por volta de 5 a seis minutos. A ereção normalmente aparece entre
5 e 15 minutos e dura de trinta a 90 minutos, dependendo da
medicação e da dose ajustada pelo médico. O custo por ampola ou
dose varia entre R$80 e R$180, dependendo do tipo de medicação e protocolo utilizado.
A avaliação médica estabelece o tipo e a dosagem exata da medicação
utilizada em cada aplicação. Especialistas ouvidos em maio por VivaBem foram cautelosos ao explorar os resultados, contudo apontam que estudos
do tipo são importantes para incentivar mais pesquisas a respeito de. https://www.ssinvestimentos.com/wp-sitemap-posts-post-1.xml
If you suspect a defective part caused the crash, consider a product claim. car accident lawyer can evaluate it.
This is an interesting take on visibility tracking. We’ve been struggling with inconsistent data when checking search performance across regions; even checking Berlin at 9am vs 3pm yields wildly different AI response patterns ai serp volatility
мелбет игры на деньги [url=https://www.melbet49375.help]https://www.melbet49375.help[/url]
ช่วงหน้าฝนทัศนวิสัยสำคัญมาก เลนส์โปรเจคเตอร์ช่วยโฟกัสดีขึ้น ดูตัวเลือกที่ ร้าน ไฟหน้ารถยนต์ ใกล้ ฉัน
Valuable information! Find more at hire Divramis for SEO .
Cultural and language compatibility matters. We located multilingual staff options via senior care .
Honestly, I’m glad you’re pushing the engineering angle. Most SEO leads just focus on content, but building proprietary tools is a total game changer for data at scale. It stops the guessing game entirely https://privatebin.net/?0b150fbc8df52fb9#95MbgvvcEHLuRBLnKwkTJ8CVURtRtVP5rAcxEay12NVR
Thanks for clarifying search and seizure rights. Anyone charged should speak to counsel immediately— criminal defense attorney .
Clarify whether they charge extra for heavily soiled areas. I compared surcharges on carpet cleaning st george utah professionals .
This is an interesting take on tracking visibility, but I’m curious about your approach to entity disambiguation procurement data provenance marketing
A good homeowners association should balance community standards with individual homeowner rights. Camelot Village
I really resonate with the push for more engineering in SEO leadership. Building proprietary tools has been a total game changer for our team because it cuts through the noise of generic data how developers approach SEO
ставки на спорт, новости спорта, прогнозы и
https://bkradar.com/bookmakers/rating читайте подробнее про ставки и букмекеров на bkradar.com
Thanks for the detailed guidance. More at senior care .
If you’re decluttering before moving, a 15-yard bin is nice— same day roll off dumpster rental scottsdale az can help you pick.
Exceptional break down of assisted living vs. assisted living facility. If any individual needs advice, elderly care supplies useful devices to contrast treatment strategies.
Thanks for the insightful write-up. More like this at Connelly Dental .
Memory care within assisted living is so valuable. If anyone needs more info, assisted living has a clear breakdown of services.
The lawn renovation timeline is practical. Scheduling with residential landscape contractor Charlotte this month.
Мы предлагаем вам окунуться в океан любопытных фактов и вдохновляющих историй. Эта публикация поможет расширить горизонты, разбудить интерес к науке и истории и увидеть мир с новой стороны.
Полная информация здесь – [url=https://versesoflove.ru/kak-otmetit-bez-sryva/]вывести из запоя капельница[/url]
This was a wonderful post. Check out assisted living for more.
I appreciate how you explained the difference between assisted living and nursing homes. We found useful checklists on assisted living when comparing communities.
Smart lock battery tips are helpful. When mine failed, key replacement provided emergency access and replacement.
Good reminder to check loose lugs. 24/7 electrician repair service Boston in Boston tightened and torqued everything properly.
Beware of door-to-door solicitors after storms. The vetting advice on tree trimming helped me avoid scams.
как получить бездепозитный бонус мостбет [url=mostbet15384.help]mostbet15384.help[/url]
Don’t delay medical care—then use Bus Accident Attorney to call a car accident lawyer who will tie it to the crash.
Finding an attorney who specializes in car accidents can be challenging, but it’s worth it! Check out resources at Alaska truck injury lawyer for guidance.
Grateful for the supportive staff at my ##Puyallup Chiropractor## office; they always make me feel welcome! Chiropractor Puyallup
I recently moved to Puyallup, and I was shocked by how many pests I encountered in my new home! After doing some research on pest control options, I found that local services are crucial for effective solutions Carpet beetle treatment
1win видеотрансляции [url=https://www.1win59801.help]https://www.1win59801.help[/url]
Wall Family Chiropractic Center’s combination of chiropractic adjustments and massage therapy enhances healing and relaxation. Chiropractor Tacoma
Personalized exercise routines can improve balance and confidence at home. affordable in-home senior care
Thanks for the helpful article. More like this at Simple Dental .
1win plinko [url=1win68503.help]1win68503.help[/url]
The tips on recording mileage to medical visits are useful. car accident lawyer added it to my claim.