Algorytm C-SCAN optymalizuje działanie algorytmu planowania SCAN poprzez dodanie możliwości przeskoczenia na drugi koniec danych. Oczywiście ma to również wpływ na czas obsługi wszystkich zdarzeń. W tym artykule zostaną wskazane różnice między wersją C-SCAN, a SCAN oraz jak zaimplementować nowy algorytm.
Głowica dysku w algorytmie SCAN podróżowała w określonym kierunku obsługując napotkane żądania. Po dotarciu do brzegu kierunek głowicy zmieniał się na przeciwny. Jednak w przypadku algorytmu C-SCAN głowica po dotarciu na brzeg przeskakuje na przeciwny brzeg i nie zmienia kierunku. Takie rozwiązanie nie wpływa znacząco na czas obsługi żądań. Wiadomo, że głowica przechodzi przez wszystkie pozycje, więc w czasie jednego cyklu pewne jest, że żądanie zostanie obsłużone.
Załóżmy, że dysk składa się z 100 segmentów. Do kolejki przychodzą następujące żądania odczytania: {25, 35, 30, 60, 80, 40}. Początkowo głowica znajduje się nad segmentem 0 i będzie poruszać się "w górę". Schemat pokazujący skuteczność metody jest przedstawiony poniżej:
Algorytm wpierw przechodzi kolejno obsługuje żądania 25, 35, 60 oraz 80 następnie przechodząc do końca prawej strony głowica wraca na drugi brzeg i obsługuje pozostałe żądania.
W powyższym przykładzie głowica musi wykonać dokładnie 140 skoków. Nie jest to nadal najbardziej optymalna ścieżka. Jednak takie rozwiązanie gwarantuje, że każde żądanie zostanie obsłużone w trakcie jednego cyklu przejścia głowicy. Dzięki temu o wiele łatwiej jest przewidzieć np. na jak długo wykonywany program powinien zostać wstrzymany.
Algorytm naśladujący algorytm C-SCAN musi przetrzymywać na bieżąco pozycję głowicy, a następnie wybierać kolejne żądania, które mają pozycję większą niż aktualną pozycję głowicy. Jeśli algorytm przejrzy wszystkie elementy tablicy to powinien zresetować pozycję głowicy na 0 i rozpocząć przeszukiwanie bufora żądań od nowa.
Funkcja KolejnoscCSCAN() zwraca dla podanej listy lokalizacji kolejność w jakiej żądania zostaną obsłużone. Opcjonalnie można ustawić poz - aktualną pozycję głowicy.
Algorytm działa w pętli, aż do usunięcia wszystkich żądań z bufora. Żądanie jest obsługiwane, a następnie usuwane tylko pod warunkiem, że aktualnie przeglądane żądanie ma pozycję zaraz po aktualnej pozycji głowicy. Należy pamiętać, aby indeks przeglądanego żądania zwiększyć tylko, gdy aktualne żądanie nie zostaje obsłużone.
W celu obliczenia ile skoków musi łącznie wykonać głowica należy wyznaczyć kolejność obsłużenia, a następnie obliczenia wartości absolutnej każdego kolejnego przesunięcia. W tym przypadku należy pamiętać, że jeśli kolejna pozycja jest mniejsza niż poprzednia to głowica musiała przejść do końca i dopiero od pozycji 0 do lokalizacji żądania.
Algorytmy można przetestować przy pomocy poniższego fragmentu kodu: