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ł?
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.
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:
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.
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.
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.
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.
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.
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.Odpowiedzi:
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.
źródło
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:
źródło
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.
źródło