Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Παράλληλα και Κατανεµηµένα Συστήµατα. Εισαγωγή"

Transcript

1 Παράλληλα και Κατανεµηµένα Συστήµατα 1 Εισαγωγή Στόχος της περιγραφής που ακολουθεί, αποτελεί η παρουσίαση του περιβάλλοντος διεπαφής ανταλλαγής µηνυµάτων (message passing interface) MPI δια της χρήσεως του οποίου είναι δυνατή η δηµιουργία εφαρµογών που στηρίζονται στις αρχές του παράλληλου προγραµµατισµού. Το πρότυπο MPI δεν είναι τίποτε άλλο από µια συλλογή συναρτήσεων που µπορεί να χρησιµοποιηθεί µέσα από προγράµµατα που είναι γραµµένα σε γλώσσα C ή σε γλώσσα Fortran και τα οποία επιτρέπουν τη δηµιουργία και χρήση ενός πλήθους διεργασιών που εκτελούνται παράλληλα στον ίδιο ή σε διαφορετικούς υπολογιστές και επικοινωνούν µεταξύ τους χρησιµοποιώντας το µοντέλο ανταλλαγής µηνυµάτων. Σε αντίθεση µε το σειριακό µοντέλο προγραµµατισµού στο οποίο λαµβάνει χώρα η χρήση ενός και µοναδικού επεξεργαστή που επικοινωνεί συνεχώς µε την κεντρική µνήµη του συστήµατος δια µέσου διαδικασιών ανάγνωσης και εγγραφής, στο αντίστοιχο παράλληλο µοντέλο υπονοείται η χρήση πολλών διαφορετικών επεξεργαστών κάθε ένας εκ των οποίων χρησιµοποιεί τη δική του περιοχή µνήµης και τις δικές του µεταβλητές προγράµµατος. Αυτό σηµαίνει πως οι εν λόγω επεξεργαστές δεν µοιράζονται κάποιο κοινό φυσικό χώρο διευθύνσεων µνήµης, και εποµένως οι ενέργειες µιας διεργασίας που εκτελείται σε ένα υπολογιστή, δεν είναι ορατές από τις υπόλοιπες διεργασίες του συστήµατος. Εάν δε, κάποια διεργασία απαιτεί τη χρήση µιας µεταβλητής η οποία ανήκει στο χώρο κάποιας άλλης διεργασίας, η µεταβλητή αυτή δεν είναι κοινή στις δύο διεργασίες, αλλά θα πρέπει να αποσταλεί από τη µια διεργασία στην άλλη δια µέσου κάποιου µηνύµατος (message). Υπάρχουν πολλές διαφορετικές προσεγγίσεις τις οποίες µπορούµε να ακολουθήσουµε για να προχωρήσουµε στη δηµιουργία παράλληλων εφαρµογών και στις σελίδες που ακολουθούν θα περιγράψουµε το πρότυπο MPI. Αν και οι πρώτες προσπάθειες για την ανάπτυξη παράλληλων εφαρµογών πραγµατοποιήθηκαν στις αρχές της δεκαετίας του 1980 µε την εισαγωγή της έννοιας της κατανεµηµένης µνήµης και του παράλληλου προγραµµατισµού, το πρότυπο MPI χρησιµοποιήθηκε για πρώτη φορά τον Απρίλιο του 1992 από το πανεπιστήµιο της Virginia, ενώ το Νοέµβριο του ιδίου έτους πραγµατοποιήθηκε η πρώτη συνάντηση της οµάδας εργασία στη Minneapolis. Στόχος αυτής της συνάντησης ήταν ο καθορισµός των βασικών χαρακτηριστικών του προτύπου και η δηµιουργία του MPI Forum µέσα από το οποίο ήταν δυνατή η περαιτέρω ανάπτυξη του εν λόγω περιβάλλοντος και η προτυποποίησή του. Το τελευταίο σηµαντικό στάδιο της σύντοµης ιστορίας του MPI είναι η διάσκεψη Supercomputing 93 όπου και παρουσιάζονται προσχέδια του MPI, ενώ η τελική έκδοση του εν λόγω προτύπου παρουσιάστηκε το Μάιο του Οι παραπάνω αναφορές αφορούν την πρώτη έκδοση του προτύπου MPI που είναι γνωστή ως MPI1 ενώ το εκέµβριο του 1995, το πρότυπο αυτό επεκτάθηκε και µετονοµάσθηκε σε MPI2, που είναι και το µοντέλο που χρησιµοποιείται µέχρι σήµερα.

2 Το περιβάλλον προγραµµατισµού MPI 2 Οι δοµικές µονάδες του MPI Η στοιχειώδης µονάδα µιας εφαρµογής MPI είναι η διεργασία (process) η οποία δηµιουργείται και εκτελείται ανεξάρτητα από τις υπόλοιπες διεργασίες του συστήµατος χρησιµοποιώντας τους δικούς της πόρους (resources). Η κάθε διεργασία ταυτοποιείται µε µοναδικό τρόπο από ένα κωδικό διεργασίας (Process Id, PID) που στην ορολογία του προτύπου ονοµάζεται τάξη (rank) και λαµβάνει τιµές µεγαλύτερες ή ίσες µε το µηδέν. Εάν το πλήθος των διεργασιών που εκτελούνται στο σύστηµα είναι γνωστό και ίσο µε Ν, τότε οι κωδικοί αυτών των διεργασιών θα έχουν τις Ν συνεχόµενες τιµές 0,1,2,3,.,Ν-1. Επειδή οι τάξεις των διεργασιών προσδιορίζουν τις διεργασίες του συστήµατος µε µοναδικό τρόπο, χρησιµοποιούνται πάρα πολύ συχνά από τους προγραµµατιστές των εφαρµογών MPI για να προσδιορίσουν την προέλευση και τον προορισµό των διακινούµενων µηνυµάτων. Ένα σύνολο Ν διατεταγµένων διεργασιών που χαρακτηρίζεται από τιµές τάξεων 0,1,2,,Ν-1 είναι γνωστό ως οµάδα (group). Σε µια εφαρµογή MPI µπορούµε να ορίσουµε πολλές οµάδες διεργασιών κάθε µια από τις οποίες χαρακτηρίζεται από το δικό της κωδικό (group id). Ας σηµειωθεί πως αυτός ο κωδικός είναι άγνωστος στο χρήστη, και υπό αυτή την έννοια µια οµάδα διεργασιών χαρακτηρίζεται ως ένα αδιαφανές αντικείµενο µε άγνωστη εσωτερική δοµή. Εάν ο χρήστης επιθυµεί να προσπελάσει τις τιµές των ιδιοτήτων µιας οµάδας διεργασιών θα πρέπει να χρησιµοποιήσει ειδικές συναρτήσεις του MPI προκειµένου να ανακτήσει αυτές τις τιµές. Ένα τελευταίο σηµαντικό χαρακτηριστικό του προτύπου MPI είναι η έννοια του µέσου επικοινωνίας (communicator) δια της χρήσεως του οποίου λαµβάνει χώρα η ανταλλαγή µηνυµάτων ανάµεσα σε δύο διεργασίες. Αυτή η ενδιάµεση οντότητα χαρακτηρίζεται και αυτή από την ύπαρξη κάποιου κωδικού, η ανάκτηση του οποίου µπορεί να λάβει χώρα χρησιµοποιώντας κάποια από τις συναρτήσεις του MPI. Είναι προφανές πως για να είναι δυνατή η επικοινωνία ανάµεσα σε δύο διεργασίες αυτές θα πρέπει να ανήκουν στον ίδιο communicator. Η χρήση αυτού του τρόπου επικοινωνίας διασφαλίζει το σωστό τρόπο διακίνησης της πληροφορίας και ελαχιστοποιεί την πιθανότητα εµφάνισης προβληµάτων όσον αφορά την αποστολή και λήψη των µηνυµάτων από τις διεργασίες της εφαρµογής. Μιλώντας γενικά, ένας communicator ορίζεται ως ένα τοπικό αντικείµενο (local object) που χρησιµοποιείται για την αναπαράσταση ενός χώρου µέσα στον οποίο ανήκουν οι διεργασίες που έρχονται σε επικοινωνία (communication domain). Αυτός ο χώρος ορίζεται ως µια καθολική (global) και κατανεµηµένη δοµή που επιτρέπει στις διεργασίες µιας οµάδας να επικοινωνήσουν είτε µεταξύ τους, είτε µε τις διεργασίες µιας άλλης οµάδας. Στην περίπτωση κατά την οποία οι διεργασίες που επικοινωνούν ανήκουν στην ίδια οµάδα, ο communicator είναι γνωστός ως intracommunicator ενώ στην περίπτωση κατά την οποία οι διεργασίες που επικοινωνούν ανήκουν σε διαφορετικές οµάδες, ο communicator είναι γνωστός ως intercommunicator. Μια διεργασία µπορεί να συµµετάσχει σε πολλούς επικοινωνιακούς χώρους (communication domains). Με τον ίδιο τρόπο, δύο επικοινωνιακοί χώροι µπορεί να περιέχουν οµάδες διεργασιών που να περιέχουν κοινές διεργασίες ή να επικαλύπτονται πλήρως (να περιέχουν τις ίδιες διεργασίες ή η µια να είναι υποσύνολο ή υπερσύνολο της άλλης). Αυτό το χαρακτηριστικό επιτρέπει σε µια διεργασία να επικοινωνήσει µε µια άλλη διεργασία δια µέσου δύο

3 Παράλληλα και Κατανεµηµένα Συστήµατα 3 διαφορετικών και διακριτών µεταξύ τους επικοινωνιακών χώρων. Αυτό σηµαίνει πως µια διεργασία µπορεί να ανήκει ταυτόχρονα σε πολλούς επικοινωνιακούς χώρους, σε κάθε έναν από τους οποίους θα περιγράφεται και από διαφορετική τιµή τάξης. Ένα τελευταίο χαρακτηριστικό που αξίζει να αναφερθεί, είναι η δυνατότητα που έχει µια διεργασία να αποστείλει ένα µήνυµα στον εαυτό της. Στην περίπτωση αυτή ωστόσο απαιτείται η αποθήκευση του µηνύµατος σε ένα χώρο ενδιάµεσης αποθήκευσης του συστήµατος (system buffer). Αυτό σηµαίνει πως το µήνυµα δεν θα µεταφερθεί απευθείας στην περιοχή µνήµης που έχει δεσµευθεί για την παραλαβή του, αλλά θα διατηρηθεί προσωρινά σε µία περιοχή ενδιάµεσης µνήµης. Ο τρόπος δέσµευσης αυτής της µνήµης καθώς και το µέγιστο µέγεθός της εξαρτώνται από την υλοποίηση που χρησιµοποιείται σε κάθε περίπτωση. Εποµένως γενικά δεν συνίσταται η αποστολή µηνυµάτων από µια διεργασία στον εαυτό της, κάτι που ισχύει ιδιαίτερα για τις παρεµποδιστικές επικοινωνίες που θα παρουσιαστούν στην επόµενη ενότητα. Είδη επικοινωνιών ανάµεσα σε διεργασίες Ο βασικός µηχανισµός επικοινωνίας του MPI είναι η µετάδοση δεδοµένων µεταξύ ενός ζεύγους διεργασιών, εκ των οποίων η πρώτη αποστέλλει το µήνυµα ενώ η δεύτερη το παραλαµβάνει. Αυτός ο τρόπος επικοινωνίας ονοµάζεται επικοινωνία από σηµείο σε σηµείο (point to point communication) και αποτελεί το µοντέλο επικοινωνίας για ένα πολύ µεγάλο εύρος εφαρµογών MPI. Το MPI προσφέρει ένα σύνολο συναρτήσεων που χρησιµοποιείται για την αποστολή και λήψη δεδοµένων µε τη µορφή µηνυµάτων. Το κάθε ένα από αυτά τα µηνύµατα χαρακτηρίζεται από µια τυποποίηση συγκεκριµένης µορφής και ταυτοποιείται µονοσήµαντα από µία ετικέτα (tag) που µας επιτρέπει να το ξεχωρίσουµε από τα υπόλοιπα µηνύµατα της εφαρµογής. Αυτή η τυποποίηση είναι εξαιρετικά σηµαντική και είναι ιδιαίτερα χρήσιµη σε περιπτώσεις επικοινωνίας διεργασιών που ανήκουν σε ετερογενή συστήµατα (δηλαδή σε συστήµατα που χαρακτηρίζονται από διαφορετική αρχιτεκτονική) και η οποία απαιτεί την ενδιάµεση µετατροπή των διακινούµενων δεδοµένων. Από την άλλη µεριά η χρήση της ετικέτας προσφέρει και αυτή αρκετά πλεονεκτήµατα, όπως είναι για παράδειγµα η δυνατότητα της σωστής ταξινόµησης µιας οµάδας µηνυµάτων που παραλαµβάνονται µε σειρά διαφορετική από εκείνη µε την οποία έχουν σταλεί. Σε πλήρη αναλογία µε τα πακέτα δεδοµένων που διακινούνται σε ένα δίκτυο υπολογιστών, ένα µήνυµα του προτύπου MPI δεν περιέχει µόνο τα δεδοµένα προς αποστολή, αλλά και πολλές άλλες πληροφορίες οι οποίες είναι αναγκαίες για την επιτυχή µετάδοση του µηνύµατος. Οι πληροφορίες αυτές περιλαµβάνουν µεταξύ των άλλων το πλήθος και τον τύπο των δεδοµένων που περιλαµβάνονται στο µήνυµα, τις τάξεις των διεργασιών αποστολής και λήψης, την ετικέτα του µηνύµατος και το όνοµα του πληροφοριοδότη δια της χρήσεως του οποίου επικοινωνούν οι δύο διεργασίες. Οι παραπάνω πληροφορίες διαβιβάζονται ως ορίσµατα στη συνάρτηση που χρησιµοποιείται για την αποστολή του µηνύµατος, ενώ εντελώς ανάλογη είναι

4 Το περιβάλλον προγραµµατισµού MPI 4 και η κλήση της συνάρτησης παραλαβής του µηνύµατος, η οποία ωστόσο περιέχει και ένα επιπλέον όρισµα που περιλαµβάνει πληροφορίες σχετικές µε τη διαδικασία παραλαβής. Χρησιµοποιώντας αυτές τις δύο συναρτήσεις (καθώς και ορισµένες άλλες που χρησιµοποιούνται για την αρχικοποίηση και τον τερµατισµό του προτύπου), µπορούµε να κατασκευάσουµε όλες σχεδόν τις εφαρµογές που χαρακτηρίζονται από αυτή τη διαδικασία ανταλλαγής µηνυµάτων. Το δεύτερο είδος επικοινωνίας που υποστηρίζει το πρωτόκολλο MPI, είναι οι συλλογικές επικοινωνίες (collective communications) οι οποίες χαρακτηρίζονται από την ύπαρξη περισσότερων από δύο διαδικασιών. Οι πιο σηµαντικές από αυτές τις µορφές επικοινωνίας, είναι η εκποµπή (broadcasting), όπου ένα µήνυµα αποστέλλεται ενιαίο σε όλες τις διεργασίες, η διασπορά (scattering) όπου ένα µήνυµα διασπάται σε µικρότερα κοµµάτια κάθε ένα εκ των οποίων αποστέλλεται και σε µια διαφορετική διεργασία, η συλλογή (gather) όπου το σύνολο των µηνυµάτων που αποστέλλονται από όλα τα µέλη µιας οµάδας διεργασιών παραλαµβάνεται από µια απλή διεργασία, και η µείωση (reduce) όπου µια διεργασία συλλέγει δεδοµένα από τις υπόλοιπες διεργασίες της οµάδας, και ταυτόχρονα υπολογίζει κάποια συνάρτηση αυτών των δεδοµένων (για παράδειγµα το µέσο όρο τους). Σε όλες τις παραπάνω διεργασίες, υπάρχει µια κεντρική διεργασία η οποία είτε αποστέλλει τις πληροφορίες στις υπόλοιπες διεργασίας της οµάδας, είτε συλλέγει τα µηνύµατα που αποστέλλονται από αυτές. Στην περίπτωση των διεργασιών από σηµείο σε σηµείο, οι συναρτήσεις του MPI εµφανίζονται σε δύο διαφορετικές µορφές που φέρουν τα ονόµατα παρεµποδιστικές (blocking) και µη παρεµποδιστικές (non blocking) συναρτήσεις. Μια συνάρτηση λέγεται παρεµποδιστική όταν η κλήση της µέσα από κάποια διεργασία αναστέλλει τη λειτουργία αυτής της διεργασίας, µέχρι την ολοκλήρωση της λειτουργίας της συνάρτησης που έχει κληθεί. Στην αντίθετη περίπτωση, κατά την οποία η κλήση της συνάρτησης δεν προκαλεί την αναστολή της λειτουργίας της διεργασίας, η εν λόγω συνάρτηση λέγεται µη παρεµποδιστική. Για να κατανοήσουµε τη διαφορά που υφίσταται ανάµεσα στις παρεµποδιστικές και στις µη παρεµποδιστικές συναρτήσεις, ας υποθέσουµε πως η συνάρτηση που χρησιµοποιείται για την αποστολή µηνυµάτων, ονοµάζεται send. Η συνάρτηση αυτή εκτός των άλλων θα δέχεται ως όρισµα και ένα δείκτη προς την περιοχή µνήµης στην οποία βρίσκονται τα δεδοµένα προς αποστολή. Ας υποθέσουµε πως αυτή η περιοχή µνήµης είναι ένας πίνακας που περιέχει 10 πραγµατικούς αριθµούς. Στο πρώτο βήµα της διαδικασίας, θα πρέπει να αρχικοποιήσουµε αυτή την περιοχή µνήµης, ορίζοντας το περιεχόµενο των θέσεων µνήµης που περιλαµβάνονται σε αυτή. Στη συνέχεια θα πρέπει να καλέσουµε τη συνάρτηση send για να αποστείλουµε αυτά τα δεδοµένα σε κάποια από τις διεργασίες της εφαρµογής. Εάν η εντολή send χρησιµοποιείται µε την παρεµποδιστική της µορφή, τότε για όσο χρονικό διάστηµα λαµβάνει χώρα η αποστολή των 10 πραγµατικών αριθµών στη διεργασία παραλήπτη, η λειτουργία της διεργασίας αποστολέα αναστέλλεται. Μετά την ολοκλήρωση της διαδικασίας αποστολής της παραπάνω πληροφορίας, η συνάρτηση send τερµατίζει τη λειτουργία της, κάτι που επιτρέπει τη συνέχιση και ολοκλήρωση της λειτουργίας της διεργασίας αποστολέα. Εντελώς ανάλογη µε την προηγούµενη κατάσταση, είναι και αυτή που συσχετίζεται µε τον τρόπο λειτουργίας της διεργασίας παραλήπτη. Εάν η εν λόγω

5 Παράλληλα και Κατανεµηµένα Συστήµατα 5 διεργασία χρησιµοποιεί την παρεµποδιστική έκδοση της receive η οποία νοείται ως η συνάρτηση που διαβάζει το περιεχόµενο του µηνύµατος που έχει σταλεί τότε η λειτουργία της διεργασίας παραλήπτη θα ανασταλεί κατά το χρονικό διάστηµα ανάγνωσης της πληροφορίας. Όταν η διακινούµενη πληροφορία έχει παραληφθεί στο σύνολό της από τη διεργασία παραλήπτη, η συνάρτηση receive θα αναστείλει τη λειτουργία της κάτι που θα επιτρέψει τη συνέχιση και τελικά την ολοκλήρωση της λειτουργίας της διεργασίας παραλήπτη. Στην περίπτωση κατά την οποία χρησιµοποιούνται οι µη παρεµποδιστικές εκδόσεις των συναρτήσεων αποστολής και παραλαβής µηνυµάτων, η κατάσταση είναι εντελώς διαφορετική. Στην περίπτωση αυτή η κλήση της µη παρεµποδιστικής έκδοσης της send, δεν αναστέλλει τη λειτουργία της διεργασίας αποστολέα, η οποία συνεχίζεται κανονικά και εκτελείται παράλληλα µε την αποστολή του µηνύµατος. Ωστόσο σε µια τέτοια διαδικασία, ενδέχεται να ανακύψουν σηµαντικά προβλήµατα στην περίπτωση διαδοχικών κλήσεων της send µέσα σε µικρό χρονικό διάστηµα. Αυτό σηµαίνει πως αν καλέσουµε την εν λόγω συνάρτηση για να αποστείλουµε το περιεχόµενο µιας περιοχής µνήµης και πριν την ολοκλήρωση αυτής της αποστολής καλέσουµε τη send για δεύτερη φορά µε το ίδιο όρισµα όσον αφορά τη θέση µνήµης αλλά διαφορετικό περιεχόµενο, τότε θα λάβει χώρα επανεγγραφή της περιοχής µνήµης και οριστική απώλεια του περιεχοµένου του πρώτου µηνύµατος που δεν έχει ακόµη αποσταλεί. Αυτό το πρόβληµα θα µεταφερθεί προφανώς και στη διεργασία παραλήπτη, η οποία θα διαβάσει εσφαλµένο περιεχόµενο από το οποίο δεν βγαίνει κανένα νόηµα. Τα παραπάνω προβλήµατα µπορούν να αποφευχθούν εάν πριν την αποστολή του δεύτερου µηνύµατος εξετάσουµε εάν η αποστολή του πρώτου µηνύµατος έχει ολοκληρωθεί. Εάν η αποστολή του πρώτου µηνύµατος έχει ολοκληρωθεί µπορούµε να στείλουµε το δεύτερο µήνυµα χωρίς κανένα πρόβληµα, ενώ στην αντίθετη περίπτωση θα πρέπει να περιµένουµε την περάτωση της αποστολής του πρώτου µηνύµατος, Οι παραπάνω διαδικασίες µπορούν να υλοποιηθούν πάρα πολύ εύκολα, αφού το MPI παρέχει συναρτήσεις που υποστηρίζουν πλήρως όλες αυτές τις διαφορετικές µορφές αποστολής και λήψης δεδοµένων. Ένα δεύτερο είδος διαχωρισµού που µπορούµε να εφαρµόσουµε για τις διαδικασίες επικοινωνίας από σηµείο σε σηµείο που λαµβάνουν χώρα ανάµεσα στις διεργασίες του συστήµατος, έχει να κάνει µε τη χρονική στιγµή περάτωσης της αποστολής του µηνύµατος σε σχέση µε τη χρονική στιγµή εκκίνησης της διαδικασίας παραλαβής του. Χρησιµοποιώντας αυτό το κριτήριο, µπορούµε να ορίσουµε τέσσερις διαφορετικές µορφές επικοινωνίας από σηµείο σε σηµείο, οι οποίες σε γενικές γραµµές, είναι οι εξής: Πρότυπη επικοινωνία (standard communication): σε αυτόν τον τύπο επικοινωνίας η απόφαση για τη δέσµευση ή όχι ενδιάµεσης περιοχής µνήµης στην οποία θα αποθηκευτεί προσωρινά το εξερχόµενο µήνυµα, λαµβάνεται από το MPI και όχι από το χρήστη. Στην περίπτωση κατά την οποία πραγµατοποιηθεί αυτή η διαδικασία της ενδιάµεσης αποθήκευσης του µηνύµατος, η διαδικασία αποστολής του δύναται να περατωθεί ακόµη και εάν η αντίστοιχη διαδικασία παραλαβής του

6 Το περιβάλλον προγραµµατισµού MPI 6 µηνύµατος δεν έχει ξεκινήσει ακόµη. Στην αντίθετη περίπτωση όµως, κατά την οποία δεν είναι διαθέσιµη η περιοχή ενδιάµεσης µνήµης, η διαδικασία αποστολής θα ολοκληρωθεί µόνο όταν έχει ξεκινήσει η αντίστοιχη διαδικασία παραλαβής και το µήνυµα έχει µεταφερθεί στην περιοχή αποθήκευσης της διεργασίας παραλήπτη. Επικοινωνία µε ενδιάµεση µνήµη (buffered communication): σε αυτόν τον τύπο επικοινωνίας η διαδικασία αποστολής µπορεί να ξεκινήσει ανεξάρτητα από το εάν έχει ξεκινήσει η αντίστοιχη διαδικασία παραλαβής, ενώ µπορεί ακόµη και να ολοκληρωθεί ανεξάρτητα από την εκκίνηση ή όχι της τελευταίας διαδικασίας. Στην περίπτωση αυτή ωστόσο είναι πιθανή η απαίτηση της τοπικής αποθήκευσης του εξερχόµενου µηνύµατος κάτι που σηµαίνει πως η εφαρµογή θα πρέπει να µεριµνήσει για την αναζήτηση και δέσµευση του κατάλληλου αποθηκευτικού χώρου. Εάν η µνήµη που δεσµεύεται για το λόγο αυτό είναι ανεπαρκής όσον αφορά το µέγεθός της και δεν δύναται να διατηρήσει το διακινούµενο µήνυµα, λαµβάνει χώρα εµφάνιση σφάλµατος. Στην αντίθετη περίπτωση το µήνυµα θα µεταφερθεί µε επιτυχία στη διεργασία παραλήπτη, κάτι που µας επιτρέπει να αποδεσµεύσουµε πλέον αυτή την τοπική περιοχή µνήµης που είχε δεσµευθεί για τη διακίνηση του µηνύµατος. Σύγχρονη επικοινωνία (synchronous communication): σε αυτόν τον τύπο επικοινωνίας µια διαδικασία αποστολής µπορεί να ξεκινήσει ανεξάρτητα από την εκκίνηση της διαδικασίας παραλαβής από τη διεργασία παραλήπτη. Ωστόσο στην περίπτωση αυτή η αποστολή θα ολοκληρωθεί µε επιτυχία µόνο όταν η διαδικασία παραλαβής έχει ξεκινήσει. Στην περίπτωση αυτή είναι δυνατή η χρήση του αποθηκευτικού χώρου της διαδικασίας αποστολέα για την αποστολή του επόµενου µηνύµατος. Επικοινωνία σε κατάσταση ετοιµότητας (ready state): σε αυτόν τον τύπο επικοινωνίας η διαδικασία επικοινωνίας µπορεί να ξεκινήσει µόνο όταν έχει ξεκινήσει και η αντίστοιχη διαδικασία παραλαβής. Στην αντίθετη περίπτωση η επικοινωνία χαρακτηρίζεται από την εµφάνιση σφαλµάτων και από εξαιρετικά χαµηλό βαθµό αξιοπιστίας. Για κάθε µια από τις παραπάνω µορφές επικοινωνίας υπάρχουν ξεχωριστές συναρτήσεις ειδικά σχεδιασµένες για αυτό το σκοπό, οι οποίες µπορούν να χρησιµοποιηθούν τόσο στην παρεµποδιστική όσο και στη µη παρεµποδιστική τους µορφή. Σε αντίθεση µε τη διαδικασία αποστολής, η παραλαβή ενός µηνύµατος πραγµατοποιείται πάντα από την ίδια συνάρτηση η οποία λειτουργεί µε βάση τις αρχές της πρότυπης επικοινωνίας (standard communication). Οι συναρτήσεις αυτές θα µελετηθούν σε επόµενη ενότητα. Οι τύποι δεδοµένων του MPI Αν και οι συναρτήσεις του προτύπου MPI µπορούν να κληθούν µέσα από ένα πρόγραµµα γραµµένο στη γλώσσα προγραµµατισµού C (η γλώσσα προγραµµατισµού Fortran επίσης υποστηρίζεται), οι τύποι δεδοµένων των ορισµάτων των εν λόγω συναρτήσεων, δεν είναι αυτοί που χρησιµοποιούνται στη γλώσσα C, καθώς το MPI χρησιµοποιεί τους δικού του τύπους δεδοµένων. Ο επόµενος πίνακας περιέχει τους στοιχειώδεις τύπους δεδοµένων που χρησιµοποιούνται από τις συναρτήσεις του MPI και τους τύπους δεδοµένων της γλώσσας C που αντιστοιχούν στους τύπους δεδοµένων του MPI.

7 Παράλληλα και Κατανεµηµένα Συστήµατα 7 MPI Datatype MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE C Datatype signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int unsigned long int float double long_double Εκτός από τους παραπάνω βασικούς τύπους δεδοµένων (primitive data types) το MPI διαθέτει και άλλους δύο τύπους δεδοµένων που φέρουν τα ονόµατα MPI_BYTE και MPI_PACKED και δεν αντιστοιχούν σε τύπους δεδοµένων της γλώσσας C. Μία τιµή που ανήκει στον τύπο δεδοµένων MPI_BYTE απαιτεί για την αποθήκευσή της 1 byte (δηλαδή 8 bits). Στο πρότυπο MPI, ο τύπος δεδοµένων byte δεν είναι ισοδύναµος µε ένα χαρακτήρα, όπως συµβαίνει στις περισσότερες περιπτώσεις. Ανάλογα µε την αρχιτεκτονική που χρησιµοποιείται σε κάθε περίπτωση, ένας χαρακτήρας µπορεί να αναπαρίσταται µε διαφορετικό τρόπο και να απαιτεί τη χρήση περισσότερων από ένα byte. Από την άλλη πλευρά, ένα byte θα έχει την ίδια δυαδική τιµή σε όλες τις αρχιτεκτονικές. Η χρήση του τύπου MPI_PACKED θα µελετηθεί σε επόµενη ενότητα. Η σωστή χρήση των τύπων δεδοµένων έχει πολύ µεγάλη σηµασία για τη σωστή λειτουργία µιας εφαρµογής που στηρίζεται στην ανταλλαγή µηνυµάτων ανάµεσα στις διεργασίες της. Όπως θα µελετήσουµε αναλυτικά σε επόµενη ενότητα, ο τύπος δεδοµένων των στοιχείων που αποστέλλονται ή παραλαµβάνονται αποτελεί ένα από τα ορίσµατα των συναρτήσεων που χρησιµοποιούνται για αυτή τη διαδικασία αποστολής ή παραλαβής. Στην περίπτωση αυτή θα πρέπει ο τύπος δεδοµένων των στοιχείων που αποστέλλονται να είναι ο ίδιος µε εκείνον που καθορίζεται κατά την κλήση της συνάρτησης αποστολής. Με τον ίδιο ακριβώς τρόπο ο τύπος δεδοµένων των στοιχείων που παραλαµβάνονται θα πρέπει να είναι ο ίδιος µε εκείνον που καθορίζεται κατά την κλήση της συνάρτησης παραλαβής του µηνύµατος. Εάν µια εφαρµογή δεν λάβει υπ όψιν αυτή την αντιστοιχία ανάµεσα στους τύπους δεδοµένων

8 Το περιβάλλον προγραµµατισµού MPI 8 των διακινούµενων στοιχείων και στα αντίστοιχα ορίσµατα που χρησιµοποιούνται στις συναρτήσεις αποστολής ή παραλαβής, θα λάβει χώρα η εµφάνιση πολλών προβληµάτων και σφαλµάτων χρόνου εκτέλεσης (run time errors). Μία δεύτερη απαίτηση που θα πρέπει να ικανοποιείται όσον αφορά τη σωστή χρήση των τύπων δεδοµένων, είναι η χρήση του ιδίου τύπου δεδοµένων από τη συνάρτηση αποστολής του µηνύµατος και την αντίστοιχη συνάρτηση παραλαβής. Εάν για παράδειγµα µια διεργασία αποστείλει ένα µήνυµα που περιέχει 15 πραγµατικούς αριθµούς σε µια άλλη διεργασία, τότε η κλήση της συνάρτησης παραλαβής από αυτή τη διεργασία θα πρέπει να περιέχει την πληροφορία πως τα στοιχεία που πρόκειται για παραληφθούν είναι πραγµατικοί αριθµό και δεν ανήκουν σε κάποιον άλλο τύπο δεδοµένων. Αυτό σηµαίνει πως ένα από τα ορίσµατα της συνάρτησης παραλαβής θα πρέπει να είναι ο τύπος δεδοµένων MPI_DOUBLE. Εναλλακτικά, µπορούµε αντί για τον τύπο MPI_DOUBLE να χρησιµοποιήσουµε τον τύπο double της γλώσσας C το MPI επιτρέπει τέτοιου είδους αντιστοιχίες. Η παραπάνω αντιστοιχία ανάµεσα στους τύπους του MPI και στους αντίστοιχους τύπους της γλώσσας προγραµµατισµού, ισχύει για τους όλους τους βασικούς τύπους δεδοµένων που περιλαµβάνονται στον παραπάνω πίνακα, εκτός από τους τύπους MPI_BYTE και MPI_PACKED οι οποίοι αντιστοιχούν σε οποιοδήποτε byte της περιοχής αποθήκευσης, ανεξάρτητα από τον τύπο δεδοµένων της µεταβλητής που περιέχει αυτό το byte. Ο τύπος MPI_BYTE χρησιµοποιείται για να µεταφέρουµε τη δυαδική τιµή ενός byte µιας περιοχής µνήµης, ενώ ο τύπος MPI_PACKED χρησιµοποιείται για την αποστολή δεδοµένων που έχουν οµαδοποιηθεί µε την MPI_PACK ή έχει καταργηθεί η οµαδοποίησή τους µε την MPI_UNPACK. Ένα τελευταίο ζήτηµα που αφορά τη χρήση των τύπων δεδοµένων από τις συναρτήσεις του προτύπου MPI, είναι η µετατροπή των δεδοµένων στην περίπτωση που η διακίνησή τους γίνεται ανάµεσα σε ετερογενή συστήµατα που χαρακτηρίζονται από διαφορετικού τύπου αρχιτεκτονική. Υπάρχουν δύο είδη τέτοιων µετατροπών, η µετατροπή τύπου (type conversion) που µεταβάλλει τον τύπο δεδοµένων ενός στοιχείου (τυπικό παράδειγµα τέτοιας µετατροπής είναι αυτή από πραγµατικό αριθµό σε ακέραιο) και η µετατροπή αναπαράστασης (representation conversion) που µεταβάλλει τη δυαδική αναπαράσταση ενός αριθµού χαρακτηριστικό παράδειγµα τέτοιας µετατροπής είναι η µεταβολή της σειράς των bytes (byte ordering) ή η µεταβολή της αναπαράστασης των πραγµατικών αριθµών από 32 bits σε 64 bits. Είναι σηµαντικό να αναφερθεί στο σηµείο αυτό, πως οι κανόνες αντιστοιχίας των τύπων δεδοµένων που παρουσιάσαµε στις προηγούµενες παραγράφους προϋποθέτουν την απουσία οποιασδήποτε µετατροπής τύπων δεδοµένων. Από την άλλη πλευρά, το MPI απαιτεί πως η παραπάνω µετατροπή αναπαράστασης θα πρέπει να πραγµατοποιείται κάθε φορά που ένα στοιχείο που ανήκει σε κάποιο τύπο δεδοµένων ανταλλάσσεται ανάµεσα σε δύο συστήµατα που χρησιµοποιούν διαφορετικούς τύπους αναπαράστασης για αυτό το στοιχείο. Ωστόσο το MPI δεν καθορίζει τους κανόνες µε βάση τους οποίους θα πραγµατοποιηθεί αυτή η µετατροπή αναπαράστασης. Μια τέτοια µετατροπή αναµένεται να διατηρήσει την τιµή της µεταβλητής που µετατρέπεται (εάν πρόκειται για ακέραια µεταβλητή, λογική µεταβλητή ή µεταβλητή χαρακτήρα) ή να την προσαρµόσει στην πλησιέστερη προς αυτή τιµή που µπορεί να αναπαρασταθεί από το σύστηµα προορισµού (εάν πρόκειται για πραγµατική µεταβλητή).

9 Παράλληλα και Κατανεµηµένα Συστήµατα 9 Η παραπάνω διαδικασία µετατροπής της αναπαράστασης των τύπων δεδοµένων ανάµεσα στα συστήµατα αποστολής και παραλαβής της πληροφορίας, δύναται να οδηγήσει στην εµφάνιση σφαλµάτων υπερχείλισης (overflows) και υποχείλισης (underflows). Υπάρχει επίσης η πιθανότητα η µετατροπή ενός ακεραίου ή χαρακτήρα να οδηγήσει σε µία τιµή η οποία δεν δύναται να αναπαρασταθεί στο σύστηµα παραλήπτη. Τέτοιου είδους προβληµατικές καταστάσεις οδηγούν στη διακοπή της επικοινωνίας και στην αποτυχία της διαδικασίας αποστολής ή λήψης δεδοµένων. Για το λόγο αυτό, οι µετατροπές αυτού του είδους θα πρέπει να πραγµατοποιούνται µε πολύ µεγάλη προσοχή και όπου αυτό είναι αναγκαίο. Οι βασικές συναρτήσεις του MPI Αν και το πρότυπο MPI θεωρείται γενικά ως ένα πολύπλοκο µοντέλο επικοινωνίας, εν τούτοις, το σύνολο σχεδόν των παράλληλων εφαρµογών που στηρίζονται στη χρήση αυτού του προτύπου µπορεί να υλοποιηθεί χρησιµοποιώντας µόνο ένα µικρό πλήθος συναρτήσεων. Αυτές οι συναρτήσεις (καθώς και όλες οι συναρτήσεις του MPI) ορίζονται στο αρχείο επικεφαλίδας mpi.h το οποίο θα πρέπει να χρησιµοποιείται σε όλες τις εφαρµογές που χρησιµοποιούν το πρότυπο διαβίβασης µηνυµάτων. Η χρήση αυτού του αρχείου στη γλώσσα προγραµµατισµού C, θα γίνει κατά τα γνωστά δια της χρήσεως της εντολής του προεπεξεργαστή #include <mpi.h>. Είναι σηµαντικό να αναφερθεί στο σηµείο αυτό, πως πριν τη χρήση οποιασδήποτε εντολής MPI, θα πρέπει να λάβει χώρα η αρχικοποίηση αυτού του περιβάλλοντος, η οποία θα γίνει χρησιµοποιώντας τη συνάρτηση MPI_Init. Αυτό σηµαίνει πως αυτή η συνάρτηση θα πρέπει να καλείται πριν από οποιαδήποτε συνάρτηση MPI. Μετά τη χρήση των κατάλληλων σε κάθε περίπτωση συναρτήσεων του MPI, θα πρέπει να τερµατίζεται η λειτουργία αυτού του περιβάλλοντος, κάτι που γίνεται δια της χρήσεως της συνάρτησης MPI_Finalize(). Εποµένως η συνάρτηση αυτή θα πρέπει να καλείται πάντοτε τελευταία µέσα από τον πηγαίο κώδικα της εφαρµογής. Από την παραπάνω περιγραφή καθίσταται προφανές πως η δοµή ενός προγράµµατος που χρησιµοποιεί συναρτήσεις MPI θα είναι η ακόλουθη: #include <mpi.h> // Στο σηµείο αυτό µπορούµε να δηλώσουµε τα επιθυµητά σε κάθε περίπτωση // αρχεία επικεφαλίδας int main (int argc, char * argv[]) { // ήλωση των µεταβλητών του προγράµµατος // Κλήση συναρτήσεων της γλώσσας C MPI_Init (&argc, &argv); // Ανάµεσα στις συναρτήσεις MPI_Init() και MPI_Finalize() µπορούµε // να καλέσουµε συναρτήσεις του MPI και φυσικά οποιαδήποτε // συνάρτηση της γλώσσας C MPI_Finalize();

10 Το περιβάλλον προγραµµατισµού MPI 10 // Στο σηµείο αυτό µπορούµε να καλέσουµε συναρτήσεις της γλώσσας // C αλλά όχι και συναρτήσεις του MPI return (0); } Ως ένα πρώτο παράδειγµα προγράµµατος σε γλώσσα MPI ας δούµε το πιο απλό πρόγραµµα που µπορούµε να γράψουµε και το οποίο εκτυπώνει στην οθόνη του υπολογιστή µας το µήνυµα Hello World. Ο πηγαίος κώδικας για το απλό αυτό πρόγραµµα, παρουσιάζεται στη συνέχεια. #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[0]) { char message [16] = Hello World!! MPI_Init (&argc, &argv); printf ( %s\n, message); MPI_Finalize(); return (0); } Το παραπάνω πρόγραµµα δεν χρησιµοποιεί καµία συνάρτηση του MPI και απλά αρχικοποιεί και τερµατίζει το προγραµµατιστικό αυτό περιβάλλον. Προκειµένου τώρα να δηµιουργήσουµε το εκτελέσιµο αρχείο, µπορούµε κατά τα γνωστά να χρησιµοποιήσουµε ένα οποιοδήποτε µεταγλωττιστή της γλώσσας C, όπως είναι για παράδειγµα ο µεταγλωττιστής gcc (GNU C compiler). Ωστόσο το MPI περιέχει εκτός των άλλων και ένα ενσωµατωµένο C compiler που εκτός από τις λειτουργίες ενός τυπικού µεταγλωττιστή περιέχει και εξειδικευµένες λειτουργίες που συσχετίζονται µε το περιβάλλον του MPI. Αυτός ο µεταγλωττιστής φέρει το όνοµα mpicc και χρησιµοποιείται µε το ίδιο ακριβώς τρόπο όπως και ο µεταγλωττιστής gcc. Έτσι για να κατασκευάσουµε το αρχείο αντικειµενικού κώδικα του παραπάνω αρχείου (το οποίο ας υποθέσουµε πως ονοµάζεται hello.c) θα πρέπει να χρησιµοποιήσουµε την εντολή mpicc c hello.c ενώ η κατασκευή του εκτελέσιµου αρχείου θα λάβει χώρα εάν γράψουµε mpicc o hello.exe mpi.o. Χρησιµοποιώντας το µεταγλωττιστή mpicc µε τον τρόπο που προαναφέραµε, θα λάβουµε το εκτελέσιµο αρχείο hello.exe. Χρησιµοποιώντας αυτό το αρχείο µπορούµε να κατασκευάσουµε ένα πλήθος Ν διεργασιών οι οποίες δύνανται να επικοινωνούν µεταξύ τους χρησιµοποιώντας τις συναρτήσεις του MPI. Ο τρόπος δηµιουργίας αυτών των διεργασιών είναι δια της χρήσεως της εφαρµογής mpirun που περιλαµβάνεται στο πακέτο διανοµής του προτύπου. Η αναλυτική παρουσίαση αυτής της εντολής θα γίνει σε επόµενη ενότητα. Για την ώρα όµως ας δούµε τον τρόπο µε τον οποίο θα χρησιµοποιήσουµε αυτή την εντολή για να δηµιουργήσουµε ένα πλήθος διεργασιών από την εφαρµογή hello.exe. Για να το κάνουµε αυτό θα πρέπει να καλέσουµε την εντολή µε το διακόπτη np συνοδευόµενο από το πλήθος των διεργασιών που θέλουµε να δηµιουργήσουµε. Έτσι καλώντας την εντολή mpirun µε τη µορφή mpirun np 5 hello.exe θα δηµιουργήσουµε πέντε διεργασίες (αντίγραφα του hello.exe) οι τάξεις (ranks) των οποίων θα είναι 0,1,2,3 και 4. Όσον αφορά το αποτέλεσµα της εκτέλεσης της παραπάνω εντολής, αυτό θα είναι η εκτύπωση του µηνύµατος Hello World!! από κάθε µια από αυτές τις διεργασίες. Αυτό σηµαίνει πως η έξοδος της εντολής mpirun np 5 hello.exe θα έχει τη µορφή Hello World!!

11 Παράλληλα και Κατανεµηµένα Συστήµατα 11 Hello World!! Hello World!! Hello World!! Hello World!! ύο άλλες ενδιαφέρουσες και πολύ χρήσιµες συναρτήσεις του MPI είναι η Get_Comm_rank που επιστρέφει την τάξη της τρέχουσας διεργασίας, και η Get_Comm_size που επιστρέφει το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Οι διεργασίες αυτές δέχονται δύο ορίσµατα εκ των οποίων το πρώτο όρισµα καθορίζει τον Communicator στον οποίο αναφερόµαστε, ενώ το δεύτερο όρισµα είναι ένας δείκτης προς µια ακέραια µεταβλητή, η οποία µετά την κλήση της συνάρτησης θα περιέχει τη ζητούµενη πληροφορία. Θεωρώντας δύο µεταβλητές rank και size τύπου integer, µπορούµε να βρούµε την τάξη της τρέχουσας διεργασίας και το συνολικό πλήθος των διεργασιών του προεπιλεγµένου Communicator που περιγράφεται από τη σταθερά MPI_COMM_WORLD, καλώντας τις παραπάνω συναρτήσεις µε τη µορφή MPI_Comm_rank (MPI_COMM_WORLD, &rank) και MPI_Comm_size (MPI_COMM_WORLD, &size). Εάν για παράδειγµα δηµιουργήσουµε πέντε αντίγραφα της διεργασίας hello.exe χρησιµοποιώντας την εντολή mpirun np 5 hello.exe, η κλήση της συνάρτησης MPI_Comm_size θα αποδώσει στην ακέραια µεταβλητή size την τιµή 5, ενώ η κλήση της συνάρτησης MPI_Comm_rank θα αποδώσει στη µεταβλητή rank την τάξη της τρέχουσας διεργασίας. Υπενθυµίζουµε στο σηµείο αυτό πως η κάθε διεργασία θα έχει τη δική της µεταβλητή rank, στην οποία θα καταχωρηθεί και η τάξη αυτής της διεργασίας. Αυτό σηµαίνει πως η µεταβλητή rank της πρώτης διεργασίας θα λάβει την τιµή 0, η µεταβλητή rank της δεύτερης διεργασίας θα λάβει την τιµή 1, η µεταβλητή rank της τρίτης διεργασίας θα λάβει την τιµή 2, η µεταβλητή rank της τέταρτης διεργασίας θα λάβει την τιµή 3, και η µεταβλητή rank της πέµπτης διεργασίας θα λάβει την τιµή 4. Προκειµένου να κατανοήσουµε το ρόλο και τον τρόπο χρήσης των συναρτήσεων MPI_Comm_rank και MPI_Comm_size ας εµπλουτίσουµε το πρόγραµµα Hello.c έτσι ώστε εκτός από το µήνυµα Hello World!! να εµφανίζει την τάξη της τρέχουσας διεργασίας και το συνολικό πλήθος των διεργασιών του Communicator. Σε πλήρη εφαρµογή της διαδικασίας που περιγράψαµε στην προηγούµενη παράγραφο, ας ορίσουµε δύο ακέραιες µεταβλητές rank και size και ας τις περάσουµε ως ορίσµατα στις αντίστοιχες συναρτήσεις. Ο νέος κώδικας που θα προκύψει µετά τις παραπάνω προσθήκες θα έχει τη µορφή #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[0]) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); printf ( Hello World from process %d of %d\n, rank, size); MPI_Finalize();

12 Το περιβάλλον προγραµµατισµού MPI 12 return (0); } Εάν δηµιουργήσουµε το εκτελέσιµο αρχείο Hello.exe µε τον τρόπο που περιγράψαµε στην προηγούµενη παράγραφο και δηµιουργήσουµε τα πέντε αντίγραφα της διεργασίας χρησιµοποιώντας την εντολή mpirun np 5 hello.exe, το αποτέλεσµα που θα λάβουµε θα έχει τη µορφή Hello World from process 1 of 5 Hello World from process 2 of 5 Hello World from process 3 of 5 Hello World from process 4 of 5 Hello World from process 5 of 5 Παρατηρούµε λοιπόν πως η κάθε διεργασία κατά την εκτέλεσή της εκτυπώνει το µήνυµα Hello World εκτυπώνοντας την δική της τάξη και το συνολικό πλήθος των διεργασιών του Communicator. Οι δύο τελευταίες βασικές συναρτήσεις που θα παρουσιαστούν στο σηµείο αυτό, αφορούν τις παρεµποδιστικές συναρτήσεις αποστολής και λήψης µηνυµάτων οι οποίες φέρουν τα ονόµατα MPI_Send και MPI_Recv. Οι δύο αυτές συναρτήσεις παίρνουν ακριβώς τα ίδια ορίσµατα µε τη διαφορά πως η MPI_Recv δέχεται ένα επιπλέον όρισµα που περιέχει πληροφορίες σχετικά µε τη διαδικασία παραλαβής του µηνύµατος. Τα τρία πρώτα ορίσµατα των παραπάνω συναρτήσεων ταυτοποιούν το µήνυµα που αποστέλλεται ή λαµβάνεται. Πιο συγκεκριµένα, το πρώτο όρισµα είναι ένας δείκτης στην περιοχή µνήµης που περιέχει το µήνυµα προς αποστολή, το δεύτερο όρισµα περιέχει το πλήθος των αντικειµένων που περιλαµβάνονται σε αυτό το µήνυµα, ενώ το τρίτο όρισµα περιέχει τον τύπο αυτών των δεδοµένων. Ας υποθέσουµε για παράδειγµα, πως ορίζουµε ένα πίνακα 10 ακεραίων δια της χρήσεως µιας δήλωσης της µορφής int buffer [10]. Στην περίπτωση αυτή τα τρία πρώτα ορίσµατα της MPI_Send θα είναι τα (buffer, 10, MPI_INT). Τα υπόλοιπα ορίσµατα της συνάρτησης MPI_Send αφορούν τις υπόλοιπες παραµέτρους της επικοινωνίας. Έτσι το τέταρτο όρισµα περιέχει την τάξη της διαδικασίας η οποία θα παραλάβει το µήνυµα, το πέµπτο όρισµα περιέχει την ετικέτα του µηνύµατος, ενώ το τελευταίο όρισµα περιέχει τον Communicator στον οποίο ανήκουν οι διεργασίες ανάµεσα στις οποίες ανταλλάσσεται το τρέχον µήνυµα. Εάν δεν θέλουµε να χρησιµοποιήσουµε κάποια ετικέτα για το µήνυµα που αποστέλλεται, µπορούµε ως τιµή στο όρισµα της ετικέτας, να καταχωρήσουµε την τιµή MPI_ANY_TAG. Τέλος, εάν δεν έχουµε ορίσει κάποιο συγκεκριµένο Communicator αλλά οι δύο διεργασίες ανήκουν στον προεπιλεγµένο Communicator, θα χρησιµοποιήσουµε ως τιµή για το τελευταίο όρισµα της συνάρτησης MPI_Send, τη σταθερά MPI_COMM_WORLD. Τυπικό παράδειγµα της συνάρτησης MPI_Send είναι η κλήση της µε τη µορφή MPI_Send (&a, 1, MPI_INT, 5, MPI_ANY_TAG, MPI_COMM_WORLD) η οποία αποστέλλει στη διεργασία µε τιµή τάξης ίση µε 5 που ανήκει στον προεπιλεγµένο Communicator, την τιµή της µεταβλητής a. Επειδή η a είναι µία απλή ακέραια µεταβλητή που έχει δηλωθεί δια µέσου µιας δήλωσης της µορφής int a=10, τα τρία πρώτα ορίσµατα της συνάρτησης MPI_Send, θα είναι τα &a, 1 και MPI_INT. Στο παραπάνω παράδειγµα, η τιµή της ετικέτας του µηνύµατος προς αποστολή δεν

13 Παράλληλα και Κατανεµηµένα Συστήµατα 13 χρειάζεται ή δεν µας ενδιαφέρει για το λόγο αυτό ως τιµή για αυτή την ετικέτα χρησιµοποιείται η σταθερά MPI_ANY_TAG. Στην περίπτωση της διαδικασίας παραλαβής µηνυµάτων αυτή λαµβάνει χώρα δια της χρήσεως της συνάρτησης MPI_Recv. Αυτή η συνάρτηση δέχεται ακριβώς τα ίδια ορίσµατα µε την MPI_Send αλλά διαφέρει µε αυτή σε δύο σηµεία: (α) το τέταρτο όρισµα της συνάρτησης αναφέρεται προφανώς στην τάξη της διεργασίας από την οποία η τρέχουσα διεργασία παραλαµβάνει το αποστελλόµενο µήνυµα (source rank). Εάν επιθυµούµε να λάβουµε µηνύµατα από οποιαδήποτε από τις διεργασίες που υπάρχουν στο σύστηµα θα αποδώσουµε στην παράµετρο αυτή την τιµή MPI_ANY_SOURCE και (β) µετά το έκτο όρισµα που ταυτοποιεί τον Communicator στον οποίο ανήκουν οι δύο διεργασίες, υπάρχει ένα επιπλέον όρισµα που ανήκει στον σύνθετο τύπο δεδοµένων MPI_Status και περιέχει πληροφορίες σχετικά µε τις παραµέτρους παραλαβής του µηνύµατος. Αυτός ο τύπος δεδοµένων ορίζεται ως µια δοµή που περιέχει τρία πεδία: από τα πεδία αυτά το MPI_SOURCE περιέχει τη τάξη της διεργασίας αποστολέα, το MPI_TAG περιέχει την ετικέτα του µηνύµατος που έχει παραληφθεί, και το MPI_ERROR περιέχει τον κωδικό του σφάλµατος που έχει λάβει χώρα, εάν έχει καταγραφεί ένα τέτοιο σφάλµα. Αν και οι πληροφορίες σχετικά µε την τάξη της διαδικασίας αποστολέα και της ετικέτας του µηνύµατος µπορούν να ανακτηθούν και από τα αντίστοιχα ορίσµατα της συνάρτησης MPI_Recv, εν τούτοις, η δοµή MPI_Status είναι ιδιαίτερα χρήσιµη σε περιπτώσεις κατά τις οποίες οι πληροφορίες αυτές δεν έχουν καθορισθεί (αυτό σηµαίνει πως ως τιµές στα πεδία sourcerank και messagetag χρησιµοποιήθηκαν οι τιµές MPI_ANY_SOURCE και MPI_ANY_TAG). Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Recv, είναι η κλήση της µε τη µορφή MPI_Recv (&a, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, status) η οποία παραλαµβάνει από τη διεργασία µε τάξη 0, την τιµή της µεταβλητής a. Ένα άλλο θέµα που θα πρέπει να αναφέρουµε στο σηµείο αυτό είναι ο ρόλος του ορίσµατος count που είναι το δεύτερο από τα ορίσµατα της συνάρτησης MPI_Recv. Αυτό το όρισµα δεν αναφέρεται στο ακριβές πλήθος των στοιχείων που περιλαµβάνονται στο µήνυµα που πρόκειται να παραληφθεί, αλλά στο µέγιστο πλήθος αυτών των στοιχείων. Εάν σε αυτό το όρισµα καταχωρήσουµε µια ακέραια µεταβλητή Ν, αυτό σηµαίνει πως το µήνυµα που θα παραλάβουµε θα πρέπει να περιέχει το πολύ Ν στοιχεία στην αντίθετη περίπτωση η συνάρτηση παραλαβής δεν θα ολοκληρωθεί µε επιτυχία αλλά θα επιστρέψει ένα κωδικό σφάλµατος. Αξίζει επίσης να σηµειωθεί πως η χρήση του ορίσµατος count µας επιτρέπει να εκφράσουµε το µέγεθος του µηνύµατος, όχι σε bytes αλλά σε πλήθος στοιχείων που περιλαµβάνονται σε αυτό. Η τεχνική αυτή καθιστά την εφαρµογή µας ανεξάρτητη από την αρχιτεκτονική στην οποία εκτελείται και υπό αυτή την έννοια της προσδίδει πολύ µεγαλύτερο βαθµό φορητότητας (portability). Ας σηµειωθεί πως είναι δυνατή η αποστολή µε µηδενικό πλήθος στοιχείων αυτό σηµαίνει πως το όρισµα count έχει τιµή ίση µε το µηδέν. Στην περίπτωση αυτή η διεργασία αποστολέας αποστέλλει µόνο την επικεφαλίδα του µηνύµατος ενώ το τµήµα των δεδοµένων (data section) δεν υφίσταται.

14 Το περιβάλλον προγραµµατισµού MPI 14 Στο σηµείο αυτό έχουµε ολοκληρώσει την πρώτη ποιοτική περιγραφή των έξι βασικών συναρτήσεων του MPI, και είναι καιρός να περάσουµε στην αυστηρή περιγραφή της λειτουργίας τους και του τρόπου µε τον οποίο καλούνται. Σε γενικές γραµµές λοιπόν, οι συναρτήσεις MPI_Init, MPI_Finalize, MPI_Comm_rank, MPI_Comm_size, MPI_Send και MPI_Recv χαρακτηρίζονται από τις ακόλουθες ιδιότητες: MPI_Init: Η συνάρτηση αυτή αρχικοποιεί το πρότυπο MPI και δηµιουργεί όλες τις δοµές δεδοµένων που είναι αναγκαίες για τη λειτουργία του (όπως είναι για παράδειγµα ο προεπιλεγµένος Communicator MPI_COMM_WORLD). Όπως έχει ήδη αναφερθεί, η συνάρτηση αυτή θα πρέπει να κληθεί µία και µοναδική φορά, πριν την κλήση οποιασδήποτε άλλης συνάρτησης του MPI η κλήση της για δεύτερη φορά µέσα από την εφαρµογή θα προκαλέσει την εµφάνιση µηνύµατος λάθους. Το πρωτότυπο της συνάρτησης MPI_Init έχει τη µορφή MPI_Init (int * argc, char ** arcv[]) όπου argc και argv είναι τα ορίσµατα που χρησιµοποιούµε κατά την κλήση της συνάρτησης main. Από τα ορίσµατα αυτά το πρώτο αναφέρεται στο πλήθος των ορισµάτων µε τα οποία καλείται το εκτελέσιµο αρχείο της εφαρµογής, ενώ το δεύτερο είναι ένας πίνακας συµβολοσειρών ή ισοδύναµα ένας δισδιάστατος πίνακας χαρακτήρων που περιέχει τα ονόµατα αυτών των ορισµάτων. MPI_Finalize: η συνάρτηση MPI_Finalize είναι η τελευταία συνάρτηση που θα πρέπει να κληθεί και ο ρόλος της είναι ο τερµατισµός της λειτουργίας του προτύπου MPI. Αυτό σηµαίνει πως κάθε φορά που χρησιµοποιούµε συναρτήσεις MPI µέσα από ένα πρόγραµµα C, θα πρέπει υποχρεωτικά να χρησιµοποιούµε τη συνάρτηση MPI_Finalize για να απελευθερώσουµε τη µνήµη που δεσµεύεται από τις δοµές δεδοµένων του προτύπου και γενικά για να τερµατίσουµε τη λειτουργία του. Η συνάρτηση MPI_Finalize καλείται χωρίς ορίσµατα. MPI_Comm_rank: η συνάρτηση MPI_Comm_rank επιστρέφει την τάξη της τρέχουσας διεργασίας. Η κλήση της συνάρτησης χαρακτηρίζεται από τη σύνταξη MPI_Comm_rank (MPI_comm comm, int * rank) όπου η µεταβλητή comm χρησιµοποιείται για τον καθορισµό του Communicator στον οποίο ανήκει η διεργασία, ενώ η µεταβλητή rank είναι µια ακέραια µεταβλητή που µετά την επιτυχή κλήση της συνάρτησης θα περιέχει την τάξη της τρέχουσας διεργασίας. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Comm_rank είναι η κλήση της µε τη µορφή MPI_Comm_rank (MPI_COMM_WORLD, &rank) η οποία επιστρέφει στη µεταβλητή rank την τάξη της τρέχουσας διεργασίας που ανήκει στον προεπιλεγµένο Communicator MPI_COMM_WORLD. MPI_Comm_size: η συνάρτηση MPI_Comm_size επιστρέφει το µέγεθος ενός Communicator, δηλαδή το πλήθος των διεργασιών που περιλαµβάνονται σε αυτόν. Η κλήση αυτής της συνάρτησης χαρακτηρίζεται από τη σύνταξη MPI_Comm_size (MPI_comm comm, int * size) όπου η µεταβλητή comm χρησιµοποιείται για τον καθορισµό του Communicator του οποίου το µέγεθος θέλουµε να ανακτήσουµε, ενώ η µεταβλητή size είναι µια ακέραια µεταβλητή που µετά την επιτυχή κλήση της συνάρτησης θα περιέχει το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Comm_size είναι η κλήση της µε τη µορφή MPI_Comm_size (MPI_COMM_WORLD, &size) η οποία επιστρέφει στη µεταβλητή size το πλήθος

15 Παράλληλα και Κατανεµηµένα Συστήµατα 15 των διεργασιών που ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD. MPI_Send: η συνάρτηση MPI_Send χρησιµοποιείται για την αποστολή ενός µηνύµατος σε κάποια από τις διεργασίες που περιλαµβάνονται στον τρέχοντα Communicator. Ας σηµειωθεί πως αυτή η συνάρτηση ανήκει στις επονοµαζόµενες παρεµποδιστικές συναρτήσεις, οι οποίες κατά το χρονικό διάστηµα της λειτουργίας τους, αναστέλλουν τη λειτουργία της διεργασίας που τις καλεί. Το πρωτότυπο της συνάρτησης MPI_Send έχει τη µορφή MPI_Send (void * buf, int count, MPI_Datatype datatype, int destrank, int mesagetag, MPI_Comm comm). Από τα ορίσµατα αυτά της συνάρτησης, τα τρία πρώτα ταυτοποιούν τα χαρακτηριστικά του µηνύµατος προς αποστολή. Πιο συγκεκριµένα το πρώτο όρισµα περιέχει τη διεύθυνση της περιοχής µνήµης στην οποία βρίσκονται τα δεδοµένα προς αποστολή, το δεύτερο όρισµα περιέχει το πλήθος των στοιχείων προς αποστολή, ενώ το τρίτο όρισµα περιέχει τον τύπο δεδοµένων για αυτά τα στοιχεία. Τα επόµενα τρία ορίσµατα αφορούν (µε τη σειρά µε την οποία αναγράφονται) την τάξη της διεργασίας προς την οποία πρόκειται να αποσταλεί το µήνυµα (διεργασία παραλήπτης), την ετικέτα του µηνύµατος που µας επιτρέπει να ξεχωρίσουµε αυτό το µήνυµα από τα υπόλοιπα (εάν δεν θέλουµε να καθορίσουµε κάποια ετικέτα µπορούµε να καταχωρήσουµε σε αυτό το όρισµα την τιµή MPI_ANY_TAG) και τον Communicator στον οποίο ανήκουν οι διεργασίες αποστολέας και παραλήπτης. Η ετικέτα του µηνύµατος είναι ένας ακέραιος αριθµός που παίρνει τιµές στο διάστηµα [0, UB], όπου η τιµή της σταθεράς UB εξαρτάται από την υλοποίηση που χρησιµοποιείται σε κάθε περίπτωση. Προκειµένου να ανακτήσουµε την τιµή αυτής της σταθεράς, θα πρέπει να ζητήσουµε από το σύστηµα να µας επιστρέψει την τιµή του µεγέθους MPI_TAG_UB. Είναι προφανές πως εφ όσον η ετικέτα είναι ένας ακέραιος αριθµός, η τιµή αυτού του µεγέθους δεν µπορεί να είναι µικρότερη από Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Send είναι η κλήση της µε τη µορφή MPI_Send (buffer, 100, MPI_CHAR, 1, 0, MPI_COMM_WORLD) η οποία προκαλεί την αποστολή µιας συµβολοσειράς 100 χαρακτήρων στη διεργασία µε τιµή τάξης ίση µε 1. Αυτή η συµβολοσειρά περιλαµβάνεται σε ένα µήνυµα η ετικέτα του οποίου έχει την τιµή 0, ενώ και οι δύο διεργασίες ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD. Είναι προφανές πως η περιοχή της ενδιάµεσης µνήµης στην οποία βρίσκονται αποθηκευµένα τα δεδοµένα προς αποστολή, αποτελείται από count συνεχόµενα στοιχεία τύπου datatype, µε το πρώτο όρισµα της συνάρτησης MPI_Send (που περιγράφεται από το όνοµα buf) να είναι ένας δείκτης προς το πρώτο από αυτά τα συνεχόµενα στοιχεία. Εφ όσον ο τύπος δεδοµένων για αυτά τα συνεχόµενα στοιχεία είναι γνωστός, είναι πάρα πολύ εύκολο να υπολογίσουµε το συνολικό µέγεθος των δεδοµένων προς αποστολή. Στο παραπάνω παράδειγµα η ενδιάµεση περιοχή µνήµης που περιέχει τα δεδοµένα του µηνύµατος, περιλαµβάνει 100 συνεχόµενους χαρακτήρες, και εποµένως το µέγεθος της περιοχής buffer είναι ίσο µε 100 bytes. Είναι προφανές πως εφ όσον το δεύτερο όρισµα της συνάρτησης MPI_Send αναφέρεται στο πλήθος των στοιχείων που περιλαµβάνονται στην ενδιάµεση µνήµη,

16 Το περιβάλλον προγραµµατισµού MPI 16 και όχι στο µέγεθός της σε bytes, είναι δυνατή η µεταφορά των προγραµµάτων MPI και σε αρχιτεκτονικές που δεν είναι οργανωµένες µε βάση το byte. MPI_Recv: η συνάρτηση MPI_Recv χρησιµοποιείται για την παραλαβή ενός µηνύµατος από κάποια από τις διεργασίες που ανήκουν στον τρέχοντα Communicator. Ας σηµειωθεί πως η συνάρτηση αυτή είναι µια παρεµποδιστική συνάρτηση, κάτι που σηµαίνει πως κατά τη διάρκεια της παραλαβής κάποιου µηνύµατος, λαµβάνει χώρα αναστολή της διεργασίας που την καλεί. Η χρήση της συνάρτησης MPI_Recv χαρακτηρίζεται από µια κλήση της µορφής MPI_Recv (void * buf, int count, MPI_Datatype datatype, int sourcerank, int messagetag, MPI_Comm comm, MPI_Status status) και εποµένως η εν λόγω συνάρτηση χρησιµοποιείται µε τον ίδιο σχεδόν τρόπο όπως η MPI_Send. Στην περίπτωση αυτή βέβαια το τέταρτο όρισµα αναφέρεται στην τάξη της διεργασίας αποστολέα, ενώ υπάρχει και ένα επιπλέον όρισµα που δεν εµφανίζεται στη συνάρτηση MPI_Send, και το οποίο όπως έχουµε ήδη αναφέρει επιτρέπει την ανάκτηση πληροφοριών σχετικά µε την κατάσταση παραλαβής του µηνύµατος. Τυπικό παράδειγµα χρήσης της συνάρτησης MPI_Recv είναι η κλήση της µε τη µορφή MPI_Recv (buffer, 50, MPI_DOUBLE, 4, MPI_ANY_TAG, MPI_COMM_WORLD, status) η οποία διαβάζει ένα µήνυµα που περιέχει 50 πραγµατικούς αριθµούς διπλής ακρίβειας από τη διεργασία µε τιµή τάξης ίση µε 4. Οι δύο διεργασίες του εν λόγω παραδείγµατος ανήκουν στον προεπιλεγµένο Communicator MPI_COMM_WORLD ενώ η ετικέτα που µηνύµατος που παραλαµβάνεται δεν µας ενδιαφέρει, και για το λόγο αυτό ως τιµή στο αντίστοιχο όρισµα χρησιµοποιείται η σταθερά MPI_ANY_TAG. Είναι προφανές πως η επιτυχής παραλαβή ενός µηνύµατος απαιτεί τη δέσµευση του κατάλληλου σε κάθε περίπτωση αποθηκευτικού χώρου. Πιο συγκεκριµένα, το µέγεθος του µηνύµατος προς παραλαβή θα πρέπει να είναι µικρότερο ή ίσο µε το µέγεθος του χώρου ενδιάµεσης αποθήκευσης το όνοµα του οποίου περνάµε ως πρώτο όρισµα στη συνάρτηση MPI_Recv. Εάν το µέγεθος του µηνύµατος (το οποίο ας υποθέσουµε πως είναι ίσο µε Ν) είναι µικρότερο από το µέγεθος του αποθηκευτικού χώρου, το µήνυµα θα καταλάβει τις Ν πρώτες θέσεις της µνήµης, ενώ το υπόλοιπο τµήµα του ενδιάµεσου αποθηκευτικού χώρου θα παραµείνει αµετάβλητο. Αντίθετα εάν το µήνυµα είναι µεγαλύτερο από το µέγεθος του εν λόγω χώρου, η παραλαβή του δεν θα ολοκληρωθεί σωστά, και η MPI_Recv θα επιστρέψει ένα κωδικό σφάλµατος. Μια χρήσιµη συνάρτηση που χρησιµοποιείται σε συνδυασµό µε την MPI_Recv, είναι η συνάρτηση MPI_Get_count η οποία µας επιτρέπει να ανακτήσουµε το µέγεθος του µηνύµατος που έχει παραληφθεί από την MPI_Recv, δηλαδή το πλήθος των στοιχείων που περιλαµβάνονται σε αυτό. Η σύνταξη της MPI_Get_count έχει τη µορφή MPI_Get_count (MPI_Status * status, MPI_Datatype datatype, int * count) όπου status είναι το τελευταίο όρισµα της MPI_Recv και περιέχει πληροφορίες σχετικά µε τη διαδικασία παραλαβής του µηνύµατος, datatype είναι ο τύπος δεδοµένων των στοιχείων που έχουν παραληφθεί, ενώ count είναι µια ακέραια µεταβλητή που µετά την κλήση της MPI_Get_count θα περιέχει το πλήθος αυτών των στοιχείων. Τυπικό παράδειγµα συνδυασµένης χρήσης των συναρτήσεων MPI_Recv και MPI_Get_count παρουσιάζεται στη συνέχεια: MPI_Recv (&value,1,mpi_int,rank-1,0, MPI_COMM_WORLD, &status ); MPI_Get_count (status, MPI_INT, &items)

17 Παράλληλα και Κατανεµηµένα Συστήµατα 17 Στον παραπάνω κώδικα, το όρισµα status (που ανήκει στον τύπο δεδοµένων MPI_Status) είναι εκείνο που επιστρέφεται από την MPI_Recv, ενώ items είναι µια ακέραια µεταβλητή η οποία µετά την κλήση της MPI_Get_count θα περιέχει το πλήθος των στοιχείων που περιέχονται στο µήνυµα που έχει παραληφθεί. Τα πρώτα προγράµµατα MPI Μετά την παρουσίαση των έξι βασικών συναρτήσεων του MPI ας παρουσιάσουµε τώρα µερικά παραδείγµατα χρήσης τους σε πρακτικές εφαρµογές προκειµένου να κατανοήσουµε το ρόλο τους και τον τρόπο µε τον οποίο χρησιµοποιούνται. Για κάθε ένα από τα προγράµµατα που θα παραθέσουµε θα εξηγήσουµε µε αναλυτικό τρόπο τη δοµή τους και τη λειτουργία τους προκειµένου ο αναγνώστης να εξοικειωθεί µε τη χρήση των συναρτήσεων MPI στη διαδικασία ανάπτυξης παράλληλων εφαρµογών. Ως ένα πρώτο παράδειγµα εφαρµογής MPI ας εξετάσουµε τον επόµενο κώδικα που επιτρέπει την ανταλλαγή µηνυµάτων µεταξύ δύο διεργασιών. #include <mpi.h> #include <stdio.h> int main (int argc, char * argv[]) { int rank, size, retval; char inmessage, outmessage='x'; MPI_Status status; retval = MPI_Init(&argc,&argv); if (retval!= 0) { printf ("Error starting MPI program. Terminating.\n"); MPI_Abort (MPI_COMM_WORLD, retval); } MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); if (rank == 0) { MPI_Send(&outMessage,1,MPI_CHAR,1,MPI_ANY_TAG, MPI_COMM_WORLD); MPI_Recv(&inMessage,1,MPI_CHAR, 1,MPI_ANY_TAG, MPI_COMM_WORLD, &status); } else if (rank == 1) { MPI_Recv(&inMessage,1,MPI_CHAR,source,tag, MPI_COMM_WORLD, &Stat); MPI_Send(&outMessage,1,MPI_CHAR,dest,tag, MPI_COMM_WORLD); } MPI_Finalize(); return (0); }

18 Το περιβάλλον προγραµµατισµού MPI 18 Στην πρώτη γραµµή του προγράµµατος δηλώνουµε τις µεταβλητές που θα χρησιµοποιήσουµε. Στην προκειµένη περίπτωση χρειαζόµαστε τρεις ακέραιες µεταβλητές, εκ των οποίων στη µεταβλητή rank θα καταχωρήσουµε την τάξη της τρέχουσας διεργασίας, στη µεταβλητή size θα καταχωρήσουµε το πλήθος των διεργασιών του τρέχοντος Communicator, ενώ η µεταβλητή retval χρησιµοποιείται για την ανάκτηση των κωδικών σφάλµατος (error codes) που επιστρέφονται από τις συναρτήσεις του MPI. Εκτός από τις παραπάνω µεταβλητές, θα χρειαστούµε δύο µεταβλητές τύπου χαρακτήρα που θα περιέχουν τα µηνύµατα προς αποστολή και λήψη (οι µεταβλητές inmessage και outmessage) ενώ είναι αναγκαία και η χρήση της µεταβλητής status που ανήκει στον τύπο δεδοµένων MPI_Status και χρησιµοποιείται από τη συνάρτηση MPI_Recv. Σε πλήρη εφαρµογή της θεωρίας που παρουσιάσαµε στις προηγούµενες ενότητες, η πρώτη συνάρτηση που καλείται πριν την κλήση οποιασδήποτε συνάρτησης MPI, είναι η MPI_Init, η οποία δέχεται ως ορίσµατα δύο δείκτες προς τα αντίστοιχα ορίσµατα της συνάρτησης main. Ωστόσο στην προκειµένη περίπτωση δεν περιοριζόµαστε στην απλή κλήση της εν λόγω συνάρτησης, αλλά ανακτούµε τον κωδικό σφάλµατος που επιστρέφεται από αυτή, προκειµένου να ελέγξουµε εάν η διαδικασία αρχικοποίησης του MPI έχει περατωθεί οµαλά. Σύµφωνα µε τις προδιαγραφές του εν λόγω προτύπου, εάν η αρχικοποίηση του MPI ολοκληρωθεί χωρίς πρόβληµα, η συνάρτηση MPI_Init επιστρέφει τιµή ίση µε το µηδέν (η τιµή αυτή αντιστοιχεί στη σταθερά MPI_SUCCESS), ενώ εάν παρουσιαστεί κάποιο σφάλµα, αυτή η επιστρεφόµενη τιµή είναι διάφορη του µηδενός. Στην τελευταία περίπτωση θα πρέπει να καλέσουµε τη συνάρτηση MPI_Abort η οποία τερµατίζει όλες τις διεργασίες που περιλαµβάνονται στον τρέχοντα Communicator και χαρακτηρίζεται από µια σύνταξη της µορφής MPI_Abort (MPI_Comm comm, int errorcode). Μιλώντας γενικά, η συνάρτηση MPI_Abort θα πρέπει να καλείται κάθε φορά που η MPI_Init αποτύχει να διαµορφώσει µε επιτυχία το περιβάλλον του MPI. Στην περίπτωση κατά την οποία η εκκίνηση του MPI περατωθεί οµαλά, χρησιµοποιούµε δύο εντολές οι οποίες καλούνται σε όλες σχεδόν τις περιπτώσεις: την εντολή MPI_Comm_rank για να ανακτήσουµε την τάξη της τρέχουσας διεργασίας και την εντολή MPI_Comm_size για να ανακτήσουµε το πλήθος των διεργασιών που περιλαµβάνονται στον τρέχοντα Communicator. Σύµφωνα µε τον κώδικα του προηγούµενου παραδείγµατος, οι εν λόγω τιµές µετά την εκτέλεση αυτών των δύο εντολών θα βρίσκονται καταχωρηµένες στις µεταβλητές rank και size αντίστοιχα. Οι επόµενες οµάδες εντολών που χαρακτηρίζονται από τις συνθήκες ελέγχου if (rank==0) και if (rank==1) αποτελούν ένα πρώτο παράδειγµα εφαρµογής της τάξης µιας διεργασίας. Όπως έχει ήδη αναφερθεί, µετά τη δηµιουργία του εκτελέσιµου αρχείου και τη χρήση της εντολής mpirun για τη δηµιουργία του επιθυµητού σε κάθε περίπτωση πλήθους διεργασιών, η κάθε διεργασία χαρακτηρίζεται από τη δική της τάξη, το δικό της χώρο µνήµης και τη δική της οµάδα µεταβλητών. Εάν για παράδειγµα χρησιµοποιήσουµε την εντολή mpirun np 2 example.exe όπου example.exe είναι το όνοµα του εκτελέσιµου αρχείου τότε θα λάβει χώρα δηµιουργία δύο διεργασιών η πρώτη εκ των οποίων θα έχει τάξη ίση µε το µηδέν, ενώ η δεύτερη θα έχει τάξη ίση µε 1. Εποµένως, λαµβάνοντας υπ όψιν πως ο κώδικας του ανωτέρω παραδείγµατος θα εκτελεστεί δύο φορές µια για την κάθε διεργασία είναι προφανές πως στην περίπτωση της πρώτης διεργασίας (που έχει τιµή τάξης ίση µε το µηδέν) θα εκτελεστεί η οµάδα εντολών που αντιστοιχεί στη

19 Παράλληλα και Κατανεµηµένα Συστήµατα 19 συνθήκη ελέγχου if (rank==0), ενώ στην περίπτωση της δεύτερης διεργασίας (που έχει τιµή τάξης ίση µε 1) θα εκτελεστεί η οµάδα εντολών που αντιστοιχεί στη συνθήκη ελέγχου if (rank==1). Με τον τρόπο αυτό είναι δυνατή η χρήση διαφορετικών συναρτήσεων και η υλοποίηση διαφορετικών διαδικασιών για κάθε µια από τις διεργασίες του συστήµατος, ανάλογα µε την τιµή της τάξης η οποία αποδίδεται σε αυτές από το περιβάλλον του MPI. Ας περάσουµε τώρα στο είδος της διαδικασίας που υλοποιείται σε κάθε περίπτωση. Στην περίπτωση της διεργασίας µε τιµή τάξης ίση µε το µηδέν, λαµβάνει χώρα αποστολή ενός απλού χαρακτήρα στη διεργασία µε τάξη 1, και λήψη ενός απλού χαρακτήρα από την εν λόγω διεργασία. Με εντελώς ανάλογο τρόπο, η διεργασία µε τάξη ίση 1, διαβάζει ένα απλό χαρακτήρα από τη διεργασία µε τάξη µηδέν, και κατόπιν αποστέλλει σε αυτή, το δικό της απλό χαρακτήρα. Εποµένως το παραπάνω πρόγραµµα το µόνο που κάνει είναι να δηµιουργεί δύο διεργασίες οι οποίες ανταλλάσσουν υπό τη µορφή µηνύµατος ένα απλό χαρακτήρα. Στο παράδειγµα του παραπάνω κώδικα η ετικέτα του µηνύµατος είναι µία παράµετρος που δεν µας ενδιαφέρει και για το λόγο αυτό χρησιµοποιείται η σταθερά MPI_ANY_TAG. Όσον αφορά τον Communicator δια µέσου του οποίου επικοινωνούν οι δύο διεργασίες, αυτός είναι ο προεπιλεγµένος Communicator που ταυτοποιείται από τον κωδικό MPI_COMM_WORLD. Στο τελευταίο βήµα της διαδικασίας καλούµε κατά τα γνωστά τη συνάρτηση MPI_Finalize για να τερµατίσει το περιβάλλον του MPI και παράλληλα ολοκληρώνουµε τη λειτουργία της συνάρτησης main µε την εντολή return (0). Ας περάσουµε τώρα σε ένα δεύτερο παράδειγµα χρήσης των συναρτήσεων του MPI. Για να το κάνουµε αυτό ας υποθέσουµε πως διαθέτουµε ένα πλήθος Ν διεργασιών οι οποίες έχουν τάξεις µε τιµές από 0 έως Ν-1. Από αυτές τις διεργασίες, αυτή που έχει τάξη όση µε το µηδέν, διαβάζει από το πληκτρολόγιο ένα θετικό αριθµό και στη συνέχεια τον αποστέλλει σε όλες τις διεργασίες που υπάρχουν στο σύστηµα. Η κάθε µια από αυτές τις διεργασίες, παραλαµβάνει τον εν λόγω αριθµό και εκτυπώνει την τιµή του µαζί µε την τάξη της. Αυτή η διαδικασία συνεχίζεται µέχρι ο χρήστης καταχωρήσει από το πληκτρολόγιο ένα αρνητικό αριθµό. Ο πηγαίος κώδικας που υλοποιεί την παραπάνω διαδικασία, παρουσιάζεται στη συνέχεια. #include <stdio.h> #include <mpi.h> int main (int argc, char * argv[]) { int rank, input; MPI_Init (&argc, &argv); MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); do { if (rank==0) scan f("enter input value : %d", &input); MPI_Bcast (&input, 1, MPI_INT, 0, MPI_COMM_WORLD ); printf ( "Process %d got input %d\n", rank, input);

20 Το περιβάλλον προγραµµατισµού MPI 20 MPI_Finalize (); return (0); } } while (input>=0); Στον παραπάνω κώδικα παρουσιάζεται ένα ακόµη παράδειγµα διαφοροποίησης της διαδικασίας που πραγµατοποιείται µέσα σε κάποια διεργασία, µε κριτήριο την τιµή της τάξης της: εάν η τάξη της τρέχουσας διεργασίας είναι ίση µε το µηδέν, τότε η διεργασία αυτή είναι και εκείνη που θα αναλάβει να διαβάσει από το πληκτρολόγιο την τιµή που καταχωρεί ο χρήστης. Στη συνέχεια η εν λόγω τιµή διαβιβάζεται σε όλες τις υπόλοιπες διεργασίες του συστήµατος, οι οποίες την διαβάζουν και την εκτυπώνουν µαζί µε την τιµή της τάξης τους. Οι υπόλοιπες συναρτήσεις του MPI που χρησιµοποιούνται στο παραπάνω κώδικα είναι οι MPI_Init και MPI_Finalize που χρησιµοποιούνται για την αρχικοποίηση και τον τερµατισµό της λειτουργίας του MPI, καθώς και η συνάρτηση MPI_Comm_rank που επιστρέφει την τάξη της τρέχουσας διεργασίας. Η νέα συνάρτηση που εµφανίζεται για πρώτη φορά στην παρούσα ανάλυση, είναι η συνάρτηση MPI_Bcast η οποία αποτελεί και το πρώτο παράδειγµα συλλογικής επικοινωνίας. Η συνάρτηση αυτή αποστέλλει το µήνυµα κάποιας διεργασίας, σε όλες τις διεργασίες του συστήµατος, και εποµένως η διαδικασία που λαµβάνει χώρα δια της χρήσεως αυτής της συνάρτησης, είναι µια διαδικασία εκποµπής της πληροφορίας. Η σύνταξη αυτής της συνάρτησης έχει τη µορφή MPI_Bcast (void * buffer, int count, MPI_Datatype datatype, int srcrank, MPI_Comm comm). Από τα πέντε ορίσµατα που δέχεται η εν λόγω συνάρτηση, τα τρία πρώτα ορίσµατα χρησιµοποιούνται για τον καθορισµό των χαρακτηριστικών του µηνύµατος, και πιο συγκεκριµένα της διεύθυνσης µνήµης που περιέχει τα δεδοµένα προς αποστολή, καθώς επίσης το πλήθος και τον τύπο αυτών των δεδοµένων. Το τέταρτο όρισµα της συνάρτησης αναφέρεται στην τάξη της διεργασίας που εκπέµπει το µήνυµα (source rank). Η πληροφορία αυτή είναι αρκετή για να περιγράψει πλήρως τη διαδικασία της επικοινωνίας δεδοµένου πως το µήνυµα θα αποσταλεί σε όλες τις διεργασίες, δεν απαιτείται ο καθορισµός της τάξης της διαδικασίας παραλήπτη. Το τελευταίο όρισµα της συνάρτησης MPI_Bcast αναφέρεται στον Communicator στον οποίο ανήκουν οι παραπάνω διεργασίες. Εάν δεν έχουµε ορίσει κάποιον άλλο Communicator, τότε χρησιµοποιείται ο προεπιλεγµένος Communicator MPI_COMM_WORLD. Παράδειγµα χρήσης της συνάρτησης MPI_Bcast είναι η κλήση της µε τη µορφή MPI_Bcasr (&a, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD) η οποία επιτρέπει την εκποµπή της τιµής της πραγµατικής µεταβλητής a από τη διεργασία µε τιµή τάξης 0 σε όλες τις διεργασίες του συστήµατος. Ας σηµειωθεί πως µετά τον τερµατισµό της λειτουργίας αυτής της συνάρτησης, όλες οι ενδιάµεσες µνήµες των διεργασιών της εφαρµογής έχουν τα ίδια περιεχόµενα αυτό σηµαίνει πως δεν είναι αναγκαία η χρήση της συνάρτησης MPI_Recv για την παραλαβή του µηνύµατος, καθώς αυτό έχει ήδη αναγνωσθεί. Επιστρέφοντας στο παραπάνω παράδειγµα, δεν είναι δύσκολο να καταλάβουµε πως εκείνο που κάνει η συνάρτηση MPI_Bcast είναι να εκπέµπει προς όλες τις διεργασίες του συστήµατος την τιµή της µεταβλητής input η οποία διαβάστηκε από το πληκτρολόγιο από τη διεργασία µε τιµή τάξης ίση µε το µηδέν. Εάν δηµιουργήσουµε το εκτελέσιµο αρχείο και στη συνέχεια δηµιουργήσουµε 5

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών

ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών Υπολογισμός με βάση το πέρασμα μηνυμάτων Προγραμματισμός με πέρασμα μηνυμάτων ύο μηχανισμοί απαιτούνται: 1. Μία μέθοδος για τη δημιουργία διεργασιών που θα εκτελούνται σε διαφορετικούς υπολογιστές. 2.

Διαβάστε περισσότερα

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

Διαβάστε περισσότερα

Ανάπτυξη και Σχεδίαση Λογισμικού

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 1: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

Διαβάστε περισσότερα

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας Ενότητα 1: OpenMPI Δρ. Μηνάς Δασυγένης mdasyg@ieee.org Εργαστήριο Ψηφιακών Συστημάτων και Αρχιτεκτονικής

Διαβάστε περισσότερα

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ Σκοπός της Άσκησης Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η ανάλυση των βασικών χαρακτηριστικών της Γλώσσας

Διαβάστε περισσότερα

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD

ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD ΗΜΙΟΥΡΓΙΑ ΙΣΤΟΣΕΛΙ ΑΣ ΣΤΟ MICROSOFT WORD Σε ορισµένες περιπτώσεις είναι ιδιαίτερα χρήσιµη η δηµιουργία ιστοσελίδων ενηµερωτικού περιεχοµένου οι οποίες στη συνέχεια µπορούν να δηµοσιευθούν σε κάποιο τόπο

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

Διαβάστε περισσότερα

Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 3.5-3.6, 3.2: Συναρτήσεις II ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 12-1 Ανασκόπηση οµής Προγράµµατος µε Συναρτήσεις #include 1 void PrintMessage (); Πρότυπο ( ήλωση) Συνάρτησης (

Διαβάστε περισσότερα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr Η έννοια της διεργασίας ιεργασία (process) είναι ο µηχανισµός εκτέλεσης ενός προγράµµατος σε ένα λειτουργικό σύστηµα. Η διεργασία είναι µια ενεργή

Διαβάστε περισσότερα

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

Διαβάστε περισσότερα

1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++

1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ Email: liliadis@fmenr.duth.gr 1. ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ Τα προγράµµατα αποτελούνται από εντολές οι οποίες γράφονται σε έναν απλό επεξεργαστή που προσφέρει και το Περιβάλλον της Visual C++. Οι εντολές

Διαβάστε περισσότερα

Προγραμματισμό για ΗΜΥ

Προγραμματισμό για ΗΜΥ ΕΠΛ 34: Εισαγωγή στον Προγραμματισμό για ΗΜΥ Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy Κεφάλαιο 12 Πίνακες εικτών (Pointers Arrays) Θέματα ιάλεξης Στην ενότητα

Διαβάστε περισσότερα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

Διαβάστε περισσότερα

Εισαγωγή στην γλώσσα προγραμματισμού C

Εισαγωγή στην γλώσσα προγραμματισμού C Εισαγωγή στην γλώσσα προγραμματισμού C Χαρακτηριστικά της C Ιδιαίτερα δημοφιλής Έχει χρησιμοποιηθεί για τον προγραμματισμό ευρέος φάσματος συστημάτων και εφαρμογών Γλώσσα μετρίου επιπέδου Φιλοσοφία: Ο

Διαβάστε περισσότερα

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος 2009-2010. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος 2009-2010. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Είσοδος/Έξοδος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2009-2010 Είσοδος/Έξοδος Μέχρι τώρα όποτε θέλαμε να διαβάσουμε χρησιμοποιούσαμε πάντα

Διαβάστε περισσότερα

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας Το επίπεδο προτεραιότητας µιας διεργασίας µπορεί να αλλάξει µε χρήση της συνάρτησης nice. Κάθε διεργασία διαθέτει µια τιµή που καλείται

Διαβάστε περισσότερα

Ενδεικτική περιγραφή μαθήματος

Ενδεικτική περιγραφή μαθήματος ΜΑΘΗΜΑ: ΔΙΔΑΣΚΩΝ: ΤΜΗΜΑ: Προγραμματισμός Η/Υ Συνδουκάς Δημήτριος Διοίκησης Επιχειρήσεων (Γρεβενά) Ενδεικτική περιγραφή μαθήματος 1. Εισαγωγή: Εισαγωγή στον προγραμματισμό, γλώσσες προγραμματισμού, μεταγλωτιστές.

Διαβάστε περισσότερα

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19) Κεφάλαιο 8.7 Πολυδιάστατοι Πίνακες (Διάλεξη 19) Πολυδιάστατοι πίνακες Μέχρι τώρα μιλούσαμε για Μονοδιάστατους Πίνακες. ή π.χ. int age[5]= {31,28,31,30,31; για Παράλληλους πίνακες, π.χ. int id[5] = {1029,1132,1031,9991,1513;

Διαβάστε περισσότερα

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο 2009 2010

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο 2009 2010 Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο 2009 2010 Καθηγητής. Γουνόπουλος Άσκηση 1 Σκοπός της εργασίας αυτής είναι η κατανόηση της εσωτερικής λειτουργίας

Διαβάστε περισσότερα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Δυναμική Διαχείριση Μνήμης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Ανάγκη για Δυναμική Μνήμη Στατική Μνήμη Μέχρι τώρα χρησιμοποιούσαμε

Διαβάστε περισσότερα

a = 10; a = k; int a,b,c; a = b = c = 10;

a = 10; a = k; int a,b,c; a = b = c = 10; C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 4 ο Τελεστές Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Ο τελεστής εκχώρησης = Ο τελεστής = χρησιµοποιείται για την απόδοση τιµής (ή αλλιώς ανάθεση τιµής) σε µία µεταβλητή Π.χ.

Διαβάστε περισσότερα

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Aντώνης Σπυρόπουλος v2_061015 Οροι που

Διαβάστε περισσότερα

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής.

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής. Από το βιβλίο C: Βήµα-Πρός-Βήµα, Κεφάλαιο 3ο Συγγραφείς: Οµάδα Waite, Mitchell Waite και Stephen Prata Εκδότης: Μ. Γκιούρδας Ανατύπωση σε ηλεκτρονική µορφή: Αλέξανδρος Στεφανίδης 3.4 Τύποι εδοµένων τής

Διαβάστε περισσότερα

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης Γλώσσες Προγραμματισμού Εργαστήριο 2ο Τύποι Δεδομένων - Είσοδος / Έξοδος Εργαστήριο 2ο Περίγραμμα Εργαστηριακής Άσκησης Εργαστήριο 2ο...1 Θεωρία εργαστηρίου...2 Τύποι δεδομένων...2 Η συνάρτηση printf()...3

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Ενότητα 14 Δυναμική διαχείριση μνήμης Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων Στατική δέσμευση μνήμης Με τη δήλωση απλών μεταβλητών

Διαβάστε περισσότερα

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προχωρημένα Θέματα Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ανακατεύθυνση Εισόδου/Εξόδου Συνήθως η τυπική είσοδος ενός προγράμματος (stdin) προέρχεται

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή Στο εργαστήριο αυτό θα μάθουμε για τη χρήση συναρτήσεων με σκοπό την κατασκευή αυτόνομων τμημάτων προγραμμάτων που υλοποιούν μία συγκεκριμένη διαδικασία, τα οποία

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 5 η Η σειριακή επικοινωνία ΙΙ 1.1 ΣΚΟΠΟΣ Σκοπός της άσκησης αυτής είναι η κατανόηση σε βάθος των λειτουργιών που παρέχονται από το περιβάλλον LabView για τον χειρισµό της σειριακής επικοινωνίας

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΡΓΑΣΤΗΡΙΟ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ ΜΕΡΟΣ ΠΕΜΠΤΟ Triggers, Stored procedures Γιώργος Μαρκοµανώλης Περιεχόµενα Triggers-Ενηµέρωση δεδοµένων άλλων πινάκων... 1 Ασφάλεια...

Διαβάστε περισσότερα

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον

Διαβάστε περισσότερα

ΑΝΑΖΗΤΗΣΗ ΣΕ ΗΛΕΚΤΡΟΝΙΚΕΣ ΒΙΒΛΙΟΘΗΚΕΣ

ΑΝΑΖΗΤΗΣΗ ΣΕ ΗΛΕΚΤΡΟΝΙΚΕΣ ΒΙΒΛΙΟΘΗΚΕΣ ΑΝΑΖΗΤΗΣΗ ΣΕ ΗΛΕΚΤΡΟΝΙΚΕΣ ΒΙΒΛΙΟΘΗΚΕΣ Μία από τις πιο σηµαντικές υπηρεσίες που προσφέρει το διαδίκτυο στην επιστηµονική κοινότητα είναι η αποµακρυσµένη πρόσβαση των χρηστών σε ηλεκτρονικές βιβλιοθήκες

Διαβάστε περισσότερα

ΤΕΙ Κρήτης, Παράρτηµα Χανίων

ΤΕΙ Κρήτης, Παράρτηµα Χανίων ΠΣΕ, Τµήµα Τηλεπικοινωνιών & ικτύων Η/Υ Εργαστήριο ιαδίκτυα & Ενδοδίκτυα Η/Υ ( ηµιουργία συστήµατος µε ροint-tο-ροint σύνδεση) ρ Θεοδώρου Παύλος Χανιά 2003 Περιεχόµενα 1 ΕΙΣΑΓΩΓΗ...2 2 ΤΟ ΚΑΝΑΛΙ PΟINT-TΟ-PΟINT...2

Διαβάστε περισσότερα

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη Επιλογή και επανάληψη Η ύλη που αναπτύσσεται σε αυτό το κεφάλαιο είναι συναφής µε την ύλη που αναπτύσσεται στο 2 ο κεφάλαιο. Όπου υπάρχουν διαφορές αναφέρονται ρητά. Προσέξτε ιδιαίτερα, πάντως, ότι στο

Διαβάστε περισσότερα

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ

7.5 Πρωτόκολλο IP. Τεχνολογία ικτύων Επικοινωνιών ΙΙ Τεχνολογία ικτύων Επικοινωνιών ΙΙ 7.5 Πρωτόκολλο IP 38. Τι είναι το πρωτόκολλο ιαδικτύου (Internet Protocol, IP); Είναι το βασικό πρωτόκολλο του επιπέδου δικτύου της τεχνολογίας TCP/IP. Βασίζεται στα αυτοδύναµα

Διαβάστε περισσότερα

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή Δημιουργία Νέου αρχείου Από το μενού προγραμμάτων ανοίγετε το DEV C++ Επιλέγετε File-> New-> Source File (συντόμευση πληκτρολογίου Ctrl+N)

Διαβάστε περισσότερα

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008 Παράδειγμα: Μηχανή για Εισιτήρια 2 Ορισμός Κλάσεων Σύνταξη κλάσης: πεδία, κατασκευαστές, μέθοδοι Ένας αυτόματος εκδότης εισιτηρίων είναι μια μηχανή που δέχεται χρήματα και εκδίδει ένα εισιτήριο. Εκδίδει

Διαβάστε περισσότερα

Κ. ΒΑΣΙΛΑΚΗΣ Γ. ΛΕΠΟΥΡΑΣ

Κ. ΒΑΣΙΛΑΚΗΣ Γ. ΛΕΠΟΥΡΑΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΛΟΠΟΝΝΗΣΟΥ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΣΗΜΕΙΩΣΕΙΣ ΓΙΑ ΤΗ ΓΛΩΣΣΑ C Κ. ΒΑΣΙΛΑΚΗΣ Γ. ΛΕΠΟΥΡΑΣ - 1 - ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ 1. ΣΥΓΓΡΑΦΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ C 1 2. ΤΙ ΕΙΝΑΙ ΕΝΑ ΠΡΟΓΡΑΜΜΑ

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΒΙΟΜΗΧΑΝΙΚΗΣ ΙΟΙΚΗΣΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΒΙΟΜΗΧΑΝΙΚΗΣ ΙΟΙΚΗΣΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΤΜΗΜΑ ΒΙΟΜΗΧΑΝΙΚΗΣ ΙΟΙΚΗΣΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΙΑΧΕΙΡΙΣΗ Ε ΟΜΕΝΩΝ ΚΑΙ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ (Β ΕΞΑΜΗΝΟ) ιδάσκων: Επ. Καθηγητής Γρηγόρης Χονδροκούκης ΣΗΜΕΙΩΣΕΙΣ ΜΑΘΗΜΑΤΟΣ Η ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διαβάστε περισσότερα

Αποµακρυσµένη κλήση διαδικασιών

Αποµακρυσµένη κλήση διαδικασιών Αποµακρυσµένηκλήση διαδικασιών Τοπική κλήση διαδικασιών Αποµακρυσµένη κλήση διαδικασιών Μεταβίβαση παραµέτρων Πρωτόκολλα επικοινωνίας Αντιγραφή µηνυµάτων Προδιαγραφές διαδικασιών RPC στο σύστηµα DCE Κατανεµηµένα

Διαβάστε περισσότερα

Κεφάλαιο 5ο: Εντολές Επανάληψης

Κεφάλαιο 5ο: Εντολές Επανάληψης Χρήστος Τσαγγάρης ΕΕ ΙΠ Τµήµατος Μαθηµατικών, Πανεπιστηµίου Αιγαίου Κεφάλαιο 5ο: Εντολές Επανάληψης Η διαδικασία της επανάληψης είναι ιδιαίτερη συχνή, αφού πλήθος προβληµάτων µπορούν να επιλυθούν µε κατάλληλες

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Ενότητα 13 Αρχεία Πανεπιστήμιο Αιγαίου Τμήμα Μηχανικών Πληροφοριακών και Επικοινωνιακών Συστημάτων Αρχεία Συλλογές δεδομένων Αποθηκεύονται στην περιφερειακή μνήμη π.χ. σκληρός

Διαβάστε περισσότερα

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM). Μνήμες Ένα από τα βασικά πλεονεκτήματα των ψηφιακών συστημάτων σε σχέση με τα αναλογικά, είναι η ευκολία αποθήκευσης μεγάλων ποσοτήτων πληροφοριών, είτε προσωρινά είτε μόνιμα Οι πληροφορίες αποθηκεύονται

Διαβάστε περισσότερα

Μεταφραστής (Compiler)

Μεταφραστής (Compiler) Windows Καθαρισµος οθονης cls Unix clear Τελεστες ανακατευθυνσης > > >> >> < < Εντολες σε αρχεια * * (wild card) del Α rm Α ιαγραφη type Α cat Α Εµφανιση copy Α Β cp Α Β Αντιγραφη ren Α Β mv Α Β Αλλαγη

Διαβάστε περισσότερα

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα 1. Ποια είναι η σχέση της έννοιας του μικροεπεξεργαστή με αυτή του μικροελεγκτή; Α. Ο μικροεπεξεργαστής εμπεριέχει τουλάχιστο έναν μικροελεγκτή. Β. Ο

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 4: Τύποι Δεδομένων και τελεστές Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

Διαβάστε περισσότερα

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες 0x375 - Thessaloniki Tech Talks Sessions Event 0x2 19 Μαρτίου 2010 Περιεχόμενα 1 Εισαγωγή 2 Η κλήση συστήματος ptrace 3 Νήματα 4 Το πρόγραμμα εισαγωγής κώδικα prez 5 Επίλογος Γιατί; Πολλές φορές θέλουμε

Διαβάστε περισσότερα

Επανάληψη για τις Τελικές εξετάσεις

Επανάληψη για τις Τελικές εξετάσεις Επανάληψη για τις Τελικές εξετάσεις ( ιάλεξη 21) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Εισαγωγή Το µάθηµα EPL032 έχει ως βασικό στόχο την επίλυση προβληµάτων πληροφορικής µε την χρήση της γλώσσας προγραµµατισµού

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

Διαβάστε περισσότερα

Παράλληλη Επεξεργασία

Παράλληλη Επεξεργασία Παράλληλη Επεξεργασία Φροντιστήριο: Εισαγωγή στο OpenMP Εργαστήριο Πληροφοριακών Συστημάτων Υψηλής Επίδοσης Parallel and Distributed Systems Group Τι είναι το OpenMP Πρότυπο Επέκταση στη C/C++ και τη Fortran

Διαβάστε περισσότερα

Το Ηλεκτρονικό Ταχυδροµείο (e-mail) είναι ένα σύστηµα που δίνει την δυνατότητα στον χρήστη να ανταλλάξει µηνύµατα αλλά και αρχεία µε κάποιον άλλο

Το Ηλεκτρονικό Ταχυδροµείο (e-mail) είναι ένα σύστηµα που δίνει την δυνατότητα στον χρήστη να ανταλλάξει µηνύµατα αλλά και αρχεία µε κάποιον άλλο Το Ηλεκτρονικό Ταχυδροµείο (e-mail) είναι ένα σύστηµα που δίνει την δυνατότητα στον χρήστη να ανταλλάξει µηνύµατα αλλά και αρχεία µε κάποιον άλλο χρήστη µέσω υπολογιστή άνετα γρήγορα και φτηνά. Για να

Διαβάστε περισσότερα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα ΝΗΜΑΤΑ ΣΤΗ JAVA (1) Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα πρόγραµµα. Αιτία Η δυνατότητα αποµόνωσης (ή αυτονόµησης) κάποιων

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 1. Structural Programming

ΑΣΚΗΣΗ 1. Structural Programming ΑΣΚΗΣΗ 1 Structural Programming Στην άσκηση αυτή θα υλοποιήσετε σε C ένα απλό πρόγραµµα Βάσης εδοµένων το οποίο θα µπορούσε να χρησιµοποιηθεί από την γραµµατεία ενός πανεπιστηµίου για την αποθήκευση και

Διαβάστε περισσότερα

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα για τη γλώσσα C: τον gcc μεταγλωττιστή της C σε περιβάλλον

Διαβάστε περισσότερα

Είναι πολύ πιθανό να παραξενευτείτε βλέποντας σύµβολα όπως { και *ptr++.

Είναι πολύ πιθανό να παραξενευτείτε βλέποντας σύµβολα όπως { και *ptr++. 2 Εισαγωγή στη C Από το βιβλίο C: Βήµα-Πρός-Βήµα, Κεφάλαιο 2 ο Συγγραφείς: Οµάδα Waite, Mitchell Waite και Stephen Prata Εκδότης: Μ. Γκιούρδας Ανατύπωση σε ηλεκτρονική µορφή: Αλέξανδρος Στεφανίδης Είναι

Διαβάστε περισσότερα

Εισαγωγή στις Συναρτήσεις

Εισαγωγή στις Συναρτήσεις Εισαγωγή στις Συναρτήσεις Η φιλοσοφία σχεδίασης της C βασίζεται στη χρήση των συναρτήσεων. Έχουμε ήδη δει και χρησιμοποιήσει πολλές συναρτήσεις που έχει το σύστημα, όπως είναι οι printf(), scanf(),αλλά

Διαβάστε περισσότερα

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5.1 Εισαγωγή στους αλγορίθμους 5.1.1 Εισαγωγή και ορισμοί Αλγόριθμος (algorithm) είναι ένα πεπερασμένο σύνολο εντολών οι οποίες εκτελούν κάποιο ιδιαίτερο έργο. Κάθε αλγόριθμος

Διαβάστε περισσότερα

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) Pascal- Εισαγωγή Η έννοια του προγράμματος Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει, όπως έχει ήδη αναφερθεί, τρία εξίσου

Διαβάστε περισσότερα

6. Εισαγωγή στον προγραµµατισµό

6. Εισαγωγή στον προγραµµατισµό 6. Εισαγωγή στον προγραµµατισµό 6.1 Η έννοια του προγράµµατος. 6.2 Ιστορική αναδροµή. 6.2.1 Γλώσσες µηχανής. ΗΜ04-Θ1Α 1. Ένα πρόγραµµα σε γλώσσα µηχανής είναι µια ακολουθία δυαδικών ψηφίων. 5. Ένα πρόγραµµα

Διαβάστε περισσότερα

Επιµέλεια Θοδωρής Πιερράτος

Επιµέλεια Θοδωρής Πιερράτος Εισαγωγή στον προγραµµατισµό Η έννοια του προγράµµατος Ο προγραµµατισµός ασχολείται µε τη δηµιουργία του προγράµµατος, δηλαδή του συνόλου εντολών που πρέπει να δοθούν στον υπολογιστή ώστε να υλοποιηθεί

Διαβάστε περισσότερα

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ Σκοπός του μαθήματος Σκοπός του παρόντος μαθήματος είναι να μάθετε να κάνετε εισαγωγή δεδομένων σε πίνακες και περαιτέρω επεξεργασία

Διαβάστε περισσότερα

ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 1.3-1.4: Εισαγωγή Στον Προγραµµατισµό ( ιάλεξη 2) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Περιεχόµενα Εισαγωγικές Έννοιες - Ορισµοί Ο κύκλος ανάπτυξης προγράµµατος Παραδείγµατα Πότε χρησιµοποιούµε υπολογιστή?

Διαβάστε περισσότερα

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου. ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 2.6: Είσοδος / Έξοδος εδοµένων, Μορφοποίηση εδοµένων Εξόδου ( ιάλεξη 7) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 1 Είσοδος/ Έξοδος Σε σχεδόν όλα τα προγράµµατα πρέπει να πάρουµε κάποια δεδοµένα και να δώσουµε

Διαβάστε περισσότερα

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή 1. Ηλεκτρονικός Υπολογιστής Ο Ηλεκτρονικός Υπολογιστής είναι μια συσκευή, μεγάλη ή μικρή, που επεξεργάζεται δεδομένα και εκτελεί την εργασία του σύμφωνα με τα παρακάτω

Διαβάστε περισσότερα

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Προεπεξεργαστής Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Διαδικασία Μεταγλώττισης πρόγραµµα επεξεργασίας κειµένου if a

Διαβάστε περισσότερα

Εισαγωγή στον Προγραμματισμό

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις. 1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 5η Ιστοσελίδα του µαθήµατος 2 http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα

Διαβάστε περισσότερα

2. Εντολές Εισόδου - Ο Επαναληπτικός Βρόγχος for - Χαρακτήρες διαφυγής

2. Εντολές Εισόδου - Ο Επαναληπτικός Βρόγχος for - Χαρακτήρες διαφυγής 2. Εντολές Εισόδου - Ο Επαναληπτικός Βρόγχος for - Χαρακτήρες διαφυγής Εισαγωγή Αφού είδαµε γραµµή - γραµµή πως θα εκτελεσθεί το πρόγραµµα 2, θα δούµε τώρατοπρόγραµµα στην ολότητά του, τί ακριβώς κάνει

Διαβάστε περισσότερα

Outlook Express-User Instructions.doc 1

Outlook Express-User Instructions.doc 1 Οδηγίες προς τους υπαλλήλους του ήµου Θεσσαλονίκης για την διαχείριση της ηλεκτρονικής τους αλληλογραφίας µε το Outlook Express (Ver 1.0 22-3-2011) (Για οποιοδήποτε πρόβληµα ή απορία επικοινωνήστε µε τον

Διαβάστε περισσότερα

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Συναρτήσεις εισόδου/εξόδου, τελεστές Η συνάρτηση scanf() είσοδος δεδομένων Διαβάζει από το πληκτρολόγιο (stdin) μορφοποιημένες τιμές μεταβλητών. scanf (ΣΕΙΡΑ_ΕΛΕΓΧΟΥ, δείκτης_μεταβλητής-1,

Διαβάστε περισσότερα

Προγραμματισμός Ι. Πολλαπλά Αρχεία. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Πολλαπλά Αρχεία. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Προγραμματισμός Ι Πολλαπλά Αρχεία Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Πολλαπλά Αρχεία Όταν γράφουμε μεγάλα προγράμματα θέλουμε να έχουμε ανεξάρτητα κομμάτια κώδικα

Διαβάστε περισσότερα

Κεφάλαιο 2.1-2.4: Εισαγωγή στην C. ( ιαλέξεις 3-4) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 2.1-2.4: Εισαγωγή στην C. ( ιαλέξεις 3-4) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 2.1-2.4: Εισαγωγή στην C ( ιαλέξεις 3-4) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Περιεχόµενα Εισαγωγή στην C: Σύνταξη και Σηµασιολογία σχόλια µεταβλητές και σταθερές τύποι δεδοµένων Μετά αυτές τις δυο διαλέξεις

Διαβάστε περισσότερα

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ΠΛΗ111. Ανοιξη 2005. Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης ΠΛΗ111 οµηµένος Προγραµµατισµός Ανοιξη 2005 Μάθηµα 3 ο Συνδεδεµένες Λίστες Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης Ανασκόπηση ΟΑΤ λίστα Ακολουθιακή λίστα Συνδεδεµένη λίστα

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 7.1. Ανάπτυξη Προγράµµατος Τι είναι το Πρόγραµµα; Το Πρόγραµµα: Είναι ένα σύνολο εντολών για την εκτέλεση ορισµένων λειτουργιών από τον υπολογιστή.

Διαβάστε περισσότερα

Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7. Ασκήσεις στο IP Fragmentation

Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7. Ασκήσεις στο IP Fragmentation Συνοπτική Μεθοδολογία Ασκήσεων Κεφαλαίου 7 Οι σημειώσεις που ακολουθούν περιγράφουν τις ασκήσεις που θα συναντήσετε στο κεφάλαιο 7. Η πιο συνηθισμένη και βασική άσκηση αναφέρεται στο IP Fragmentation,

Διαβάστε περισσότερα

Περιπτώσεις αλλαγής Λογιστικού Σχεδίου.

Περιπτώσεις αλλαγής Λογιστικού Σχεδίου. Μετατροπή Κωδικοποίησης Λογιστικού Σχεδίου Παράµετρος & Προτιµήσεις Εργασίες Έναρξης Οικονοµικές Χρήσεις Μετατροπή Κωδικοποίησης Λογιστικού Σχεδίου Μέσω της εργασίας αυτής, αναλύεται ο τρόπος µε τον οποίο

Διαβάστε περισσότερα

Η ΕΝΝΟΙΑ ΤΟΥ Ε ΟΜΕΝΟΥ ΚΑΙ ΤΟΥ ΤΥΠΟΥ Ε ΟΜΕΝΩΝ

Η ΕΝΝΟΙΑ ΤΟΥ Ε ΟΜΕΝΟΥ ΚΑΙ ΤΟΥ ΤΥΠΟΥ Ε ΟΜΕΝΩΝ Κεφάλαιο 1 Εισαγωγή Στο κεφάλαιο αυτό παρουσιάζεται µια συνοπτική εισαγωγή στη θεωρία των βάσεων δεδοµένων και των συστηµάτων διαχείρισης βάσεων δεδοµένων, προκειµένου ο αναγνώστης να κατανοήσει τις βασικές

Διαβάστε περισσότερα

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 5 ο Έλεγχος Προγράµµατος Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Η εντολή if (Ι) Η εντολή if είναι µία από τις βασικότερες δοµές ελέγχου ροής στη C, αλλά και στις περισσότερες

Διαβάστε περισσότερα

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Οργάνωση Προγράµµατος Header Files Μετάφραση και σύνδεση αρχείων προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΘΕΜΑ 1 ο : Α. Να αναφέρετε ονομαστικά τις βασικές λειτουργίες (πράξεις) επί των δομών δεδομένων. Μονάδες 8 Β. Στον

Διαβάστε περισσότερα

Διάλεξη 5η: Εντολές Επανάληψης

Διάλεξη 5η: Εντολές Επανάληψης Διάλεξη 5η: Εντολές Επανάληψης Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Εντολές Επανάληψης CS100, 2015-2016

Διαβάστε περισσότερα

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5 Περιεχόµενα 1 Εισαγωγή στις οµές εδοµένων 3 2 Στοίβα (Stack) 5 i ΠΕΡΙΕΧΟΜΕΝΑ ΠΕΡΙΕΧΟΜΕΝΑ ii Πληροφορίες Εργαστηρίου Σκοπός του εργαστηρίου Το εργαστήριο οµές εδοµένων αποσκοπεί στην εφαρµογή των τεχνολογιών

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕ ΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραµµατισµού C ΕΡΓΑΣΤΗΡΙΟ 1: Εισαγωγή στην C Βασικά στοιχεία 24 Απριλίου 2015 Το σηµερινό

Διαβάστε περισσότερα

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε) Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2015-16 Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, και Ε/Ε) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι

Διαβάστε περισσότερα

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΝΕΥΡΩΝΙΚΑ ΙΚΤΥΑ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΝΕΥΡΩΝΙΚΑ ΙΚΤΥΑ ΘΕΜΑ 1 ο (2.5 µονάδες) ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΝΕΥΡΩΝΙΚΑ ΙΚΤΥΑ Τελικές εξετάσεις 21 Σεπτεµβρίου 2004 ιάρκεια: 3 ώρες Το παρακάτω σύνολο

Διαβάστε περισσότερα

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Εισαγωγή στην Επιστήμη των Υπολογιστών 2014-15 Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, και Ε/Ε) http://di.ionio.gr/~mistral/tp/csintro/ Μ.Στεφανιδάκης Τι είναι

Διαβάστε περισσότερα

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program)

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program) Μεταφραστές Εισαγωγή (source program) Τελικό πρόγραµµα (object program) Γιώργος Μανής Γλώσσες Είδη Μεταγλωττιστών Αρχική γλώσσα Γλώσσα υλοποίησης Τελική γλώσσα Απλοί µεταγλωττιστές Αντίστροφοι µεταγλωττιστές

Διαβάστε περισσότερα

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κεφάλαιο 2 Επιμέλεια: Βασίλης Παλιουράς, Αναπληρωτής Καθηγητής Ευάγγελος Δερματάς, Αναπληρωτής Καθηγητής Σταύρος Νούσιας, Βοηθός Ερευνητή Πολυτεχνική Σχολή Τμήμα Ηλεκτρολόγων Μηχανικών

Διαβάστε περισσότερα

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών Οργάνωση Υπολογιστών Υπολογιστικό Σύστημα Λειτουργικό Σύστημα Αποτελεί τη διασύνδεση μεταξύ του υλικού ενός υπολογιστή και του χρήστη (προγραμμάτων ή ανθρώπων). Είναι ένα πρόγραμμα (ή ένα σύνολο προγραμμάτων)

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων

ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων ΚΕΦΑΛΑΙΟ 2: Χειρισµός εδοµένων 2.1 Αρχιτεκτονική Υπολογιστών 2.1 Αρχιτεκτονική Υπολογιστών 2.2 Γλώσσα Μηχανής 2.3 Εκτέλεση προγράµµατος 2.4 Αριθµητικές και λογικές εντολές 2.5 Επικοινωνία µε άλλες συσκευές

Διαβάστε περισσότερα

Περιεχόμενα. Πρόλογος... 17

Περιεχόμενα. Πρόλογος... 17 Περιεχόμενα Πρόλογος... 17 Κεφάλαιο 1: Εισαγωγή... 19 Πώς να διαβάσετε αυτό το βιβλίο... 20 Η γλώσσα C Ιστορική αναδρομή... 22 Τα χαρακτηριστικά της C... 23 C Μια δομημένη γλώσσα... 23 C Μια γλώσσα για

Διαβάστε περισσότερα

Ανάλυση Απαιτήσεων Απαιτήσεις Λογισµικού

Ανάλυση Απαιτήσεων Απαιτήσεις Λογισµικού ΧΑΡΟΚΟΠΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΜΑΤΙΚΗΣ Ανάλυση Απαιτήσεων Απαιτήσεις Λογισµικού Μάρα Νικολαϊδου Δραστηριότητες Διαδικασιών Παραγωγής Λογισµικού Καθορισµός απαιτήσεων και εξαγωγή προδιαγραφών

Διαβάστε περισσότερα

Βασικά Στοιχεία της Java

Βασικά Στοιχεία της Java Βασικά Στοιχεία της Java Παύλος Εφραιμίδης Java Βασικά Στοιχεία της γλώσσας Java 1 Τύποι Δεδομένων Η Java έχει δύο κατηγορίες τύπων δεδομένων: πρωτογενείς (primitive) τύπους δεδομένων αναφορές Java Βασικά

Διαβάστε περισσότερα

Γ' ΛΥΚΕΙΟΥ ΤΕΧΝΟΛΟΓΙΚΗ ΚΑΤΕΥΘΥΝΣΗ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΚΦΩΝΗΣΕΙΣ ÏÅÖÅ

Γ' ΛΥΚΕΙΟΥ ΤΕΧΝΟΛΟΓΙΚΗ ΚΑΤΕΥΘΥΝΣΗ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΚΦΩΝΗΣΕΙΣ ÏÅÖÅ 1 Γ' ΛΥΚΕΙΟΥ ΤΕΧΝΟΛΟΓΙΚΗ ΚΑΤΕΥΘΥΝΣΗ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΘΕΜΑ 1 ο ΕΚΦΩΝΗΣΕΙΣ Α. Να γράψετε στην κόλλα σας τον αριθµό καθεµιάς από τις παρακάτω προτάσεις 1 5 και δίπλα τη λέξη

Διαβάστε περισσότερα

Διαδικασιακός Προγραμματισμός

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 10 η Αλφαριθμητικά Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης

Διαβάστε περισσότερα

ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΘΕΜΑ 1 (Α) Σημειώστε δίπλα σε κάθε πρόταση «Σ» ή «Λ» εφόσον είναι σωστή ή λανθασμένη αντίστοιχα. 1. Τα συντακτικά λάθη ενός προγράμματος

Διαβάστε περισσότερα