Dobrý den,
mám démona, kterýžto reaguje na události vytvářením instancí aplikací, kteréžto následně spouští. No a potřeboval bych efektivněji vynaložit výkon. Mohu tedy nakládat s jádry CPU? A jak se v .NET předává vláda nad CPU? (Když se chci vzdát přiděleného prostoru - ačkoliv toto nepracuje v kooperativním multitaskingu, i v klasickém je možnost se přiděleného prostoru vzdát, co vím.)
Fórum › .NET
Služba na rozdělování programů mezi jádry
Ahoj, každý proces má prioritu, která určuje, kolik času mu CPU věnuje oproti ostatním procesům. V C# to lze měnit pomocí Process.PriorityClass. Lze tak samozřejmě změnit i svůj proces.
Nemůžeš nicméně OS přímo nadiktovat jaký proces má běžet na jakém vlákně...
A ještě projistotu poznámka. Než to pustíš někde na produkci, tak tu prioritu pořádně otestuj i na slabších PC. Hlavně ta nejvyšší, když je nastavená na proces, který vytíží CPU na 100%, dokáže celý PC dost slušně zasekat...
#2 PiranhaGreg
Ale já chci pracovat s jádry - ne vlákny... Aby se na jednom jádře stahovalo, zatímco na druhém zpracovávalo. A k onomu vzdání se přiděleného prostoru - tuším, že odpovědí bude sleep. Ovšem to dle mého jen vyplní přidělený prostor - nepustí.
Přepsal jsem se, chtěl jsem napsat
Nemůžeš nicméně OS přímo nadiktovat jaký proces má běžet na jakém jádře...
Tohle už si řeší OS a nejde mu do toho kecat. Každopádně není hloupý a když dostane dva procesy, které jsou náročnější, nechá každý běžet na jiném jádře, tak jak by jsi to chtěl.
A k onomu vzdání se přiděleného prostoru... Nevím, co si pod tím přesně představit. Buď můžeš spáchat harakiri a pak nebudeš nikde nic zabírat a nebo si nastavit tu nejnižší prioritu a CPU tě tak přestane skoro řešit a systém ti při první příležitosti přesune okupovanej flek na RAMce na disk.
Opět, tohle by neměla být starost programu/služby, ale OS. Na tobě akorát je, aby jsi minimalizoval využití RAMky. Tedy nedržet (při čekání na další signály) v paměti nějaké zbytečné datové struktury a pokud chceš mít jó jistotu, tak ještě poprosit GCčko, aby se kouklo, jestli se nedá ještě někde něco zahodit.
Teď mě napadlo, nemáš tam doufám aktivní čekání?
#3 Matěj Andrle
Sleep() uvolní procesor až do konce ticku, mluvím o winapi ale předpokládám že to v dotnetu bude podobné. Snadno to zkusíš třeba nastavením čekání na 30sec a kouknout do task manageru :)
omezit proces či vlákno lze nastavením tzv Process/Thread affinity mask, dál už určitě vygooglíš.
Pokud nepotřebuješ předávat data mezi vlákny/procesy opravdu hodně často, tak je lepší nahradit poolování pomocí posílání zpráv nebo synchronizačních funkcí (event,mutex, semafor, a nebo jejich nadstavby), ty totiž předají procesor OS a obnoví se až když je potřeba(tj. druhý proces/vlákno uvolní mutex, atp). Potom už bývá lepší to nechat na OS protože si s tím obvykle už dobře poradí.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Výstup v programu pro převod mezi soustavami — založil Mordor
Sluzba WIN — založil Misiak
Systémová služba — založil machis
Služba - logování vyjímek — založil hlucheucho
GetIp() (sluzba tcp) — založil I.
Moderátoři diskuze