Czy harmonogramowanie kooperacyjne zawiesza procesy podczas wykonywania operacji we / wy?


19

Wiele odniesień do systemów operacyjnych mówi, że w przypadku wielozadaniowości kooperacyjnej (w przeciwieństwie do zapobiegawczej) proces utrzymuje procesor do momentu, aż jawnie się dobrowolnie zawiesi. Jeśli uruchomiony proces wykonuje żądanie we / wy, którego nie można natychmiast zaspokoić (np. Żąda naciśnięcia klawisza, który nie jest jeszcze dostępny), to czy program planujący zawiesza go, czy naprawdę utrzymuje procesor do czasu, aż żądanie zostanie obsłużone?

[Edytowane w celu zastąpienia „bloków we / wy” na „wykonuje żądanie we / wy, które nie może być natychmiast spełnione.”]


Wydaje się, że pytania te wymagają określenia systemów operacyjnych, które, imho, byłyby tutaj nie na temat. Jeśli tak nie jest, przeredaguj swoje pytanie na bardziej abstrakcyjne.
Raphael

3
Kiedy opublikowałem to w grupie Unix, powiedziano mi, że jest tam niewłaściwe i należało tutaj, z czym się zgodziłem, ponieważ nie chodzi o jeden konkretny system operacyjny. Myślę, że ten jest porównywalny z pytaniem o prognozowanie gałęzi. Ciekawie będzie zobaczyć, co społeczność decyduje o tym, co jest, a co nie jest właściwe tutaj.
Ellen Spertus,

Odpowiedzi:


15

W prawdziwie „kooperatywnym” ustawieniu i jeśli nie ma ochrony sprzętowej, proces z pewnością mógłby zablokować I / O i nie zrzec się kontroli, dopóki I / O nie zostanie wykonane (lub w ogóle nie zrzec się kontroli). Na przykład system Windows 3.1 działał w ten sposób: jeśli proces jednego użytkownika chciał przejąć cały komputer i uniemożliwić uruchomienie czegokolwiek innego, mógł to zrobić.

Ale w systemie z wielozadaniowością oczekuje się, że systemowe polecenia interfejsu API we / wy zrzekną się kontroli nad procesorem po ich wywołaniu. Tak więc, gdy działający proces blokuje się we / wy, zakładając, że proces używa normalnych systemowych interfejsów API, inne procesy będą mogły działać do czasu zakończenia operacji we / wy, a ostatecznie oryginalny proces zostanie wznowiony po zakończeniu operacji we / wy . Innymi słowy, wywołanie blokującej funkcji We / Wy jest jednym ze sposobów, w jaki proces w systemie kooperacyjnym może się dobrowolnie zawiesić.


11

Jeśli działający proces blokuje się we / wy

Blokowanie we / wy jest prawie równoważne zawieszeniu procesu. W kontekście jądra Linuksa wykonanie jakiegoś wywołania systemowego IO, takiego jak read()spowoduje, że sysenterprogram obsługi lub przerwań wyzwoli opiekę nad tym IO, do_sys_read()ostatecznie dzwoniąc . Tutaj, jeśli bieżące żądanie nie może być natychmiast spełnione, wywołania funkcji, sched()które następnie mogą wykonać inny proces.

W kontekście systemu kooperacyjnego oczekiwałbym, że kiedy wykonasz wywołanie systemowe z jakiegoś powodu IO, jeśli żądanie nie może zostać spełnione, jądro wybiera inne zadanie i wykonuje je. Ten dokument stanowi pewne tło - w zasadzie, jeśli czekałeś na IO, możesz zostać zawieszony na zawsze, czekając na to IO. Ideą wspólnego planowania jest to, że często wywołujesz sched()lub równoważna metoda rezygnacji z procesora, jeśli wykonujesz zadania wymagające dużej mocy procesora.

Zagadnienia dotyczące trybu jądra stają się bardziej interesujące. W architekturach, w których są one dostępne, takich jak niektóre wbudowane platformy , programy obsługi przerwań będą nadal wywoływane w odpowiedzi na zakłócenia sprzętowe lub programowe. Zazwyczaj możliwe jest wyłączenie obsługi przerwań , ale ma to również wady.


4

W modelu planowania kooperacyjnego (najlepiej cooperative multitasking) nie ma koncepcji harmonogramu w tym sensie, że system operacyjny nie ma żadnej kontroli nad czasem trwania procesu.

Prawidłowo zaprogramowana aplikacja dobrowolnie zrezygnuje z procesora we / wy. Ale źle napisane aplikacje mogą po prostu czekać na operacje we / wy, blokując w ten sposób inne procesy.

PS: To podejście zostało później zrezygnowane przez większość systemu operacyjnego na rzecz planowania wyprzedzającego (który miał zewnętrzny program planujący), a teraz mamy wiele różnych algorytmów planowania używanych przez różne systemy operacyjne.

EDYCJA: Moja odpowiedź była oparta na harmonogramie, jak opisano w oryginalnej formie (lata temu: P). Jak zauważył Gilles, niektóre systemy nadal korzystają z harmonogramu kooperacyjnego. I jest harmonogram. Nie jestem pewien, czy systemy te używają COS w czystej i oryginalnej formie.


2
Wiele wbudowanych systemów operacyjnych (w tym między innymi RTOS) ma wspólne harmonogramy. Nie oznacza to, że nie ma harmonogramu; harmonogram jest kodem, który określa, który wątek ma zostać uruchomiony w następnej kolejności. Zapobieganie polega na tym, że harmonogram jest wprowadzany automatycznie, a nie na żądanie uruchomionego zadania.
Gilles „SO- przestań być zły”

@Gilles Ładny komentarz (wprowadzanie do edycji). Zgadzam się z tobą, że nie jest całkowicie nieużywany. Moja odpowiedź była oparta na algorytmie zdefiniowanym pierwotnie. AFIK, jest używany z pewnymi modyfikacjami (z pewnym harmonogramem). Nie jestem pewien, czy był używany w czystej postaci w niektórych systemach operacyjnych.
Ankit,

4

Wielozadaniowość kooperacyjna implikuje, że kontekst wykonywania musi jawnie zrzec się kontroli nad harmonogramem, a jeśli chce, może zapobiec zmianie kontekstu.

Większość implementacji wyraźnie wykonuje zmianę kontekstu dla każdego wywołania systemowego, które nie zwraca natychmiast, a często nawet jeśli tak, aby zwiększyć sprawiedliwość alokacji procesorów.

Zwykle w przypadku nieudanych procesów (lub celowo odmawiania obsługi pozostałej części systemu) możliwe jest tylko zapobieganie częstemu przełączaniu zadań.

Wykluczenie, jak wyjaśnił Gilles, jest ograniczeniem architektury systemu, które zapobiega przerwaniu w czasie aktywnego zadania i wymuszonym przełączeniom kontekstu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.