Λειτουργικά Συστήματα (ΗΥ-345)
Χειμερινό Εξάμηνο 2011
Ασκηση 1η



Κατασκευή εντολής time

Στην πρώτη αυτή εισαγωγική άσκηση των λειτουργικών συστημάτων σας ζητείται να υλοποιήσετε ένα πρόγραμμα το οποίο θα μετράει τον χρόνο εκτέλεσης (CPU time άλλα και real time) άλλων προγραμμάτων. Ουσιαστικά θα πρέπει να φτιάξετε μια δική σας time, όπως η time του λειτουργικού συστήματος Unix. Η δική σας time, που θα την ονομάσετε mytime, θα λειτουργεί ως εξής: Η μοναδική παράμετρος που θα παίρνει θα είναι το πρόγραμμα του οποίου θέλουμε να μετρήσουμε τον χρόνο εκτέλεσης (θα λαμβάνονται υπόψιν και όλες οι παράμετροι που αυτό μπορεί να δέχεται). Π.χ mytime /bin/ls ~hy345.

Το mytime θα κάνει χρήση του system call fork για να δημιουργεί μια νέα διεργασία, η οποία και θα εκτελεί το πρόγραμμα που δίνει σαν παράμετρο ο χρήστης. Ο χρόνος θα ξεκινά να μετρά από την στιγμή που θα ξεκινήσει να εκτελείται η νέα διεργασία (child process) και η μέτρηση θα σταματά όταν τελειώσει εντελώς η διεργασία αυτή και αφού ο έλεγχος επιστρέψει στον πατέρα (father process). Για το σκοπό αυτό ο πατέρας θα πρέπει να περιμένει μέχρις ότου τελειώσει το παιδί.

H πατρική διεργασία που έκανε και το fork θα είναι αυτή που θα τυπώσει στην έξοδο τα αποτελέσματα για το CPU time (user time και system time) και τον πραγματικό χρόνο (real time) που πέρασε κατά την διάρκεια της εκτέλεσης. Για να μετρήσει το CPU time της θυγατρικής διεργασίας, η πατρική διεργασία μπορεί να χρησιμοποιήσει το system call times. Η μέτρηση του πραγματικού χρόνου θα αρχίζει στην θυγατρική διεργασία, αλλά θα σταματάει στην πατρική της. Οπότε θα πρέπει η θυγατρική διεργασία να στείλει στην πατρική της την χρονική στιγμή που άρχισε η εκτέλεση.

Αυτό σημαίνει πως θα πρέπει να υπάρξει επικοινωνία μεταξύ των δυο διεργασιών (father & child). Η επικοινωνία αυτή (IPC: InterProcess Communication) είναι εφικτή και θα γίνει με χρήση του system call pipe. Κάθε pipe που ανοίγει μεταξύ 2 διεργασιών έχει 2 end-points για κάθε μια από τις διεργασίες που εμπλέκονται στην επικοινωνία, ένα read-end από το οποίο διαβάζει και ένα write-end στο οποίο μπορεί και γράφει.

Τέλος, οι διεργασίες αυτές θα πρέπει να χειρίζονται κατάλληλα τα signals που δέχονται. Συγκεκριμένα, οταν ο χρήστης πατάει CTR-C το πρόγραμμα θα πρέπει να τυπώνει οτι δέχτηκε signal για διακοπή (και το είδος του signal) και πριν τερματίσει να τυπώνει τα στατιστικά για τον χρόνο εκτέλεσης.

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 και κάποιες συναρτήσεις που μπορεί να χρειαστείτε για την υλοποίηση της άσκησης. Η παρακάτω λίστα δεν είναι δεσμευτική. Μπορείτε να χρησιμοποιήσετε και εναλλακτικούς τρόπους.

fork(2)
execv(2)
pipe(2)
dup(2)
waitpid(2)
times(2)
time(2)
time(1)
gettimeofday(2)
signal(2)
 
Κάποιες από τις βιβλιοθήκες που θα πρέπει να χρησιμοποιήσετε είναι οι παρακάτω:
#include <sys/times.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>

Παρατηρήσεις

  1. Η άσκηση είναι ατομική. Τυχόν αντιγραφές μπορούν να ανιχνευθούν εύκολα από κατάλληλο πρόγραμμα και θα μηδενιστούν. Συμπεριλάβετε το όνομα σας και το λογαριασμό σας (account) σε όλα τα αρχεία.
  2. Κατασκευάστε ένα αρχείο Makefile, έτσι ώστε πληκτρολογώντας make all να γίνεται η μεταγλώττιση (compilation) του προγράμματος και να παράγεται το εκτελέσιμο αρχείο. Επίσης πληκτρολογώντας make clean να καθαρίζονται όλα τα περιττά αρχεία, και να μένουν μόνο τα αρχεία που χρειάζονται για τη μεταγλώττιση.
  3. Επιπλέον, γράψτε και ένα αρχείο readme.txt το πολύ 30 γραμμών που να περιέχει επεξηγήσεις για τον τρόπο υλοποίησης.
  4. Τοποθετήστε σε ένα κατάλογο όλα τα αρχεία που χρειάζονται για την άσκηση 1. Παραδώστε τα παραπάνω αρχεία χρησιμοποιώντας το πρόγραμμα submit (πληκτρολογήστε submit assignment_1@hy345 directory_name από τον κατάλογο που περιέχει τον κατάλογο directory_name με τα αρχέια της άσκησης).
  5. Σε πολλές περιπτώσεις τα ονόματα των συναρτήσεων βιβλιοθήκης είναι ενδεικτικά. Μπορείτε να χρησιμοποιήσετε όποια σας βολεύουν.