Odpytywanie

Z Wikipedii, wolnej encyklopedii
Przejdź do nawigacji Przejdź do wyszukiwania

Odpytywanie (ang. polling) – ciągłe lub okresowe sprawdzanie stanu rejestrów kontrolnych urządzenia peryferyjnego przez procesor.

Protokół komunikacji między procesorem i urządzeniem musi obejmować zagadnienie koordynacji ich współpracy. Z reguły procesor i urządzenie (np. DMA – Direct Memory Access, timer, interfejs wejścia/wyjścia, inny procesor) działają równolegle i niezależnie. Dlatego co pewien czas konieczna jest synchronizacja pracy tych urządzeń, np. czy moduł DMA skończył transmisję, czy minął zadany czas w module timera, czy moduł we/wy odebrał jakąś daną. Aby to zrobić procesor może użyć przerwania (zalecana metoda) albo też ciągle (lub okresowo) sprawdzać stan urządzenia (odpytywać) poprzez odczytywanie stanu rejestrów kontrolnych danego urządzenia. Niestety aktywne czekanie, inaczej odpytywanie, oznacza tak naprawdę, że procesor nie robi nic sensownego czekając na inne 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. Dlatego dużo lepszą i częściej stosowaną metodą są przerwania (ang. interrupt). Odpytywanie jest jednak łatwiejsze w implementacji, dlatego jest bardzo częstym rozwiązaniem używanym przez początkujących programistów. Dodatkową zaletą ciągłego odpytywania jest szybsza reakcja procesora na zmiany w urządzeniu (brak procedury obsługi przerwania i sprawdzania, które urządzenie wystawiło przerwanie), dlatego w niektórych przypadkach kiedy czas obsługi przerwania jest krytyczny lub urządzenie bardzo często potrzebuje obsługi przez procesor (np. co 100 taktów zegara) ciągle używa się odpytywania. W przypadku okresowego odpytywania (czyli procesor wykonuje inne czynności i tylko co jakiś czas sprawdza stan urządzeń peryferyjnych) czas reakcji procesora na zmianę stanu urządzenia jest z reguły wolniejszy niż w przypadku przerwań.

Zobacz też[edytuj | edytuj kod]