Eksperymentuję z SCHED_FIFO
i widzę pewne nieoczekiwane zachowanie. Serwer, z którego korzystam ma 12 rdzeni z wyłączonym hyper-threadingiem. Wszystkie konfigurowalne przerwania zostały ustawione na procesor 0.Praktyczne wykorzystanie priorytetów planowania w czasie rzeczywistym Linuksa (SCHED_FIFO i SCHED_RR)?
Rozpoczęcie mojego programu tworzy wątek dla zadań o niższym priorytecie przy użyciu biblioteki pthreads bez zmiany strategii planowania z powinowactwem CPU ustawionym na rdzeń 0. Wątek rodzicielski następnie ustawia swój procesor powinowactwo do rdzenia 3 i jego własnej polityki szeregowania do SCHED_FIFO
przy użyciu sched_setscheduler()
z pid zero i priorytet 1, a następnie rozpoczyna się pętla nieblokująca.
Sam program działa dobrze. Jeśli jednak spróbuję zalogować się do serwera po raz drugi podczas działania programu, terminal przestaje odpowiadać, dopóki nie zatrzymam programu. To tak, jakby program planujący próbował uruchomić inne procesy w tym samym rdzeniu, co proces w czasie rzeczywistym.
- Czego mi brakuje?
- Czy program planujący nadal będzie próbował uruchamiać inne procesy w rdzeniu działającym w czasie rzeczywistym? Jeśli tak, czy istnieje sposób, aby temu zapobiec?
- Czy ustawienie zasady szeregowania z
sched_setscheduler()
w rodzicu zmieni zachowanie dziecka, które zostało utworzone wcześniej?
Z góry dziękuję.
Dzięki za Odpowiadać. Masz rację, dokumentacja mówi, że sched_setscheduler() ustawia politykę planowania dla procesu, a nie wątek. Jednak po przeczytaniu tej odpowiedzi uruchomiłem kilka testów za pomocą ps, a zasady są ustawione poprawnie dla wątków. To skłoniło mnie do uruchomienia dalszych testów. Jednym z najbardziej zauważalnych problemów jest to, że logowanie trwa długo, gdy program jest uruchomiony. Zdecydowanie wygląda na to, że sesja bash dla nowego logowania jest początkowo ustawiona na procesor działający w czasie rzeczywistym. – digby280