Dlaczego I / O jest nieprzerwany?

11

Jakie są uzasadnienia dla nieprzerywalności we / wy? Jakie byłyby negatywne konsekwencje, gdyby proces obsługujący operacje we / wy mógł obsługiwać sygnał?

twimo
źródło
write(2)może wrócić wcześniej, zwracając rzeczywistą liczbę zapisanych bajtów, która może być mniejsza niż długość bufora przekazana jako trzeci argument.
Peter Cordes

Odpowiedzi:

9

Wszelkie operacje we / wy są obsługiwane przez wywołanie systemowe wywołane przez proces. W końcu takie wywołanie systemowe spłynie w dół do odpowiedniej funkcji sterownika niskiego poziomu w celu wykonania faktycznej operacji we / wy.

We / wy może być trudne - aby faktycznie pobrać i wyjąć dane z urządzenia, konieczne może być wykonanie różnych kroków, w kolejności i ewentualnie z wymaganiami dotyczącymi czasu. Jeśli te kroki nie zostaną wykonane atomowo, przy następnej próbie urządzenie może nie zareagować, źle się zachowywać, a nawet spowodować zablokowanie systemu. Kroki te mogą być różne i unikalne dla każdego urządzenia, dlatego jest tak wiele sterowników urządzeń.

Dobrze napisany sterownik urządzenia powinien wiedzieć, jak postępować z urządzeniem, które usiłuje serwisować, więc normalnie nie powinien napotykać problemów, chyba że wystąpi błąd sterownika, używasz niewłaściwego sterownika urządzenia lub urządzenie fizyczne nie działa.

LawrenceC
źródło
5

Teraz, gdy przeczytałem książkę „Projektowanie systemów operacyjnych Unix” Maurice'a Bacha, pozwól, że sam odpowiem na to pytanie.

Krótko mówiąc, uczynienie I / O nieprzerwanym ma na celu sprawienie, aby zadanie I / O zakończyło się JAK NAJSZYBCIEJ, bez ingerencji w sygnały.

Powiązana wiedza, którą zdobyłem z książki:

  1. Słowo „nieprzerwany” powinno odnosić się do „nieprzerwanego snu”. Gdy proces jest w nieprzerwanym śnie, NIE może go obudzić sygnał, ani nie może obsłużyć sygnałów.
  2. Proces obsługuje sygnały, gdy: działa w trybie jądra i wkrótce powróci do trybu użytkownika. b. zaraz wejdzie i wyjdzie ze stanu snu, gdy sen jest przerywany.
  3. Co dzieje się, gdy sygnał uśpienia budzi sygnał? Poradziłby sobie z sygnałem, przy czym akcja domyślna wychodzi z procesu. Gdy proces czeka na zakończenie operacji we / wy, oczywiście nie chcesz, aby zakończyła się przedwcześnie.
twimo
źródło
2

Niektóre ścieżki kodu w jądrze są oznaczone jako nieprzerywalne, głównie dlatego, że kod musi być zgodny z ścisłym wyczuciem czasu (aby odpowiedzieć na urządzenie) lub dlatego, że robi coś, co nie dopuszcza interferencji. W przypadku Linuksa większość z tych pierwszych została wypchnięta na niezależne stopnie wbudowane w jądro, a drugie były w większości błędne (podejrzewam, że głównie pod presją obecnych maszyn wieloprocesorowych). Tj. Minęło już trochę czasu, gdy nie widziałem procesu w nieprzerwanym śnie.

vonbrand
źródło
3
Spróbuj przeczytać porysowaną płytę CD.
Joshua
1
Lub montaż za pomocą sshfs, a następnie pociągnięcie za kabel sieciowy. Nieprzerwany sen zdarza się, nawet w dzisiejszych czasach, gdy działa nośnik / pamięć. I zazwyczaj jest to cholerny ból w dupie.
Nubarke