Στο τελευταίο μέρος αυτού του νήματος είδαμε τι είναι οι δείκτες, θέσεις μνήμης δηλαδή που δείχνουν σε μια άλλη θέση μνήμης--περιέχουν τη διεύθυνση της μνήμης αυτής. Εδώ θα δούμε πως μπορούν να χρησιμοποιηθούν οι δείκτες κατά τον προγραμματισμό, χωρίς να γράψουμε ούτε μία γραμμή κώδικα. Για το λόγο αυτό είναι απαραίτητο να εισηχθούν κάποιες καινούριες έννοιες οι οποίες είναι γνωστές και στα χρηματοοικονομικά, όπως ουρά αναμονής, first in first out (FIFO), last in first out (LIFO) και άλλα.
Πριν απ'όλα πρέπει όμως να εξηγήσουμε τί είναι οι αγωγοί ή δίαυλοι (pipes). Τους χρησιμοποιούμε καθημερινά κι όμως είναι ό,τι καλύτερο έχει συμβεί στην ιστορία του unix και των υπολογιστών γενικότερα. Ας δούμε μια απλή εντολή πιο αναλυτικά:
ps aux | grep ps
Η εντολή ps με τα ορισματα aux τυπώνει όλες τις διεργασίες που τρέχουν στον υπολογιστή από όλους τους χρήστες. Η εντολή grep ψάχνει για το συνδυασμό γραμμάτων ps. Το αποτέλεσμα θα είναι όλες εκείνες οι γραμμές της εντολής ps που περιέχουν το συνδυασμό γραμμάτων ps. Αυτό που συμβαίνει είναι το αποτέλεσμα της πρώτης εντολής να διοχετεύεται σαν είσοδος στην πρώτη. Αλλά πως διοχετεύεται; Στην πραγματικότητα δημιουργείται ένα είδος αρχείου--έχει κάποιες διαφορές από τα συνηθισμένα αρχεία--που ονομαζεται pipe. Στο αρχείο αυτό γράφονται τα αποτελέσματα της πρώτης εντολής και διαβάζονται από τη δεύτερη.
Αλλά πώς γράφονται και πώς διαβάζονται; Με ποιά σειρά; Κι εδώ ακριβώς μπαίνει στο παιχνίδι η ρευστομηχανική, τα χρηματοοικονομικά και η ακαταστασία σε κάθε γραφείο. Μιά στίβα από χαρτιά σε ένα γραφείο λειτουργεί ως εξής: βάζεις το πρώτο χαρτί, και έπειτα το επόμενο χαρτί το ακουμπάς πάνω στο προηγούμενο. Όταν θες να πάρεις κάτι παίρνεις το πάνω πάνω. (Υπάρχει και η αναζήτηση, αλλά την αφήνουμε για το μέλλον, είναι πιο πολύπλοκη.) Επειτα έχουμε ένα λάστιχο με νερό. Αν βάλουμε νερό στη μία ακρη τότε θα βγει από την άλλη, κι αν ρίξουμε κι άλλο νερό τότε θα βγεί από την άλλη άκρη μόνο αν το αρχικό νερό που βάλαμε έχει αδειάσει. Τέλος πάμε στη ΔΕΗ ή στον ΟΤΕ να πληρώσουμε τα χρέη μας και πληρώνουμε με τις ώρες στην ουρά. Όσο πιο νωρίς πάμε τόσο νωρίτερα θα εξυπηρετηθούμε, εκτός φυσικά κι αν κάποιος κλέψει. Όλα τα παραπάνω είναι παραδείγματα από ουρές που παρατηρούνται και εφαρμόζονται ακόμη και στους υπολογιστές. Το παράδειγμα του αγωγού που χρησιμοποιήσαμε παραπάνω είναι ένα κλασικό παράδειγμα FIFO, ό,τι δηλαδή μπαίνει πρώτο βγαίνει και πρώτο. Αντίθετα η στίβα πάνω στο γραφείο μας είναι ένα παράδειγμα LIFO, last in first out, γιατί ό,τι μπαίνει τελευταίο βγαίνει πρώτο.
Τι σημαίνει αυτό για τη μνήμη του υπολογιστή και τη διαχείρησή της από ένα πρόγραμμα; Ας πάρουμε το παράδειγμα της στίβας. Φυσικά το πρόγραμμα δε μπορεί να ξέρει εκ των προτέρων πόση μνήμη θα χρειαστεί (δε ξέρουμε εκ των προτέρων πόσα χαρτιά θα στιβάσουμε πάνω στο γραφείο μας). Ας υποθέσουμε ότι ένα χαρτί κατέχει μία θέση μνήμης. Τοποθετούμε το πρώτο χαρτί στο γραφείο μας. Έπειτα τοποθετούμε και ένα δεύτερο χαρτί πάνω στο γραφείο (τη μνήμη του υπολογιστή). Για να πούμε ότι κάνουμε μια στίβα, πρέπει να το βάλουμε πάνω στο άλλο. Αυτό σε γλώσσα υπολογιστών σημαίνει ότι χρειαζόμαστε και μία ακόμη θέση, ένα δείκτη, που δείχνει το χαρτί που βρίσκεται από πάνω. Φυσικά ο δείκτης του τελευταίου χαρτιού δε θα δείχνει πουθενά. Έτσι σε κάθε καινούριο χαρτί που προστείθεται στη στίβα μας πρέπει να δείχνει το προηγούμενο.
Κάπως έτσι λειτουργούν και οι αγωγοί στο linux, δημιουργούν ένα αρχείο, τα δεδομένα του οποίου επεξεργάζονται από τη δεύτερη εντολή με τη σειρά που γράφτηκαν στο αρχείο. Οι αγωγοί είναι FIFO, σε αντίθεση με τις στίβες που είναι LIFO.
Την ίδια λογική μπορούμε να την επεκτείνουμε και σε άλλα φυσικά παραδείγματα, όπως τη δενδρική δομή. Όλοι έχουμε παρατηρήσει ένα δέντρο με το κορμό, από τον οποίο βγαίνουν δυο-τρία κεντρικά κλαδιά, τα οποία με τη σειρά τους γεννάνε δικά τους παρακλάδια, και συνεχίζεται μέχρι τα φύλλα. Έτσι και στους υπολογιστές έχουμε μία θέση μνήμης, τον κορμό, και δύο δείκτες που δείχνουν σε δύο κλαδιά. Το κάθε κλαδί με τη σειρά του έχει μία θέση μνήμης και δύο δείκτες που δείχνουν στα παρακλάδια, κοκ.
Φυσικά για να λειτουργήσουν όλα αυτά χρειαζόμαστε και τις διεργασίες που προσθέτουν ή αφαίρουν, χαρτιά από τη στίβα μας, ή κλαδιά από τη δενδρική δομή.
Για να κάνουμε τα πράματα ακόμη πιο ενδιαφέροντα μπορούμε να έχουμε μία κυκλική δομή όπου το τελευταίο στοιχείο δείχνει στο πρώτο ή ακόμη πιο πολύπλοκες δομές όπου ένα παρακλάδι ενός δέντρου δείχνει σε ένα κλαδί σε κάποιο άλλο σημείο του δέντρου ή (η φαντασία σας μπορεί να οργιάσει) δύο δέντρα όπου ένα κλαδί του πρώτου δέντρου δείχνει σε ένα παρακλάδι του δευτερου (μήπως αυτό δε συμβαίνει σε οργανισμού όπως κισσός, δεν είμαι και βιολόγος αλλά έψαχνα να βρώ ένα φυσικό ανάλογο.)
No comments:
Post a Comment