Λειτουργικά Συστήματα (ΗΥ-345)
Χειμερινό Εξάμηνο 2013-2014
Άσκηση 2
Φροντιστήριο: 12/11/2013
Παράδοση: 29/11/2013
Μαντέψτε γρήγορα ένα string χρησιμοποιώντας πολλά threads
Σε αυτήν την άσκηση θα υλοποιήσετε δυο διαφορετικά προγράμματα που θα τρέχουν στο ίδιο μηχάνημα: έναν server και έναν client.
Ο server θα περιμένει έναν client να συνθεδεί, θα διαλέγει ένα τυχαίο string, και θα περιμένει τον client να το μαντέψει
ενημερώνοντας για τις σωστές και λάθος επιλογές για κάθε γράμμα.
Ο client αντίστοιχα θα συνδέεται στον server και θα προσπαθεί να μαντέψει το string.
Για να το βρεί πιο γρήγορα θα πρέπει να χρησιμοποιεί πολλά threads τα οποία θα ψάχνουν παράλληλα για τα
σωστά γράμματα του string, και θα εκμεταλεύονται ένα μηχάνημα που έχει πολλά CPU cores.
O server θα χρησιμοποιεί επίσης τον ίδιο αριθμό από threads που θα εξυπηρετούν τα αντίστοιχα threads του client.
Η επικοινωνία μεταξύ του server και του client θα γίνεται με UNIX sockets και shared memory.
Επίσης, θα πρέπει τα πολλά διαφορετικά threads του server και του client να συγχρονίζουν κατάλληλα τις λειτουργίες τους
και να προστατεύουν την πρόσβασή τους στην κοινή μνήμη.
Έτσι, σε αυτήν την άσκηση θα εξοικειωθείτε με την δημιουργία και χειρισμό πολλών threads, με shared memory και UNIX sockets
για επικοινωνία μεταξύ διαφορετικών διεργασιών, και με semaphores και mutexes για τον συνχρονισμό διαφορετικών διεργασιών και
αμοιβαίο αποκλεισμό όταν έχουμε κοινή μνήμη μεταξύ πολλών διεργασιών και πολλών threads.
Reference - man pages
Ένα man page περιγράφει τον τρόπο λειτουργίας
ενός προγράμματος, ενός system call ή μιας library function. Η εμφάνιση ενός man page
γίνεται με τη χρήση της εντολής:
man(1)
Για να δείτε το man page (σε Linux) που αναφέρεται στη foo(N), κάνετε:
% man -S N foo
Ο συμβολισμός foo(N) αναφέρεται στο man page που περιγράφει τη foo στη κατηγορία (section)
'Ν'.
Λίστα με χρήσιμα man pages για την Aσκηση 1
Σας παραθέτουμε man pages με system calls που μπορεί να χρειαστείτε για την υλοποίηση της άσκησης.
Η παρακάτω λίστα δεν είναι δεσμευτική. Μπορείτε να χρησιμοποιήσετε και εναλλακτικούς τρόπους.
socket(2)
bind(2)
listen(2)
accept(2)
connect(2)
read(2)
recv(2)
send(2)
write(2)
shutdown(2)
close(2)
shmget(2)
shmat(2)
shmctl(2)
shmdt(2)
pthread_create(3)
pthread_join(3)
pthread_exit(3)
sem_init(3)
sem_destroy(3)
sem_post(3)
sem_wait(3)
sem_getvalue(3)
pthread_mutex_lock(3)
pthread_mutex_unlock(3)
pthread_mutex_init(3)
pthread_mutex_destroy(3)
Παρατηρήσεις
- Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα
από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας και
το λογαριασμό σας (account) σε όλα τα αρχεία.
- Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε
πληκτρολογώντας make all να γίνεται η μεταγλώττιση
(compilation) του προγράμματος και να παράγεται το εκτελέσιμο
αρχείο. Επίσης πληκτρολογώντας make clean να καθαρίζονται
όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται
για τη μεταγλώττιση.
- Επιπλέον, γράψτε και ένα αρχείο readme.txt το πολύ 30 γραμμών που να
περιέχει επεξηγήσεις για τον τρόπο υλοποίησης και παραδείγματα
για τη χρήση του mysh που υλοποιήσατε.
- Τοποθετήστε σε ένα κατάλογο όλα τα
αρχεία που χρειάζονται για την άσκηση 2. Παραδώστε τα
παραπάνω αρχεία χρησιμοποιώντας το πρόγραμμα submit (πληκτρολογήστε
submit assignment_2@hy345 directory_name από τον κατάλογο
που περιέχει τον κατάλογο directory_name με τα αρχέια της άσκησης).
- Σε πολλές περιπτώσεις τα ονόματα των συναρτήσεων βιβλιοθήκης είναι
ενδεικτικά. Μπορείτε να χρησιμοποιήσετε όποια σας βολεύουν.