FIFO (računarstvo i elektronika)

mini|350x350px|Prikaz rada FIFO algoritma. Od 1. do 5. slike *dolazak/redanje* procesa, a od 6. do 10. *obrada/odlazak* procesa.
**FIFO** (*First In, First Out*) je način organizacije i upravljanja podacima u kojem se prvi uneseni element obrađuje prvi. Ova politika često se susreće u svakodnevnom životu, kao što su:
* Ljudi koji čekaju u redu u pozorištu ili supermarketu.
* Automobili na naplatnim rampama.
* Procesi koji čekaju na izvršenje u operativnom sistemu.
* Podaci koji čekaju na obradu u računarskoj memoriji.

FIFO se koristi u mnogim oblastima računarstva, uključujući operativne sisteme, mreže računara, elektroniku, programiranje i računarsku arhitekturu.

## FIFO u računarstvu 
### Strukture podataka 
mini|270x270px|Prezentacija FIFO (prvi ušao, prvi izašao) reda.
FIFO se u računarskim naukama implementira kao:
* Red (Queue) – linearna struktura podataka gdje prvi dodani element biva uklonjen prvi.
* Kružni bafer (Circular buffer) – memorijska struktura koja koristi FIFO način za pohranu podataka u kružnoj memoriji.
* Baferi u mrežama – mrežni uređaji koriste FIFO za redove čekanja paketa podataka.
* Operativni sistemi – FIFO redovi se koriste za upravljanje procesima i I/O operacijama.

FIFO se može implementirati koristeći povezane liste, nizove ili posebne hardverske strukture.

### Implementacija u C++ 
Sljedeći kod prikazuje jednostavnu implementaciju FIFO reda u C++:

```cpp
#include 
#include 

template 
class FIFO {
private:
    struct Node {
        T value;
        Node* next;
        Node(T _value) : value(_value), next(nullptr) {}
    };

    Node* front;
    Node* back;

public:
    FIFO() : front(nullptr), back(nullptr) {}

    ~FIFO() {
        while (front != nullptr)
            dequeue();
    }

    void enqueue(T _value) {
        Node* newNode = new Node(_value);
        if (front == nullptr)
            front = newNode;
        else
            back->next = newNode;
        back = newNode;
    }

    T dequeue() {
        if (front == nullptr)
            throw std::underflow_error("Red je prazan!");

        Node* temp = front;
        T result = front->value;
        front = front->next;
        delete temp;
        return result;
    }
};
```

## FIFO u elektronici 
mini|FIFO raspored u elektronskim sklopovima
U elektronici, FIFO se koristi za **buffering** i kontrolu protoka podataka između različitih hardverskih komponenti.

Glavne upotrebe FIFO redova u elektronici uključuju:
* Mrežni sklopovi – kontrola prijenosa podataka između različitih uređaja.
* Memorijski kontroleri – organizacija podataka u RAM memoriji.
* Procesori i magistrale – FIFO omogućava usklađivanje komunikacije između različitih dijelova CPU-a.

Postoje dva tipa FIFO sistema:
* Sinhroni FIFO – koristi isti takt za čitanje i pisanje podataka.
* Asinhroni FIFO – koristi različite taktove, omogućavajući efikasniji prijenos podataka između modula sa različitim brzinama obrade.

Prvu poznatu FIFO implementaciju u elektronici osmislio je Peter Alfke 1969. godine, koji je kasnije radio u Xilinxu.

## Primjene FIFO algoritma 
FIFO se koristi u različitim oblastima:
* Operativni sistemi – planiranje procesa i upravljanje memorijom.
* Mrežni protokoli – organizacija paketa podataka u redovima čekanja.
* Baze podataka – kontrola transakcija i obrada zahtjeva.
* Digitalna obrada signala (DSP) – FIFO se koristi u streaming aplikacijama i multimedijalnim sistemima.
* Simulacije i modeliranje – modeliranje realnih sistema, poput saobraćaja i proizvodnih linija.

## Suprotni koncept: LIFO 
FIFO sistem suprotan je principu **LIFO**, koji se temelji na "posljednji ušao, prvi izašao" (*Last In, First Out*) pristupu. LIFO se koristi u stogovima (*stacks*) i rekurzivnim algoritmima.

## Također pogledajte 
* LIFO
* Struktura podataka
* Red čekanja
* Bafer
* Memorijski sistem

## Reference 
* N. Husović, E. Brka, S. Ribić: *Operativni sistemi*, Sarajevo, februar 2015. godine.
* Robert Sedgewick i Kevin Wayne: *Algorithms*, Princeton University.
* Stacks and its Applications.

Kategorija:Kibernetika
Kategorija:Strukture podataka
Kategorija:Računarske nauke
Kategorija:Elektronika
Kategorija:Operativni sistemi