Yoğun hesaplamalar yapıyor, belirli bir iş parçacığı için maksimum CPU yükü ayarlamak için zarif bir yolu olup olmadığını merak etmiştim.
Şu anda dizisindeki döngü en zaman alıcı bulunan (yalnızca sıkıştırma yapar) ve kullanımı var
GetTickCount()ve
Sleep()kodlanmış değerleri ile. Bu döngü belli bir süre için ve belirli bir minimum süre uyur daha devam etmesini sağlar. Az ya da çok iş yani iplik CPU% 50'sinden fazlasını kullanmaz garanti yok.
Ancak davranış işlemci çekirdek sayısı (büyük bir dezavantaj) ve sadece çirkin (daha küçük bir dezavantaj :)) bağlıdır.
Herhangi bir fikir?
C CPU kapağı ++
Yoğun hesaplamalar yapıyor, belirli bir iş parçacığı için maksimum CPU yükü ayarlamak için zarif bir yolu olup olmadığını merak etmiştim.
Sana (hayır daha yüksek öncelikli hazır evre varsa senin iplik boşta öncelikli, olsa bile, seninki çalışacaktır) istediğini yapma OS'nin scheduler olsun herhangi API farkında değilim. Ancak, ben zaten ne yaptığını dayalı oldukça şık azaltma işlevini doğaçlama düşünüyorum. Esasen (Ben Bir Windows dev makine kullanışlı yok):
İplik her yineleme uyuyacak zaman varsayılan miktarını seçin. Daha sonra, her tekrarında, (ya da her n tekrarında, azaltma işlevi yapar, öyle ki kendi başına önemli bir CPU yükü haline)
- Senin iplik senin azaltma işlevi çağrıldı son zamandan bu yana kullanılan CPU süresini hesaplayınız (Bu dCPU arayacağım). Sen kullanabilirsiniz GetThreadTimes () sizin iplik çalıştırılsa süreyi almak için API.
- senin azaltma işlevi çağrıldı son zamandan bu yana geçen gerçek süreyi hesaplayınız (Bu dClock arayacağım).
- dCPU / dClock (bir CPU) yüzde CPU kullanımı. Eğer istediğiniz yüksekse düşük, uyku süresini azaltmak, eğer uyku süresi artar.
- bilgisayarlı kez iplik uykular.
Sizin bekçi CPU kullanımını hesaplar şekline bağlı olarak, kullanmak isteyebilirsiniz GetProcessAffinityMask () sistem kaç CPU'lar öğrenmek için. dCPU / (dClock * CPU) toplam CPU yüzdesidir mevcuttur.
Hala ilk uyku süresi ve arttırma / azaltma miktarı için bazı sihirli sayı seçmek zorunda kalacak, ama bu algoritma CPU belirlenen yüzde oldukça yakın çalışan bir iş parçacığı tutmak için ayarlanmış olabilir düşünüyorum.
linux üzerinde, Nice'in içeren ileti zamanlama önceliğini değiştirebilirsiniz ().
Sorun şu ki sen yapacak işi varken işlemci boşta bırakmak istiyorum normal olmaması. Normalde öncelik IDLE ve OS ona interaktif görevler tarafından kullanılmaz tüm CPU zamanı planlama halledeyim bir arka plan görevi ayarlayın.
Sorun bekçi süreçtir gibi bana geliyor.
Arka plan görev CPU bağımlı ardından ise, onun göreve ilişkin tüm kullanılmayan işlemci zamanını almak istiyorum.
Belki bekçi programı sabitleme bakmak gerekir?
Ne istediğini herhangi çapraz platform (veya herhangi bir garanti yolu tam durağı) düşünemiyorum ama GetTickCount'u kullandığınız olarak belki çapraz platformda ilgilenmiyor :)
Ben arası iletişimi kullanmak ve yoğun prosesler ne gerektirir almak için güzel düzeylerini ayarlamak ama bu durumunuza uygun olduğundan emin değilim ediyorum.
DÜZENLEME: katılıyorum Bernard Bir süreç yerine bir iş parçacığı daha uygun olabileceğini düşünüyorum ama sadece amacınıza uygun olmayabilir olmasını sağlıyor.
Bir iş parçacığı önceliğini değiştirmek mümkün, ama her iki yoklama gerektiren ve çok şey meydana gelen ya da bir sürecin maksimum kullanımını ayarlayabilirsiniz OS araçlarını kullanarak nasıl sınırlamak için kesmek olur maksimum kullanımını değiştirme olabilir. Ancak, ben bunu yapmak isteyeyim her duruma görmüyorum.