encyklopedia.space

Algorytm FCFS (First‑Come, First‑Served)

FCFS (ang. First‑Come, First‑Served) jest jednym z najprostszych algorytmów planowania procesów oraz zarządzania kolejkami. W jego najprostszej postaci kolejne żądania są obsługiwane w takiej kolejności, w jakiej pojawiły się w systemie, bez uwzględniania ich priorytetów ani czasu wykonania.

Definicja

Algorytm FCFS przyjmuje, że procesy lub żądania dyskowe są umieszczane w kolejce FIFO (ang. First‑In‑First‑Out). Pierwszy element, który wszedł do kolejki, jest również pierwszym, który z niej wychodzi.

Zasada działania

  1. Gdy nowy proces (lub żądanie I/O) pojawia się w systemie, jest dodawany na koniec kolejki.
  2. Jednostka przydzielająca zasoby (CPU, dysk twardy itp.) wybiera proces znajdujący się na początku kolejki.
  3. Wybrany proces jest wykonywany do zakończenia (brak przedziałowego przydziału czasu). Po zakończeniu zostaje usunięty, a kolejny proces w kolejce przechodzi do fazy wykonywania.

Zastosowanie

Algorytm FCFS znajduje zastosowanie w:

Zalety

  • Łatwa implementacja – wymaga jedynie struktury danych typu kolejka.
  • Sprawiedliwość w sensie „kto pierwszy, ten pierwszy”: każdy proces otrzymuje szansę wykonania w kolejności przybycia.
  • Brak potrzebnych dodatkowych parametrów (priorytetów, prognozowanego czasu wykonania).

Wady

  • Możliwość długiego czasu oczekiwania dla krótkich procesów, gdy przed nimi znajduje się długi proces – zjawisko znane jako konwulsja (ang. convoy effect).
  • Nieefektywne wykorzystanie zasobów w środowiskach o zróżnicowanym czasie trwania zadań.
  • Brak adaptacji do zmian obciążenia systemu – algorytm nie bierze pod uwagę bieżącego stanu systemu.

Porównanie z innymi algorytmami planowania

Algorytm Typ kolejki Sprawiedliwość Średni czas oczekiwania Złożoność implementacji
FCFS FIFO Wysoka Wysoki (zależny od długości pierwszych zadań) Najniższa
SJF (Shortest Job First) Priorytetowa (czas trwania) Średnia Niski Średnia
RR (Round‑Robin) Cykliczna (kwant czasu) Wysoka Średni Średnia
Priority Scheduling Priorytetowa Niska (może dochodzić do głodzenia) Zmienny Średnia‑wysoka

Przykładowa implementacja (pseudokod)

queue<Process> FCFSQueue;

function addProcess(Process p):
    FCFSQueue.enqueue(p)

function schedule():
    while not FCFSQueue.isEmpty():
        current = FCFSQueue.dequeue()
        execute(current)   // wykonaj proces do zakończenia
        // po zakończeniu przejdź do następnego elementu kolejki

Historia

Pierwsze zastosowania koncepcji FIFO w systemach operacyjnych sięgają lat 1960, kiedy to wprowadzono je jako podstawowy mechanizm przydzielania czasu procesora w wczesnych systemach operacyjnych typu batch. W literaturze klasycznej, np. w książce Operating System Concepts autorstwa Abrahama Silberschatz, algorytm FCFS jest prezentowany jako punkt wyjścia do omawiania bardziej złożonych strategii planowania.

Przykład praktyczny

Załóżmy, że kolejka procesów zawiera cztery zadania o czasach wykonywania: 8 s, 4 s, 2 s oraz 1 s. Algorytm FCFS obsłuży je w tej kolejności, co spowoduje następujące czasy zakończenia:

  • Proces 1 – zakończenie po 8 s
  • Proces 2 – zakończenie po 12 s (8 s + 4 s)
  • Proces 3 – zakończenie po 14 s (12 s + 2 s)
  • Proces 4 – zakończenie po 15 s (14 s + 1 s)

Średni czas oczekiwania wynosi (0 + 8 + 12 + 14) / 4 = 8,5 s, co jest relatywnie wysokim wynikiem w porównaniu do algorytmów krótszych zadań (np. SJF).

Literatura

  • Silberschatz, A., Galvin, P. B., & Gagne, G. – Operating System Concepts, 10th ed., Wiley, 2018.
  • Stallings, W. – Operating Systems: Internals and Design Principles, 9th ed., Pearson, 2015.
  • Tanenbaum, A. S. – Modern Operating Systems, 4th ed., Prentice Hall, 2014.

Algorytm FCFS, choć prosty i łatwy do implementacji, zazwyczaj nie spełnia wymagań współczesnych systemów operacyjnych pod względem efektywności i responsywności. W praktyce jest stosowany głównie jako komponent bardziej złożonych strategii lub w środowiskach, w których priorytety i czas odpowiedzi nie odgrywają kluczowej roli.