Καταχωρητής: Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
ΓΗ
Αναίρεση έκδοσης 5111498 από τον 194.63.239.233 (Συζήτηση)
Γραμμή 1:
Στη [[μηχανική υπολογιστών]], ο '''καταχωρητής''' είναι τύπος μικρής αλλά πολύ γρήγορης μνήμης που βρίσκεται μέσα στο τσιπ του [[Κεντρική Μονάδα Επεξεργασίας|επεξεργαστή]]. Η μνήμη αυτή χρησιμοποιείται για την βελτίωση της ταχύτητας εκτέλεσης των διαφόρων [[Πρόγραμμα υπολογιστή|προγραμμάτων]], αφού σε αυτήν συνήθως αποθηκεύονται [[δεδομένα]] που χρησιμοποιούνται συνέχεια από τα προγράμματα. Στην περίπτωση αυτή ο καταχωρητής παρέχει πολύ γρήγορη πρόσβαση σε αυτά τα δεδομένα και έτσι το πρόγραμμα εκτελείται πιο γρήγορα. Οι περισσότεροι από τους σύγχρονους [[Ηλεκτρονικός Υπολογιστής|ηλεκτρονικούς υπολογιστές]] λειτουργούν σύμφωνα με την εξής λογική: μεταφέρουν δεδομένα από την [[κεντρική μνήμη]] στους καταχωρητές, κάνουν τις διάφορες πράξεις πάνω στα δεδομένα και στην συνέχεια μεταφέρουν το αποτέλεσμα από τους καταχωρητές πίσω στην κύρια μνήμη. Η τεχνική αυτή ονομάζεται load-store architecture.
ΛΟΛ
 
Η ΚΜΕ περιέχει πολλούς καταχωρητές, από τους οποίους άλλοι είναι γενικής χρήσης, ενώ άλλοι επιτελούν μια συγκεκριμένη λειτουργία (καταχωρητές ειδικής χρήσης). Οι σημαντικότεροι από τους καταχωρητές ειδικής χρήσης είναι ο μετρητής προγράμματος (Program Counter, PC) και ο καταχωρητής εντολών (Instruction Register, IR). Ο μετρητής προγράμματος δείχνει την επόμενη εντολή που πρόκειται να εκτελεστεί, ενώ ο καταχωρητής εντολών περιέχει την εντολή που εκτελείται εκείνη τη στιγμή.
 
Η μνήμη ενός ηλεκτρονικού υπολογιστή μπορεί να διαταχθεί σε μορφή πυραμίδας. Τα κατώτερα στρώματα της πυραμίδας προσφέρουν μεγαλύτερη αλλά πιο αργή μνήμη. Αντιθέτως, τα ανώτερα στρώματα της πυραμίδας προσφέρουν μικρότερη μνήμη, η οποία είναι πολύ πιο γρήγορη, αλλά και ακριβότερη. Το κατώτατο στρώμα της πυραμίδας είναι οι μαγνητικές ταινίες και ανεβαίνοντας προς τα πάνω συναντά κανείς τους USB Flash δίσκους, τα [[CD|CD-ROM]] ή [[DVD|DVD-ROM]], τους [[Σκληρός Δίσκος|σκληρούς δίσκους]], την κύρια μνήμη [[Μνήμη τυχαίας προσπέλασης|RAM]], την μνήμη [[Κρυφή μνήμη ΚΜΕ|L3 / L2 / L1 Cache]] του επεξεργαστή και τέλος τους καταχωρητές. Άρα λοιπόν οι καταχωρητές βρίσκονται στην κορυφή της πυραμίδας και προσφέρουν την πιο γρήγορη μνήμη που υπάρχει. Δυστυχώς όμως το μέγεθος της μνήμης αυτής είναι πολύ μικρό και περιορισμένο.
 
== Παραδείγματα ==
Ο παρακάτω πίνακας δείχνει τον αριθμό των καταχωρητών που διαθέτουν μερικοί από τους πιο διάσημους επεξεργαστές.
 
{| class="wikitable"
!Επεξεργαστής
!Καταχωρητές Ακεραίων
!Καταχωρητές αριθμών κινητής υποδιαστολής
|-
|[[Intel Core (CPU)|Intel Core Duo]]||8||8
|-
|[[Intel Core 2]]||16||16
|-
|[[Pentium 4]]||8||8
|-
|[[Pentium 4]] with EM64T||16||16
|-
|[[Athlon 64]]||16||16
|-
|[[Athlon]] MP||8||8
|-
|[[Opteron]] 240||16||16
|-
|[[Itanium 2]]||128||128
|-
|[[UltraSPARC]] IIIi||32||32
|-
|[[POWER3]]||32||32
|-
|[[MOS Technology 6502|6502]]||3||0
|}
 
== Η δήλωση register στη C ==
 
Οι προγραμματιστές μπορούν να επηρεάσουν σημαντικά την ταχύτητα εκτέλεσης του προγράμματός τους εάν επιλέξουν να τοποθετήσουν στους καταχωρητές τις μεταβλητές που χρησιμοποιούνται συχνά στο πρόγραμμα. Η επιλογή αυτή γίνεται για παράδειγμα στη [[C (γλώσσα προγραμματισμού)|C]] εάν πριν από το όνομα και τον τύπο της μεταβλητής χρησιμοποιηθεί η δεσμευμένη λέξη ''register''. Σημεία του προγράμματος που μπορεί να επιτευχθεί σημαντική βελτίωση είναι βρόχοι for που χρειάζεται να εκτελεστούν πολλές φορές. Ως παράδειγμα παρατίθεται ο παρακάτω κώδικας σε C:
 
<source lang="c">
#include <stdio.h>
int main()
{
for (int i=0; i<5000; i++)
{
printf("%d\n", i);
}
return 0;
}
</source>
 
Το παραπάνω πρόγραμμα τυπώνει τους αριθμούς από το 0 έως το 4999. Η ταχύτητα του προγράμματος μπορεί να βελτιωθεί λίγο εάν ο προγραμματιστής επιλέξει να αποθηκεύσει την μεταβλητή i σε έναν καταχωρητή. Η επιλογή αυτή είναι πολύ καλή, δεδομένου ότι η μεταβλητή i θα χρειαστεί να διαβαστεί και γραφεί 5000 φορές. Κατά συνέπεια ο παρακάτω κώδικας είναι μία βελτίωση του προηγούμενου.
 
<source lang="c">
#include <stdio.h>
int main()
{
for (register int i=0; i<5000; i++)
{
printf("%d\n", i);
}
return 0;
}
</source>
 
Στην πράξη οι σύγχρονοι [[Μεταγλωττιστής|μεταγλωττιστές]] της C διαθέτουν εξελιγμένους αλγόριθμους δέσμευσης των καταχωρητών (register allocation) που συνήθως μπορούν να βρουν καλύτερα από τον προγραμματιστή ποιες μεταβλητές πρέπει να κρατιούνται σε καταχωρητές. Έτσι πολλοί μεταγλωττιστές της C είτε αγνοούν τη δήλωση register, είτε τη θεωρούν απλά κάποια επιπλέον πληροφορία που μπορεί να λάβει υπόψη του ο αλγόριθμος δέσμευσης καταχωρητών.
 
== Δείτε επίσης ==
* [[Ιστορία των μέσων αποθήκευσης δεδομένων]]
* [[Κρυφή μνήμη ΚΜΕ]]
* [[Μνήμη τυχαίας προσπέλασης]]
 
[[Κατηγορία:Αρχιτεκτονική υπολογιστή]]