Οι **CPU Wait States** (καταστάσεις αναμονής) και οι **Pipeline Stalls** (σταλμοί διοχέτευσης) είναι δύο βασικοί μηχανισμοί που μειώνουν την αποτελεσματικότητα ενός επεξεργαστή, εμποδίζοντάς τον να εκτελεί εντολές κάθε κύκλο ρολογιού.
1. CPU Wait States (System-Level)
Αναφέρεται στην αναμονή της ολόκληρης CPU για εξωτερικούς πόρους:
- RAM Latency: Η CPU τρέχει σε GHz, η RAM σε MHz. Όταν δεδομένα λείπουν από την cache (cache miss), η CPU περιμένει δεκάδες κύκλους για φόρτωση από DRAM.
- I/O Operations: Αναμονή για δίσκο (NVMe/SATA/HDD), δίκτυο, περιφερειακά.
- Bus Contention: Σε συστήματα multi-socket ή multi-core, ο κοινός system bus (π.χ. Infinity Fabric, UPI, Ring Bus) μπορεί να κολλήσει από άλλες κινήσεις δεδομένων.
2. Pipeline Stalls (Microarchitecture-Level)
Σύγχρονοι επεξεργαστές χρησιμοποιούν **pipelining** (διαχωρισμός εντολής σε σταδίες: Fetch, Decode, Execute, Memory, Writeback). Ένας stall συμβαίνει όταν η διοχέτευση δεν μπορεί να προχωρήσει:
- Data Dependency (RAW Hazard): Μια εντολή χρειάζεται το αποτέλεσμα της προηγούμενης που δεν έχει ολοκληρωθεί ακόμα. Π.χ. `ADD R1, R2, R3` → `SUB R4, R1, R5`. Το `SUB` πρέπει να περιμένει το `R1`.
- Resource Conflict: Δύο εντολές θέλουν την ίδια μονάδα εκτέλεσης (π.χ. μόνος FPU divider) ή την ίδια θύρα cache.
- Control Hazard (Branch Misprediction): Ο branch predictor λάθος, η διοχέτευση έχει φορτώσει λάθος εντολές → flush & restart.
Μείωση τους
- Hardware: Out-of-order execution, register renaming, larger caches, prefetchers, better branch predictors.
- Software/Compiler: Loop unrolling, instruction scheduling, data layout optimization (Structure of Arrays), avoidance of pointer aliasing, use of `restrict`/`__builtin_assume_aligned`.
Η κατανόηση αυτών των φαινομένων είναι κρίσιμη για **performance tuning** και **low-latency programming**.