System wejścia/wyjścia


Streszczenie

Komputer prowadzi obliczenia i kontaktuje się z użytkownikiem, tzn. przeprowadza operacje wejścia/wyjścia. W wykładzie 10 zajmiemy się tym drugim aspektem życia komputera tzn. wejściem/wyjściem. Bez niego komputer byłby bezużyteczny. Co z tego, że wszystko obliczy, skoro nie można zobaczyć wyników?

System operacyjny zarządza operacjami wejścia/wyjścia i sprawuje nadzór nad urządzeniami zewnętrznymi, które te operacje obsługują. Różnorodność urządzeń zewnętrznych jest ogromna. W tym wykładzie omówimy wspólne dla wszystkich urządzeń wejścia/wyjścia zagadnienia związane z systemem wejścia/wyjścia: podstawy sprzętowe, zasadnicze usługi świadczone przez system operacyjny, interfejs wejścia/wyjścia aplikacji oraz kwestie wydajnościowe.


Podstawowe pojęcia

Komputer składa się z: procesora, urządzeń zewnętrznych, sterowników urządzeń zewnętrznych, pamięci operacyjnej, pamięci podręcznej, sterownika pamięci i magistrali systemowej. Urządzenia zewnętrzne komunikują się z systemem komputerowym poprzez przesyłanie sygnałów. Łączem między urządzeniem i komputerem jest tzw. port. Porty są podłączane do szyn tzn. mediów, którymi przesyłane są sygnały (takim medium może być wiązka przewodów; przesyła się przez nią sygnały w postaci impulsów elektrycznych). Do jednej szyny może być podłączonych wiele portów urządzeń. W komputerze mogą również występować układy szeregowe, tzn. że urządzenie A jest podłączone do urządzenia B, które z kolei jest połączone z urządzeniem C, które jest już bezpośrednio połączone do portu komputera.

Sterownik jest układem elektronicznym, który nadzoruje pracę portu, szyny lub urządzenia albo większej ich grupy. Sterownik pośredniczy w przesyłaniu informacji z i do urządzeń. Sterownik ma własną pamięć, w której może buforować dane przesyłane do i z urządzeń. Pozwala to na szybkie przesłanie informacji szyną systemową, niezależnie od prędkości urządzenia. Do szyny systemowej mogą też być podłączone sterowniki, które łączą główną szynę z szynami niższego poziomu (np. PCI, ISA), do których też mogą być podłączone sterowniki, itd. Często też urządzenia zewnętrzne są podłączone do sterownika za pomocą odpowiedniej szyny (np. SCSI). Tak więc w systemie zwykle mamy wiele szyn:

Procesor przekazuje sterownikom polecenia i dane niezbędne do wykonania tych poleceń. Sterownik ma specjalny rejestr, który służy do przekazywania komunikatów z i do procesora. Procesor porozumiewa się ze sterownikiem pisząc i czytając bity w tym rejestrze. Przesłanie tych bitów do rejestru urządzenia może odbywać się poprzez specjalne instrukcje wejścia/wyjścia będące zleceniami przesłania bitów na adres portu wejścia/wyjścia. Rozkazy te powodują przekazanie bitów z i do rejestrów sterujących urządzenia poprzez szynę.

Rejestry sterujące urządzenia mogą być też odwzorowane w pamięci operacyjnej. Wówczas komunikacja z urządzeniem odbywa się poprzez zapis i odczyt odpowiednich bajtów w pamięci operacyjnej.


Odpytywanie

Protokół komunikacji między procesorem i sterownikiem urządzenia musi obejmować zagadnienie koordynacji ich współpracy. Procesor musi mieć wiedzę o tym, czy urządzenie jest zajęte, żeby odebrać od niego wyniki zleconego zadania i móc mu zlecić nowe.

Do przekazywania tej informacji mogą służyć dwa bity: bit gotowości procesora i bit zajętości urządzenia. Sterownik ustawia na 1 bit zajętości, gdy właśnie obsługuje zlecenie, i zeruje go, gdy skończy. Procesor ustawia na 1 bit gotowości polecenia, gdy polecenie dla sterownika jest już gotowe. Koordynacja ma postać następującego ciągu czynności:

  1. Procesor czyta w pętli bit zajętości urządzenia do chwili, gdy przyjmie on wartość 0.
  2. Procesor do rejestru wpisuje dane dla sterownika.
  3. Procesor ustawia na 1 bit gotowości polecenia.
  4. Sterownik czyta bit gotowości i gdy zauważy, że jest on równy 1, to ustawia na 1 bit zajętości.
  5. Sterownik odczytuje polecenie i wykonuje je.
  6. Sterownik zeruje bit gotowości polecenia i bit zajętości sygnalizując wykonanie polecenia.
Niestety w pierwszym kroku procesor wykonuje aktywne czekanie, inaczej odpytywanie, tzn. tak naprawdę nie robi nic sensownego czekając na zwolnienie urządzenia. Taka metoda jest akceptowalna w wypadku bardzo szybkich urządzeń. Jeśli jednak miałoby to trwać dłużej (np. czekanie na naciśnięcie klawisza), to z pewnością warto, żeby procesor zajął się czymś innym. Urządzenie musi jednak jakoś zawiadamiać procesor o zakończeniu wykonania polecenia. W następnym punkcie omówimy mechanizm sprzętowy niewymagający aktywnego czekania. Za pomocą tego mechanizmu sterownik może poinformować procesor o swojej gotowości.


Przerwania

Przerwania są sprzętowym mechanizmem służącym do zawiadamiania procesora o rozmaitych zdarzeniach. Procesor ma tzw. linię zgłaszania przerwań, którą bada po wykonaniu każdej instrukcji. Widać więc, że wsparcie sprzętowe dla mechanizmu przerwań jest nieodzowne. Gdy procesor wykryje, że zgłoszono jakieś przerwanie (mógł to zrobić na przykład sterownik urządzenia), to zachowuje stan swoich obliczeń (m.in. licznik instrukcji) i wykonuje skok do procedury obsługi przerwania. Ta procedura wykonuje odpowiednie czynności związane z obsługą przerwania i na końcu wydaje instrukcję powrotu z przerwania, która powoduje przywrócenie stanu obliczeń procesora sprzed przerwania.

Przerwania maskowalne i niemaskowalne

Wśród przerwań niektóre są ważniejsze od innych. Obsługa tych ważniejszych nie powinna być przerywana przez te mniej ważne. Nie będziemy przecież obsługiwać przerwań z klawiatury w czasie obsługi przerwania spadku zasilania w sieci, gdy system operacyjny musi szybko zamrozić i zapisać stan wszystkich obliczeń dopóki UPS jeszcze utrzymuje przez pewien czas napięcie. Wyróżnia się więc zwykle dwie grupy przerwań: maskowalne i niemaskowalne. Odbieranie przerwań maskowalnych może być chwilowo wyłączone (procesor je wtedy ignoruje albo odkłada na później). Odbierania przerwań niemaskowalnych nie można wyłączyć. Sterowniki urządzeń korzystają z przerwań maskowalnych. Przerwania niemaskowalne wiążą się z poważniejszymi zdarzeniami, takimi jak nieusuwalne błędy pamięci.

Wektor przerwań

Przerwanie niesie ze sobą swój identyfikator. W większości systemów jest to niewielka liczba będąca przesunięciem (offsetem) w specjalnej tablicy zwanej wektorem przerwań. W tej tablicy znajdują się adresy procedur obsługi poszczególnych przerwań. I tak wystąpienie przerwania nr 5 powoduje skok do procedury obsługi, której adres znajduje się na piątej pozycji tejże tablicy. W ten sposób obsługa przerwania nie wymaga wyszukiwania odpowiedniej procedury, a jedynie odczytania jednej pozycji wektora przerwań. W procesorze Intel wektor przerwań ma 255 pozycji. Pierwsze 32 pozycje odpowiadają przerwaniom niemaskowalnym (są to rozmaite błędy). Pozostałe pozycje są przerwaniami maskowalnymi.

Obsługa wejścia/wyjścia za pomocą przerwań

Obsługa operacji wejścia/wyjścia za pomocą przerwań przebiega następująco:

  1. Procesor zleca wykonanie operacji wejścia/wyjścia i wykonuje inne prace cały czas sprawdzając, czy zaszło przerwanie.
  2. Sterownik wykonuje operację wejścia/wyjścia.
  3. Sterownik generuje sygnał przerwania, gdy zakończy operację wejścia/wyjścia.
  4. Procesor przyjmuje przerwanie i wykonuje skok do obsługi procedury tego przerwania.
  5. Procesor wykonuje procedurę obsługi przerwania, która może polegać na odebraniu danych od sterownika urządzenia.
  6. Procesor wykonuje powrót z przerwania po zakończeniu działania procedury obsługi przerwania.
  7. Procesor wraca do wykonywania przerwanego zadania.


Bezpośredni dostęp do pamięci (DMA)

Gdy urządzenie przekazuje dużą ilość danych, dokonywanie tego transferu bajt po bajcie poprzez procesor jest marnotrawstwem. Lepszym rozwiązaniem jest skorzystanie z pamięci operacyjnej. Idea DMA (direct memory access) jest bardzo prosta: sterownik wpisuje dane bezpośrednio do pewnego bufora w pamięci, skąd można potem te dane odczytać. Do realizacji DMA potrzebne jest dodatkowe urządzenie, tzw. sterownik bezpośredniego dostępu do pamięci. Sterownik ten pośredniczy między sterownikiem urządzenia i pamięcią operacyjną, zarządzając szyną pamięci w celu przekazania poszczególnych bajtów. Bezpośredni dostęp do pamięci odbywa się wg następującego scenariusza:

  1. Moduł sterujący urządzenia dostaje zlecenie przesłania danych pod adres X.
  2. Moduł sterujący urządzenia zleca sterownikowi urządzenia pobranie danych i przesłanie ich do bufora pod adresem X.
  3. Sterownik urządzenia rozpoczyna przekaz DMA.
  4. Sterownik urządzenia przesyła poszczególne bajty do sterownika DMA.
  5. Sterownik DMA umieszcza otrzymane bajty w pamięci operacyjnej.
  6. Sterownik DMA wywołuje przerwanie procesora po otrzymaniu wszystkich bajtów.


Interfejs programowy wejścia/wyjścia

Jak wspomniano na wstępie, różnorodność urządzeń wejścia/wyjścia jest ogromna. Niemniej jednak, za pomocą podejścia warstwowego można tak obudować metody dostępu do urządzeń, że korzystanie z nich odbywa się w sposób uniwersalny za pomocą niewielkiej liczby podprogramów.

Moduły sterujące

Różnice między poszczególnymi urządzeniami są obudowane za pomocą specjalnego oprogramowania tzw. modułów sterujących (ang. driver). Moduł sterujący bezpośrednio zarządza sterownikiem urządzenia (ang. controller) i oferuje podsystemowi wejścia/wyjścia jądra pewien standardowy interfejs. To pozwala na łatwe dołączanie nowych rodzajów urządzeń, upraszcza pisanie systemów operacyjnych i oprogramowania użytkowego.

Klasyfikacja urządzeń

Interfejs programowy urządzenia na poziomie jądra można więc uzależnić jedynie od jego kluczowych właściwości. Oto krótka klasyfikacja urządzeń:

Strumień znaków albo bloki
Urządzenie znakowe (np. klawiatura) przesyła znak po znaku, podczas gdy urządzenie blokowe (np. dysk) jednorazowo przesyła cały blok danych.
Dostęp sekwencyjny albo swobodny
Urządzenie o dostępie sekwencyjnym (np. modem) przesyła dane w określonej i tylko takiej kolejności. Urządzenie o dostępie swobodnym (np. dysk) może przesłać w każdej chwili dowolne dane niezależnie od ich położenia i kolejności.
Dzielenie albo wyłączność
Urządzenie dzielone (np. klawiatura) może być jednocześnie wykorzystywane przez wiele procesów. Urządzenie o dostępie wyłącznym (np. drukarka) nie może jednocześnie dwom panom służyć.
Szybkość działania
Urządzenia mogą działać z rozmaitą prędkością: od kilku bajtów na sekundę do kilku gigabajtów na sekundę.
Zapis-odczyt, tylko odczyt, tylko zapis
Urządzenie może udostępniać tylko odczyt (np. napęd dysków optycznych), tylko zapis (np. drukarka), albo oba jednocześnie (np. dysk).
Wyróżnimy jeszcze dwa szczególne rodzaje urządzeń:
Urządzenia sieciowe
Urządzenia sieciowe stanowią dość szczególną grupę ze względu na wydajność i adresowanie. Zwykle mają więc szczególny interfejs, inny niż czytaj-pisz-szukaj charakterystyczny dla urządzeń blokowych. Ważnym aspektem urządzeń sieciowych jest nawiązywanie połączenia, nasłuchiwanie z jednego połączenia oraz nasłuchiwanie z wielu połączeń równocześnie i obsługa jednego połączenia, którym akurat przysłano dane.
Zegary i czasomierze
Ich zadaniem jest podawanie bieżącego czasu, czasu trwania czegoś i uruchamianie operacji w ściśle określonej chwili. Szczególność tych urządzeń wynika z tego, że nie chodzi tu o transfer danych, ale raczej o synchronizację. Podczas gdy w wypadku np. dysku przerwanie oznacza zakończenie operacji, to w wypadku zegara przerwanie zegarowe jest jedynym oczekiwanym wynikiem jego działania!

Wejście/wyjście z blokowaniem i bez

Obsługa żądania wejścia/wyjścia zajmuje pewien czas. Proces zlecający może w tym czasie coś robić. Istnieją trzy opcje określające, jak może zachować się zlecający proces:

Blokujące wejście/wyjście
Proces czeka uśpiony na zakończenie operacji wejścia/wyjścia. Ta najprostsza opcja nie jest jednak wystarczająca do wszystkich celów, ponieważ w czasie oczekiwania proces może chcieć robić coś sensownego (np. czekając na aktywność użytkownika w wolnej chwili odśmiecić swoją pamięć).
Nieblokujące wejście/wyjście
Proces nie usypia ale otrzymuje od ręki tak dużo wyników, jak tylko jest to możliwe. Nieblokujący odczyt z klawiatury mógłby polegać na przykład na odczycie tego, co już jest w buforze klawiatury, ale nie obejmowałby już czekania na działania użytkownika. Nieblokujące wejście/wyjście ma sens w wypadku wolnych urządzeń (interfejs użytkownika).
Asynchroniczne wejście/wyjście
Proces zleca operacje wejścia/wyjścia i zajmuje się czymś innym. Gdy operacja wejścia/wyjścia jest zakończona, proces jest o tym informowany za pomocą jakiegoś sygnału.


Podsystem wejścia/wyjścia w jądrze

Jądra systemów operacyjnych oferują wiele usług związanych z wejściem/wyjściem. W tym punkcie omówimy te usługi oraz wykorzystanie przy ich implementacji pewnych szczególnych właściwości jądra.

Planowanie wejścia/wyjścia

Ogólne zagadnienie planowania omówiono w jednym z poprzednich wykładów. Skoncentrowano się tam na planowaniu dostępu do procesora. Dostęp do urządzeń również warto planować. Dotyczy to na przykład dysków. Gdyby żądania obsługiwano w takiej kolejności, jak przyszły, głowica dysku mogłaby przesuwać się bez potrzeby w tę i we w tę. Można za to tak zaplanować obsługę żądań dyskowych by zminimalizować zbędne ruchy głowicy. Co więcej, pewne zlecenia (np. dotyczące pamięci wirtualnej) mogą być pilniejsze niż inne (np. żądania aplikacji). Z każdym urządzeniem może być związana kolejka zleceń obsługiwana według odmiennej strategii. Systemy operacyjne starają się być też sprawiedliwe w planowaniu dostępu do urządzeń.

Buforowanie wejścia/wyjścia

Bufor to obszar pamięci do przechowywania danych przesyłanych między dwoma urządzeniami. Buforowanie takiego transferu danych jest ważne, ponieważ:

  1. Producent i konsument danych (jakieś urządzenia) mogą mieć różne szybkości.
  2. Producent i konsument danych (jakieś urządzenia) mogą posługiwać się jednostkami danych różnych rozmiarów.
  3. Potrzebna jest semantyka kopii, tzn. na dysku musi się znaleźć dokładnie to, co w swoich lokalnych buforach złożyła aplikacja. Aplikacja może zmienić zawartość swojego bufora już po zleceniu, ale zanim system operacyjny skopiuje ten bufor na dysk. Przypomnijmy, że operacja dyskowa jest wolniejsza. Z tego powodu systemy operacyjne najpierw kopiują dane ze zlecenia klienta do swego bufora, a potem dopiero z tego bufora na dysk. W ten sposób aplikacja nie jest w stanie zakłócić długotrwałego procesu zapisu na dysk.
Buforowanie wejścia/wyjścia pozwala rozwiązać te problemy.

Przechowywanie podręczne

Pamięć podręczna (ang. cache) jest obszarem szybkiej pamięci do przechowywania kopii danych. To udogodnienie pozwala na szybszy dostęp do oryginału danych i jest kluczem do szybszego działania systemu komputerowego. Jeśli aktualne dane są akurat w pamięci podręcznej, nie ma potrzeby wykonywania kosztownych czasowo operacji dyskowych.

Spooling

Spooling (SPOOL = simultaneous peripheral operations on-line = jednoczesna bezpośrednia praca urządzeń) to użycie bufora do przechowywania danych zlecenia dla obecnie zajętego urządzenia o dostępie wyłącznym. Przykładem takiego urządzenia jest drukarka. Zadania drukowania oczekują w kolejce na możliwość realizacji.

Rezerwacja urządzeń

System operacyjny udostępnia wywołania systemowe do przydziału i zwolnienia urządzenia o dostępie wyłącznym. Takie wywołania mogą prowadzić do zakleszczenia, z którymi system operacyjny musi sobie jakoś poradzić.

Obsługa błędów

System operacyjny może radzić sobie z rozmaitymi rodzajami błędów takimi jak błędny odczyt z dysku, awaria urządzenia (chwilowa lub trwała), czy chwilowe problemy z zapisem. Nieudaną operację można na przykład powtórzyć. Jeśli nic się nie da zrobić, wywołanie systemowe zwraca kod błędu. Oprócz tego w dzienniku systemowym system operacyjny zapisuje informacje o wszelkich awariach.

Struktury danych jądra

Jądro przechowuje informacje o stanie urządzeń wejścia/wyjścia w strukturach danych takich jak tablice otwartych plików, połączenia sieciowe, stany urządzeń znakowych. Są tam też złożone struktury do śledzenia buforów, przydziału pamięci, flag modyfikacji bloków. W niektórych systemach operacyjnych do implementacji przekazywania komunikatów wejścia/wyjścia wykorzystano metody znane z języków programowania obiektowego.


Od zlecenia do sprzętu

Rozważmy operację odczytu pliku z dysku. Składa się ona z następujących czynności:

  1. Ustalenie urządzenia, na którym znajduje się ten plik.
  2. Przetłumaczenia nazwy tego urządzenia na wewnętrzny identyfikator.
  3. Fizyczny odczyt danych z dysku do bufora.
  4. Udostępnienie danych zlecającemu procesowi.
  5. Przekazanie sterowania temu procesowi.

Droga od zlecenia operacji odczytu bloku dyskowego mogłaby wyglądać następująco:

  1. Proces użytkownika: zlecam odczyt bloku.
  2. Jądro: sprawdzam, czy można już zrealizować zlecenie (np. dzięki pamięci podręcznej).
  3. Jądro: jeśli tak, to udostępniam wynik zlecenia. Jeśli nie, to wysyłam zlecenie do modułu sterującego urządzenia.
  4. Moduł sterujący: wydaję polecenia sterownikowi urządzenia.
  5. Sterownik: steruję urządzeniem, przerywam po zakończeniu operacji wejścia/wyjścia.
  6. Sterownik: generuję przerwanie.
  7. Procedura obsługi przerwania: składam dane w buforze.
  8. Moduł sterujący: ustalam, którą operację wejścia/wyjścia zakończono, informuję jądro o zmianie stanu operacji.
  9. Jądro: przekazuję dane procesowi użytkownika.
  10. Proces użytkownika: mam dane lub wiem, że był błąd.
Zwróćmy uwagę na warstwowość tego procesu. Sterowanie najpierw przechodzi "w dół" potokiem jądro-moduł sterujący-sterownik, a potem potokiem "w górę" (sterownik-moduł sterujący-jądro).

Strumienie

Ta obserwacja pozwoliła na opracowanie mechanizmu strumieni, który umożliwia dynamiczne łączenie modułów obsługi w potoki. Cóż stoi na przeszkodzie, żeby w potoku sterownik-moduł sterujący-jądro albo z powrotem umieścić jeszcze jakieś dodatkowe moduły przetwarzające?

Strumień składa się z czoła, które służy do komunikacji z procesem użytkownika i z zakończenia sterującego, które zarządza sterownikiem. Między czołem i zakończeniem sterującym może występować wiele pośrednich modułów obsługi. Każdy taki moduł ma kolejkę do odczytu i kolejkę do zapisu. Moduły można dowolnie komponować i dynamicznie wymieniać.


Wydajność

Wejście/wyjście ma szczególnie duży wpływ na wydajność systemu operacyjnego, ponieważ:

  1. wymaga zasobów procesora do wykonywania modułu sterującego i kodu podsystemy wejścia/wyjścia w jądrze,
  2. powoduje przełączenia kontekstu w związku z obsługą przerwań (albo aktywne czekanie przy programowanym wejściu/wyjściu),
  3. oznacza kopiowanie danych.

Szczególnie kosztowna jest obsługa ruchu sieciowego a zwłaszcza w wypadku zdalnych sesji użytkownika. Popatrzmy na następujący scenariusz:

  1. Użytkownik wciska klawisz.
  2. Sterownik klawiatury generuje przerwanie.
  3. Aktywują się kolejno moduł sterujący klawiatury i podsystem jądra.
  4. Następuje przełączenie kontekstu na proces użytkownika, który zleca wysłanie wpisane znaku przez sieć do zdalnej maszyny.
  5. konstruowany jest pakiet sieciowy i przekazywany do modułu obsługi karty sieciowej.
  6. Wszystko musi przejść znów przez obsługę przerwania i przełączenie kontekstu.
  7. Pakiet jest odbierany na maszynie zdalnej, gdzie powoduje przerwanie i obsługę.
  8. Z pakietu wyjmuje się wpisany znak i przekazuje do procesu aplikacyjnego, który ma ten znak zrozumieć i obsłużyć.
Popatrzmy! Jeden znaczek i tyle przełączeń kontekstu. Widać teraz, jak to jest kosztowne.

Poprawianie wydajności

Poprawę wydajności wejścia/wyjścia osiągniemy poprzez:

  1. zmniejszenie liczby przełączeń kontekstu,
  2. zmniejszenie zakresu kopiowanie danych,
  3. ograniczenie liczby przerwań poprzez wykonywanie operacji wejścia/wyjścia na większych blokach danych, wykorzystanie inteligentnych sterowników i rozsądne wykorzystanie odpytywania,
  4. wykorzystanie bezpośredniego dostępu do pamięci,
  5. zwiększenie równoległości poprzez wykonywanie elementarnych działań za pomocą sprzętu w sterownikach urządzeń,
  6. zrównoważenie wydajności procesora, pamięci, szyn i operacji wejścia wyjścia.
Funkcje urządzeń wejścia/wyjścia można zrealizować w następujących miejscach:
  1. w kodzie aplikacji (oprogramowanie),
  2. w kodzie jądra (oprogramowanie),
  3. w kodzie modułu sterującego (oprogramowanie),
  4. w kodzie sterownika (sprzęt),
  5. w kodzie urządzenia (sprzęt).
Im wyższa pozycja na tej liście tym wyższa elastyczność, niższe koszty wytwarzania i czas budowy, jednak im pozycja niższa tym większa wydajność i abstrakcyjność (oddzielnie funkcji wejścia/wyjścia niższego poziomu od wysokopoziomowego kodu aplikacji).


Podsumowanie

W wykładzie 10 poznaliśmy, czym jest urządzenie zewnętrzne (wejścia/wyjścia) oraz w jaki sposób korzysta z niego system komputerowy. Kontakt procesora z urządzeniem może być zaimplementowany za pomocą odpytywania, przerwań i DMA.

Żądanie procesu użytkownika trafia do jądra systemu operacyjnego, w którym odpowiedni fragment oprogramowania tzw. podsystem wejścia/wyjścia zleca odpowiednie operacje modułowi sterującemu. Moduł sterujący to fragment oprogramowania komunikujący się bezpośrednio ze sprzętowym sterownikiem urządzenia. Moduł sterujący obudowuje charakterystykę urządzenia prezentując jądru systemu operacyjnego standardowy interfejs.

Wydajność wejścia/wyjścia ma wielki wpływ na wydajność całego systemu. Warto inwestować więc w usprawnienie realizacji operacji wejścia/wyjścia. Można tego dokonać m.in. poprzez zmniejszenie liczby koniecznych przełączeń kontekstu, zwiększenie pobieranych jednorazowo porcji danych, ograniczenie kopiowania danych, zwiększenie wydajności operacji poprzez implementacje elementarnych operacji w sprzęcie etc.


Słownik

bezpośredni dostęp do pamięci (DMA)
Metoda realizacji operacji wejścia/wyjścia, w której sterownik urządzenia wpisuje dane bezpośrednio do pewnego bufora w pamięci i nie korzysta z pośrednictwa procesora.
bufor
Obszar pamięci do przechowywania danych przesyłanych między dwoma urządzeniami.
DMA (Direct Memory Access)
Zob. bezpośredni dostęp do pamięci.
moduł sterujący
Specjalne oprogramowanie bezpośrednio zarządzające sterownikiem urządzenia i ukrywające jego szczególne właściwości przed podsystemem wejścia/wyjścia w jądrze.
odpytywanie
Sposób implementacji operacji wejścia/wyjścia polegający na aktywnym badaniu stanu urządzenia w oczekiwaniu na zakończenie operacji wejścia/wyjścia.
port
Punkt łączący między urządzeniem i komputerem.
przerwanie
Sprzętowy mechanizm służącym do zawiadamiania procesora o rozmaitych zdarzeniach.
spooling
Użycie bufora do przechowywania danych zlecenia dla obecnie zajętego urządzenia o dostępie wyłącznym (SPOOL = simultaneous peripheral operations on-line = jednoczesna bezpośrednia praca urządzeń).
sterownik
Układ elektroniczny, który nadzoruje pracę portu, szyny lub urządzenia albo większej ich grupy.
szyna
Medium, którymi przesyłane są sygnały.
wektor przerwań
Tablica, w znajdują się adresy procedur obsługi poszczególnych przerwań.

Zadania

  1. (3p.) Wymień zalety umieszczania funkcji wejścia/wyjścia w sterowniku urządzenia a nie w jądrze. Jakie są wady takiej decyzji?
  2. (4p.) Opisz kilka sytuacji, w których należy skorzystać z blokującego wejścia/wyjścia? Co by się stało, gdyby zamiast tego skorzystać z aktywnego czekania?
  3. (3p.) W jaki sposób zwiększa się współbieżność poprzez DMA i implementację funkcji wejścia/wyjścia w sprzęcie sterownika urządzenia?

Strona przygotowana przez Marcina Kubicę i Krzysztofa Stencla.