Ręczne wspomaganie planisty

Wpis dotyczy sztuczki, która może przydać się użytkownikom wieloprocesorowych komputerów pracujących pod kontrolą systemu Windows (oczywiście jest to możliwe również w systemach uniksowych, ale nie zajmowałem się tym).

Planista jest częścią jądra systemu operacyjnego, która odpowiada za rozplanowanie w czasie przydziału wykonujących się programów do procesora. Nie zagłębiając się w szczegóły techniczne, warto wiedzieć że we współczesnych komputerach w ciągu jednej sekundy takie przełączenia pomiędzy jednym wykonywanym programem a kolejnym liczy się w setkach albo nawet tysiącach. W tej tematyce szczególnie polecam dwie bardzo dobre książki: Uresh Vahalia “Jądro systemu Unix” oraz Abraham Silberschatz “Podstawy Systemów Operacyjnych

Również bez zagłębiania się w szczegóły techniczne, w miarę intuicyjne i oczywiste jest to, że jeżeli posiadamy komputer z wielordzeniowym procesorem to różne programy mogą wykonywać się równolegle. Jeżeli program obsługuje wielordzeniowy procesor (program jest wielowątkowy) to na takiej maszynie będzie wykonywał się tyle razy szybciej ile procesor ma rdzeni. Obserwując użycie procesora w komputerze z procesorem wielordzeniowym widać, że ten sam program może być wykonywany na wielu rdzeniach nawet jeśli nie jest wielowątkowy. Obciążenie rozkłada się wtedy równomiernie i sumaryczne obciążenie wszystkich rdzeni jest odwrotnie proporcjonalne do liczby rdzeni.

Pomysł z równomiernym rozkładaniem obciążenia z całą pewnością jest sensowny i nie mam zamiaru wnikać w techniczne powody dlaczego tak to zostało zrobione. Niemniej jednak zauważyłem, że zdarzają się sytuacje, gdy ta równomierność może być uciążliwa. W sytuacji, gdy wykonujemy jakąś intensywnie obliczeniowo aplikację typu kodowanie filmu, muzyki, zdjęć przez dłuższy czas i jednocześnie chcemy np. korzystać z przeglądarki internetowej to widać, że działa ona znacznie wolniej ponieważ “dzieli” procesor z “żarłoczną” aplikacją do kodowania. W takiej sytuacji warto zmusić system operacyjny, aby konkretna aplikacja wykonywała się tylko na konkretnym jednym rdzeniu procesora. Dzięki temu chociaż nasze kodowanie potrwa dłużej (ale zazwyczaj nie ma dla nas znaczenia czy jest to 10 czy 15 minut), ale znacznie polepszy się responsywność tej drugiej aplikacji na której chcemy działać cały czas - np. przeglądarki internetowej. Z obserwacji widzę, że działa ona mniej więcej tak sprawnie jakby w tle nie wykonywała się żadna intensywna operacja typu kodowanie. W systemie Windows takiego przydziału programu do rdzenia procesora dokonuje się np. przy użyciu darmowego narzędzia firmy Sysinternals (która jest obecnie częścią Microsoftu) - Proces Explorer’a. Klikamy prawym przyciskiem myszki na proces (proces - to wykonujący się program) i wybieramy opcję ‘Set affinity’. Moim zdaniem warto poeksperymentować z przydzielaniem procesów tylko do pojedynczych rdzeni - można uzyskać ciekawe zwiększenie responsywności systemu podczas wykonywania wielu różnych nietypowych programów.

PS1. Warto wiedzieć, że Sysinternals udostępnia wszystkie swoje narzędzia w postaci współdzielonego folderu przez protokół SMB pod adresem live.sysinternals.com - należy wpisać ten adres w polu ‘adres’ dowolnego okna eksploratora Windows lub w poleceniu Start/Uruchom.

PS2. Chcąc zautomatyzować uruchamianie programu tylko na konkretnym rdzeniu można użyć darmowego konsolowego narzędzia RunFirst, które uruchamia wskazany program zawsze na pierwszym rdzeniu procesora.