Algorytm C-LOOK to najoptymalniejszy algorytm do planowania pracy dysku. Wykorzystuje on najlepsze cechy algorytmów SCAN oraz SSTF. Wykorzystuje on szybkie przechodzenie pomiędzy miejscami na dysku. W tym artykule zostanie przedstawione jak zasymulować taki algorytm na podanym zestawie żądań odczytu danych z dysku.
W celu zrozumienia idei algorytmu C-LOOK należy wrócić do algorytmu SCAN, gdzie głowica przeszukiwała dysk idąc w jednym kierunku, następnie przeciwnym itd. obsługując po drodze napotkane żądania. Podobnie działa algorytm C-SCAN, ale tym razem po pełnym przejściu mógł wrócić na początek, albo zacząć przeszukiwać w przeciwną stronę. Zależało to od najbliższego żądania w buforze. Jednak za każdym razem głowica musiała zrobić pełne przejście. Dopiero algorytm C-LOOK daje możliwość głowicy zakończyć drogą w jedną stronę szybciej niż po dojściu na koniec.
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, ale nie dochodzi do końca, a przechodzi do następnych żądań od razu. W tym przypadku algorytm potrzebuje 140 przeskoków, aby obsłużyć wszystkie żądania.
Funkcja KolejnoscCLOOK() zwraca dla podanej listy lokalizacji kolejność w jakiej żądania zostaną obsłużone. Argument poz - określa początkową 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: