Skip to content

A small client-server university project. It is an application that uses the unix os system calls in order to create a server that can accept connections and execute jobs.

Notifications You must be signed in to change notification settings

AntonisZks/Multithreaded-Network-JobExecutor-App

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


                                                Προγραμματισμός Συστήματος Εργασία 2

- Εκτέλεση της Εφαρμογής:

        Η παρούσα εργασία έχει δημιουργηθεί με τη γλώσσα C++. Η εφαρμογή JobExecutor αποτελείται από δύο κύρια προγράμματα,
    το JobCommander και το JobExecutorServer. Για να μεταγλωττίσετε τον πηγαίο κώδικα βεβαιωθείται αρχικά πως βρίσκεστε στο
    μητρικό φάκελο /HW2/ και στη συνέχεια πληκτρολογήστε την παρακάτω εντολή:

                                                            make all

    Η παραπάνω εντολή θα μεταγλωττίσει όλα τα πηγαία αρχεία του πργράμματος δημιουργώντας έτσι έναν φάκελο με όνομα /build/
    όπου θα περιέχει όλα τα αντικειμενικά αρχεία, καθώς και έναν φάκελο /bin/ ο οποίος θα περιέχει τα δύο εκτελέσιμα αρχεία
    της εφαρμογής. Συγκεκριμένα τα jobCommander και jobExecutorServer. Για να εκτελέσετε το εκτελέσιμο αρχείο του server με
    αποτέλεσμα να ξεκίνησει η εκτέλεση του server, πληκτρολογήστε στο tty terminal την παρακάτω εντολή:

                                ./bin/jobExecutorServer [port_num] [buffer_size] [threadpool_size]

    όπου [port_num] είναι ο αριθμός θύρας στην οποία ακούει θα  ο  server,  [ buffer_size]  είναι  το  μέγεθος  του  κοινού 
    ενταμιευτή του server, και [threadpool_size] είναι το πλήθος των worker  threads  του  server.  Για  την  εκτέλεση  του
    αρχείου jobCommander, πληκτρολογήστε την παρακάτω εντολή:

                                        ./bin/jobCommander [server_name] [port_num] [command]

    όπου [server_name] είναι το όνομα του μηχανήματος στο οποίο τρέχει ο server, [port_num]  είναι  ο  αριθμός  θύρας  στην 
    οποία ακούει ο server, και [command] είναι η εντολή η οποία θα σταλθεί στον server για να εκτελεσθεί.

        Αφού εκτελέσετε την εφαρμογή και έχετε τελειώσει μπορείτε  να  'καθαρίσετε'  το  workspace  στο  οποίο  βρισκόσαστε
    πληκτρολογώντας στο tty terminal την παρακάτω εντολή

                                                            make clean

    Αυτό θα διαγράψει όλα τα αντικειμενικά και εκτελέσιμα αρχεία που δημιουργήθηκαν κατά τη  διαδικασία  μεταγλώττισης  της
    εφαρμογής, καθώς επίσης και τους φακέλους /build/ και /bin/.

- Περιγραφή της Εφαρμογής:

    - Οργάνωση Κώδικα

        Η συγκεκριμένη εφαρμογή έχει γραφτεί σε γλώσσα C++. Ο λόγος που αποφάσισα να χρησιμοποιήσψ τη  συγκεκριμένη  γλώσσα
    γι' αυτήν την εργασία ήταν διότι μετά από μία μελέτη που έκανα στην εκφώνηση και στα ζητούμενά της, αποφάσισα πως  ό,τι
    περιγράφει μπορώ να το αναπαραστήσω σαν έννοια με μεθόδους και χαρακτηριστικά. Οι έννοιες  οι  οποίες  χρησιμοποιούνται
    στο προγραμμά μου είναι ο Server, ο Client, το ControllerThread, το WorkerThread και  o  WaitingBufferQueue.  Αυτές  οι
    έννοιες έχουν κατασκευαστεί με τέτοιο τρόπο που να  παρέχουν  μία  πιο  αφαιρετική  αναπαράσταση  της  λειτουργίας  του
    προγράμματος, καθώς η κάθε ενέργεια που περιγράφεται στην εκφώνηση εκτελείται στην εφαρμογή μέσω απαραίτητων μεθόδων οι
    οποίες αποτελούν μέρος των κλάσεων. Ένας άλλος βασικό λόγος για τον οποίο επέλεξα τη γλώσσα C++  ήταν  το  γεγονός  ότι
    ήθελα στην εφαρμογή μου να επικρατεί μία ιεραρχία εννοιών. Η σχεδιαστική μου επιλογή για  την  ανάπτυξη  της  εφαρμογής
    ήταν η εξής: Η κύρια εφαρμογή αποτελείται από δύο βασικά μέρη, το πελάτη (client) και τον  εξυπηρετητή  (server),  όπου
    για κάθε έναν ακολουθούν άλλες έννοιες οι οποίες αποτελούν  υποκατηγορίες  των  προηγούμενων.  Για  παράδειγμα  κάποιες
    υποκστηγορίες του server είναι τα threads. Ο σκοπός μου λοιπόν ήταν να αναπτύξω έτσι την εφαρμογή ώστε η κάθε κλάση των
    threads να ανήκουν επίσης στη γενική έννοια του  server.  Για  να  το  πετύχω  αυτό  αξιοποίησα  τους  χώρους  ονομάτων 
    (namespaces) όπου προσφέρει η γλώσσα C++. Πιο συγκεκριμένα έχοντας ορίσει ένα γενικό χώρο ονομάτων για τον server, στην
    συνέχεια δημιουργώ ξεχωριστούς χώρους για την κάθε οντότητα και αυτός ο χώρος ονομάτων ανάλογα με  το  σε  ποια  έννοια
    αποτελεί υποκατηγορία, ο χώρος ονομάτων της ορίζεται εντός του άλλου χώρου ονομάτων της έννοιας στο  πιο  πάνω  επίπεδο
    ιεραρχίας.

        Τα πηγαία αρχεία της εφαρμογής βρίσκονται στο φάκελο /src/ όπως ζητείται και κάθε πηγαίο  αρχείο  που  υλοποιεί  τη
    λειτουργικότητα των εννοιών, ανήκει σε συγκεκριμένους υποφακέλους προκειμένου να  διατηρηθεί  η  οργάνωση  του  κώδικα.
    Συγκεκριμένα τα πηγαία αρχεία ανήκουν σε υποφακέλους όπως /App/, /Client/, /Server/, /Threads/, /Tools/. Τα αρχεία όπου
    ανήκουν στον υποφάκελο /Client/ είναι υπεύθυνα για την λειτουργικότητα του πελάτη (client), τα αρχεία που ανήκουν  στον
    υποφάκελο /Server/ είναι υπέυθυνα για την λειτουργικότητα του εξυπηρέτη (server) κλπ. με τα δύο βασικά  αρχεία  από  τα
    οποία ξεκινάει η εκτέλεση του client και του server να βρίσκονται στον υποφάκελο /App/.

    - Τρόπος Λειτουργίας:

        Η εκκίνηση της εφαρμογής απαιτεί πρώτα από όλα την εκκίνηση του εξηπηρέτη (server) όπου μπορεί να γίνει  εκτελώντας
    το αρχείο jobExecutorServer στο φάκελο /bin/. Αφού ξεκινήσει ο server,  με  ορισμένα  συγκεκριμένα  δεδομένα,  μπορούμε 
    έπειτα να εκτελέσουμε διάφορους πελάτες (clients) οι οποίοι θα συνδέονται στον server  και  θα  του  στέλνουν  διάφορες 
    εντολές προς εκτέλεση. Αυτό μπορεί να γίνει εκτελώντας το αρχείο jobCommander στο φάκελο /bin/. Ο server αρχικά γίνεται
    initialized καλώντας τις απαραίτητες μεθόδους της κλάσης οι οποία τον αναπαριστά. Αυτές είναι οι init(), createSocket(),
    και attachSocketToPort(). Από αυτό το σημείο και μετά ο server είναι έτοιμος και μπορεί να 'ακούει' για  συνδέσεις  από
    διάφορους πελάτες. Αυτό γίνεται με τη μέθοδο run() η οποία είναι υπεύθυνη για  την  ομαλή  εκτέλεση  του  server.  Εκεί
    δημιουργούνται τα worker threads της εφαρμογής ανάλογα με τον αριθμό του threadpool size που έχει δώσει ο χρήστης, εκεί
    ο server αποδέχεται συνδέσεις που γίνονται σε εκείνον και εκεί δημιουργούνται και τα controller threads  που  διαθέτει.
    Ομοίως όταν εκτελείται ένα πρόγραμμα πελάτη γίνεται initialize η κλάση που  αναπαριστά  τον  Client  και  στη  συνέχεια
    ακολουθούν διάφορες ενέργειες προκειμένου να συνδεθεί ο πελάτης στον server, να στείλει την ενέργεια που  επιθυμεί  και
    τέλος να  λάβει  την  απάντηση  του  server.  Αυτά  γίνονται  με  τις  μεθόδους  getServerIPAddress(),  createSocket(),
    connectToServer(), sendCommand() και receiveServerResponse(). Η λειτουργικότητα του server βασίζεται κυρίως  στη  χρήση
    mutexes και condition variables. Για να εξασφαλίσουμε την ορθή εκτέλεση και τον συγχρονισμό των  διαφόρων  threads  που
    τρέχουν στο server η ύπαρξη  και  η  χρήση  των  mutexes  και  condition  variables  στην  εφαρμογή  είναι  απαραίτητη. 
    Συγκεκριμένα χρησιμοποιούνται διάφορα mutexes και condition variables τα οποία χρησιμοποιούνται για  διάφορους  σκοπούς
    της εφαρμογής. Κάποια χρησιμοποιούνται για το πότε θα τεθεί κάποιο worker thread σε λειτουργία και να αφαιρέσει από τον
    κοινό ενταμιευτή ουρά μία διεργασία για να την εκτελέσει, κάποια χρησιμοποιούνται για το πότε ένα controller thread  θα
    έχει τη δυνατότητα να εισάγει μία διεργασία στην ουρά. Οι δύο αυτές περιπτώσεις αφορούν το κύριο πρόβλημα της εφαρμογής
    και συγκεκριμένα των worker και controller threads και αντιμετωπίζεται με τη  χρήση  αυτών  των  mutexes και  condition
    variables. Υπάρχουν όμως και μερικά δευτερεύοντα mutexes και condition variables, τα οποία χρησιμοποιούνται για  άλλους
    λόγους μέσα στην εφαρμογή.

About

A small client-server university project. It is an application that uses the unix os system calls in order to create a server that can accept connections and execute jobs.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published