Συνθήκες ανταγωνισμού ονομάζονται οι
συνθήκες κατά τις οποίες το τελικό αποτέλεσμα της εκτέλεσης
μιας σειράς διεργασιών κάτω από αυτές εξαρτάται από τη σειρά εκτέλεσής
τους.
Παράδειγμα
int counter;
process_one()
{
	int i;
	i = counter;
	i = i + 1;
	counter = i;
}
process_two()
{
	int i;
	i = counter;
	i = i + 1;
	counter = i;
}
Κρίσιμα τμήματα
Το τμήμα του κώδικα μιας διεργασίας το οποίο δεν είναι ασφαλές
να εκτελεστεί παράλληλα με άλλη διεργασία ονομάζεται
κρίσιμο τμήμα (critical section).
Κάθε λύση στο πρόβλημα του 
αμοιβαίου αποκλεισμού (mutual exclusion)
μεταξύ των κρίσιμων τμημάτων πρέπει να εξασφαλίζει:
-  Μια το πολύ διεργασία μπορεί να εκτελεί ένα κρίσιμο τμήμα.
 -  Δεν επιτρέπονται υποθέσεις σχετικά με την ταχύτητα ή το πλήθος των
επεξεργαστών.
 -  Διεργασία που δε βρίσκεται σε κρίσιμο τμήμα δεν επιτρέπεται να αναστείλει
άλλες διεργασίες
 -  Ο χρόνος στον οποίο μια διεργασία θα εισέλθει στο κρίσιμο τμήμα της
πρέπει να είναι πεπερασμένος.
 
Ενεργός αναμονή
Ορισμένοι τρόποι για την επίτευξη του αμοιβαίου αποκλεισμού είναι οι
παρακάτω:
-  Απενεργοποίηση των διακοπών
 -  Αυστηρή εναλλαγή
 -  Λύση του Peterson (προσθήκη μεταβλητής "ενδιαφέροντος")
 -  Η εντολή TSL
 
Όλες οι παραπάνω λύσεις επιβάλουν στη διαδικασία που αναμένει
να εκτελεί εντολές.
Απενεργοποίηση και αφύπνιση
Η οργάνωση της διαδιεργασιακής επικοινωνίας
γίνεται χρησιμοποιόντας αφηρημένες
βασικές αρχές διαδιεργασιακής επικοινωνίας (interprocess communication primitives).
To ζεύγος
είναι μια τέτοια αρχή.
Με τις κλήσεις αυτές μπορεί να εκφραστεί το πρόβλημα του
παραγωγού-καταναλωτή (producer-consumer).
const N = 100;
int queue[N];
int count;
void
producer(void)
{
	int item;
	for (;;) {
		create(&item);
		if (count == N)
			sleep();
		count = count + 1;
		queue[count - 1] = item;
		if (count == 1)
			wakeup(consumer);
	}
}
void
consumer(void)
{
	int item;
	for (;;) {
		if (count == 0)
			sleep();
		item = queue[count - 1];
		count = count - 1;
		if (count == N - 1)
			wakeup(producer);
		consume(&item);
	}
}
Η παραπάνω λύση έχει πρόβλημα συνθήκης ανταγωνισμού ως προς
τη χρήση της μεταβλητής count.
Σημαφόροι
To ζεύγος των
σημαφόρων (semaphores)
επιτρέπει την οργάνωση της διαδιεργασιακής επικοινωνίας
μια και αυτοί εκφράζουν 
ατομικές ενέργειες (atomic action).
Με τις κλήσεις αυτές μπορεί να λυθεί το πρόβλημα του
παραγωγού-καταναλωτή.
const N = 100;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void
producer(void)
{
	int item;
	for (;;) {
		create(&item);
		down(&empty);
		down(&mutex);
		count = count + 1;
		queue[count - 1] = item;
		up(&mutex)
		up(&full);
	}
}
void
consumer(void)
{
	int item;
	for (;;) {
		down(&full);
		down(&mutex);
		item = queue[count - 1];
		count = count - 1;
		up(&mutex);
		up(&empty);
		consume(&item);
	}
}
Παρακολουθητές
Οι
παρακολουθητές (monitors)
είναι δομή της γλώσσας προγραμματισμού που εξασφαλίζει ότι 
σε μια συγκεκριμένη χρονική στιγμή
μπορεί να εκτελείται.
το πολύ μια διαδικασία μέσα στον παρακολουθητή.
Η δομή αυτή εξασφαλίζει τον αμοιβαίο αποκλεισμό κρισίμων τμημάτων.
H αναστολή διεργασιών που δεν μπορούν να συνεχίσουν εξασφαλίζεται
με τη χρήση των
μεταβλητών συνθήκης (condition variables)
Μεταβίβαση μηνύματος
Άλλος τρόπος διαδιεργασιακής επικοινωνίας είναι η χρήση της
μεταβίβαση μηνύματος (message passing) που
μπορεί να εκφραστεί με τις διαδικασίες:
- send(destination, message)
 - receive(destination, message)
 
Ο συντονισμός της αποστολής και της παραλαβής μπορεί να γίνει:
Με τις κλήσεις αυτές μπορεί να εκφραστεί το πρόβλημα του
παραγωγού-καταναλωτή.
const N = 100;
int queue[N];
void
producer(void)
{
	int item;
	message m;
	for (;;) {
		create(&item);
		receive(consumer, &m);
		build_message(item, &m);
		send(consumer, &m);
	}
}
void
consumer(void)
{
	int item;
	message m;
	for (i = 0;  i < 100; i++)
		send(producer, &m);
	for (;;) {
		receive(producer, &m);
		extract_item(&m, &item);
		send(producer, &m);
		consume(&item);
	}
}
Κλασικά προβλήματα
To πρόβλημα των συνδαιτημόνων φιλοσόφων
Λύσεις (σωστές και λανθασμένες):
-  Λαμβάνουμε το αριστερό πηρούνι και περιμένουμε το δεξί
 -  Χρήση ενός σημαφόρου για όλους τους φιλοσόφους
 -  Χρήση ενός σημαφόρου ανά φιλόσοφο και μεταβλητής κατάστασης
 
 
Χρονοπρογραμματισμός
Τη σειρά εκτέλεσης των διεργασιών αναλαμβάνει ο
χρονοδρομολογητής (scheduler) με βάση
τον 
αλγόριθμο χρονοπρογραμματισμού (scheduling algorithm).
Αυτός πρέπει να εξασφαλίζει:
Διακρίνουμε
Ως πολιτική χρονοπρογραμματισμού μπορούμε να έχουμε:
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 39-101
	Εκδόσεις Παπασωτηρίου, 1993.
 
- Maurice J. Bach.
The
  Design of the UNIX Operating System, pages 146–268, 355–389.
Prentice-Hall, 1986.
 
- Samuel J. Leffler,
  Marshall Kirk McKusick, Michael J. Karels, and John S. Quarterman.
The
  Design and Implementation of the 4.3BSD Unix Operating System,
  pages 69–107, 281–309.
Addison-Wesley, 1988.
 
- Andrew S. Tanenbaum.
Operating Systems: Design and Implementation, pages 45–105.
Prentice-Hall, 1987.
 
Εργασία στο εργαστήριο
Παρακολουθήστε την έξοδο της εντολής ps:
athena:~> ps -aux | more
USER       PID %CPU %MEM SIZE  RSS TTY STAT START   TIME COMMAND
Barekos  30536  0.0  1.7  426  560  ?  S    17:16   0:00 -tcsh
Barekos  30541  0.1  1.0  136  332  ?  S    17:17   0:02 bot
bin         42  0.0  0.7   80  220  ?  S   Oct 22   0:03 /usr/sbin/rpc.portmap
dspin    29194  0.0  1.8  448  592 pp1 S    15:48   0:02 -tcsh
dspin    31282  0.0  0.7   96  224 pp1 R    17:56   0:00 ps aux
dspin    31283  0.0  0.4   40  152 pp1 S    17:56   0:00 more
gkarydas 30544  0.0  1.7  426  556  ?  S    17:17   0:00 -tcsh
gkarydas 30553  0.2  1.0  168  344  ?  S    17:17   0:04 bot
root         1  0.0  0.6   48  216  ?  S   Oct 22   2:22 init auto
root         6  0.0  0.2   32   76  ?  S   Oct 22   0:01 bdflush (daemon)
root         7  0.0  0.2   32   84  ?  S   Oct 22   0:39 update (bdflush)
root        23  0.0  0.5   56  188  ?  S   Oct 22   0:24 /usr/sbin/crond -l10
root        39  0.0  0.5   57  188  ?  S   Oct 22   0:15 /usr/sbin/syslogd
root        40  0.2  0.6   40  212  ?  S   Oct 22  24:51 /usr/sbin/klogd
root        44  0.0  0.7   68  224  ?  S   Oct 22   0:23 /usr/sbin/inetd
root        46  0.0  0.5   64  164  ?  S   Oct 22   0:03 /usr/sbin/lpd
root        48  0.0  0.4   60  140  ?  S   Oct 22   0:03 /usr/sbin/rpc.ugidd -d
root        52  0.0  0.4  108  152  ?  S   Oct 22   0:03 /usr/sbin/rpc.mountd
root        54  0.0  0.6  124  196  ?  S   Oct 22   0:03 /usr/sbin/rpc.nfsd
root        61  0.0  0.8  784  260  ?  S   Oct 22   0:32 /usr/local/www/httpd -d
Βλέπετε τα χαρακτηριστικά κάθε διεργασίας καθώς και την κατάστασή της.
Δοκιμάστε να δείτε το δάσος των διεργασιών:
athena:~> ps -af
> ps -af
  PID TTY STAT  TIME COMMAND
   69 v02 S     0:00 /sbin/agetty 38400 tty2
   70 v03 S     0:00 /sbin/agetty 38400 tty3
  277 v01 S     0:00 /sbin/agetty 38400 tty1
17325 v04 S     0:00 /sbin/agetty 38400 tty4
16063 pq2 S     0:00 -bin/tcsh
29267 pq3 S     0:00 -bin/tcsh
29310 pq3 S     0:00  \_ ftp
11372 pq0 S     0:00 -bin/tcsh
11389 pq1 S     0:00 -bin/tcsh
29194 pp1 S     0:02 -tcsh
31295 pp1 S     0:00  \_ vi
31296 pp1 S     0:00      \_ -bin/tcsh
31297 pp1 R     0:00          \_ ps -af                             
Στον κατάλογο /proc μπορείτε να δείτε στοιχεία των διεργασιών:
athena:~> cd /proc/self
athena:/proc/self> ls -l
total 0
-r--r--r--   1 dspin    users           0 Oct 29 18:01 cmdline
lrwx------   1 dspin    users          64 Oct 29 18:01 cwd -> [0001]:1913257986
-r--------   1 dspin    users           0 Oct 29 18:01 environ
lrwx------   1 dspin    users          64 Oct 29 18:01 exe -> [0301]:36649
dr-x------   2 dspin    users           0 Oct 29 18:01 fd/
pr--r--r--   1 dspin    users           0 Oct 29 18:01 maps|
-rw-------   1 dspin    users           0 Oct 29 18:01 mem
lrwx------   1 dspin    users          64 Oct 29 18:01 root -> [0301]:2
-r--r--r--   1 dspin    users           0 Oct 29 18:01 stat
-r--r--r--   1 dspin    users           0 Oct 29 18:01 statm
athena:/proc/self> cat environ
TERM=vt100HZ=100HOME=/home2/staff/dspinSHELL=/bin/tcshPATH=/bin:/usr/bin:/usr/lo
cal/bin:/usr/X386/bin:/usr/TeX/binUSER=dspinLOGNAME=dspinMAIL=/var/spool/mail/ds
pin
athena:/proc/self> 
Μπορείτε να δείτε την κατάσταση των διακοπών από το αρχείο /proc/interrupts:
kerkis:/proc$ more /proc/interrupts
 0:    1499266   timer
 1:          2   keyboard
 2:          0   cascade
 4:          4 + serial
10:      29113   3c509
13:          1   math error
14:      62272 + ide0           
Διαχείριση μνήμης
Απλή διαχείριση μνήμης
Η διαχείριση μνήμης (memory managemenr)
επιτρέπει στο λειτουργικό σύστημα την καλύτερη δυνατή
κατανομή μνήμης ανάμεσα σε διεργασίες.
Σε συστήματα που εξυπηρετούν μια διεργασία η μνήμη μπορεί να
οργανωθεί ως εξής:
| Πρόγραμμα χρήστη | 
| Λειτουργικό σύστημα στη RAM | 
| Λειτουργικό σύστημα σε ROM | 
| Πρόγραμμα χρήστη | 
| Οδηγοί συσκευών σε ROM (BIOS) | 
| Πρόγραμμα χρήστη | 
| Λειτουργικό σύστημα σε RAM | 
-  Προλυπρογραμματιστικά συστήματα μπορούν να διαχειριστούν τη
μνήμη σε σταθερά τμήματα.
 -  Η αύξηση της μνήμης αυξάνει την αξιοποίηση του επεξεργαστή αυξάνοντας
το βαθμό πολυπρογραμματισμού.
 -  Η διαχείριση της μνήμης μπορεί να επιτευχθεί με το διαχωρισμό της
σε σταθερά τμήματα.
Οι εργασίες για τα τμήματα αυτά μπορούν να επιλέγονται:
-  από μια ουρά για όλα τα τμήματα.
 -  από μια ουρά ανά τμήμα ανάλογα με το μέγεθός του.
 
 -  Η μετατόπιση (relocation) επιτρέπει σε προγράμματα
και δεδομένα να εκτελούνται αδιάφορα από το τμήμα της μνήμης στο οποίο
έχουν φορτωθεί.
 -  Η προστασία (protection) απομονώνει τις διαφορετικές
διεργασίες.
Το λειτουργικό σύστημα διασφαλίζει ότι
κάθε διεργασία απαγορεύει σε άλλες διεργασίες την πρόσβαση στη μνήμη της.
Αυτό μπορεί να επιτευχθεί με τη χρήση ειδικών καταχωρητών:
 
Εναλλαγή
Η εναλλαγή (swapping)
μέσω της μετακίνησης διεργασιών από τη μνήμη στο δίσκο και
αντίστροφα επιτρέπει την ταυτόχρονη εκτέλεση περισσοτέρων
διεργασιών απ' όσες χωράν στην κεντρική μνήμη.
Σε συστήματα που βασίζονται σε εναλλαγή η διαχείριση της
μνήμης γίνεται με βάση μεταβλητά τμήματα.
Καταμερισμός μνήμης
Η διαχείριση της μνήμης μπορεί να γίνει με:
Η επιλογή του τμήματος της μνήμης από τη λίστα μπορεί
να γίνει με ένα από τα παρακάτω κριτήρια:
Ιδεατή μνήμη
Η ιδεατή μνήμη (virtual memory)
παρουσιάζει στις διεργασίες παραπάνω μνήμη από αυτή
που διαθέτει το σύστημα.
Αυτό γίνεται χρησιμοποιώντας
ιδεατές διευθύνσεις (virtual addresses) οι οποίες
μεταφράζονται σε πραγματικές από τη
μονάδα διαχείρισης μνήμης (memory management unit).
Αντικατάσταση σελίδων
Η αντικατάσταση των σελίδων μπορεί να γίνει:
Σχεδιασμός σελιδοποίησης
Επανεκκίνηση εντολής
Μια εντολή μηχανής μπορεί να διακοπεί στη μέση της εκτέλεσής της.
Την επανεκκίνηση της εντολής 
- 
μπορεί να αναλάβει ο επεξεργαστής
από το σημείο στο οποίο σταμάτησε ή
 -  το λειτουργικό
σύστημα από την αρχική της κατάσταση.
 
Θέματα υλοποίησης
Κλείδωμα σελίδων
Σε περίπτωση που μια σελίδα χρησιμοποιείται για την καταχώρηση πίνακα
σελίδων, περιγραφέα ή ως ενταμιευτής εισόδου / εξόδου από / προς κάποιο
περιφερειακό τότε αυτή πρέπει να κλειδωθεί στη μνήμη και να μην
επιτρέπεται η αντικατάστασή της.
Σελιδοποίηση κώδικα και δεδομένων
Σε ορισμένα λειτουργικά συστήματα ο κώδικας μιας διεργασίας και τα
δεδομένα της μπορεί να απεικονίζονται σε σελίδες των οποίων η θέση
στο δίσκο να είναι τα αντίστοιχα αρχεία που περιέχουν τον κώδικα
της διεργασίας ή τα δεδομένα της.
Διαμοιραζόμενες σελίδες
Ειδικά τις σελίδες του κώδικα ή στατικών δεδομένων
(π.χ. το κείμενο βοηθείας μιας εφαρμογής) μπορούν να τις μοιράζονται και 
περισσότερες από μια διαδικασίες μια και αυτές δεν μεταβάλλονται.
Διεργασία σελιδοποίησης
Η διεργασία σελιδοποίησης (paging daemon) τρέχει στο
περιθώριο με σκοπό να ερευνά τις σελίδας και να καταγράφει σελίδες που
είναι υποψήφιες για αντικατάσταση.
Κατάτμηση
Η κατάτμηση (segmentation) επιτρέπει το διαχωρισμό
της μνήμης μιας διεργασίας σε πολλά γραμμικά τμήματα.
Τα τμήματα αυτά για κάθε διεργασία μπορούν να περιέχουν:
-  Τον κώδικα 
 -  Τη στοίβα
 -  Τα αρχικοποιημένα δεδομένα
 -  Το χώρο ανάπτυξης της δυναμικής μνήμης
 
Η κατάτμηση επιτρέπει:
-  την εύκολη μεταφορά του κώδικα, αφού κάθε τμήμα του
εκφράζεται σχετικά με την αρχή του τμήματος.
 -  την προστασία των δεδομένων ανάλογα με τον τύπο τους. Π.χ.
| Κώδικας |  Μόνο εκτέλεση | 
| Αρχικοποιημένα δεδομένα |  Μόνο ανάγνωση | 
| Σωρός |  Ανάγνωση και εγγραφή | 
| Δυναμική μνήμη |  Ανάγνωση και εγγραφή | 
 -  Την υλοποίηση 
διαμοιραζομένων βιβλιοθηκών (shared libraries)
 
Η κατάτμηση υλοποιείται με βάση δομών στη μνήμη που καλούνται
περιγραφείς (descriptors) και
περιέχουν τα χαρακτηριστικά στοιχεία κάθε τμήματος (θέση
στην πραγματική μνήμη, προστασία, μέγεθος).
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 103-198
	Εκδόσεις Παπασωτηρίου, 1993.
 
- Maurice J. Bach.
The
  Design of the UNIX Operating System, pages 271–352.
Prentice-Hall, 1986.
 
- Bruce Javob and Trevor
  Mudge.
Virtual memory: Issues of implementation.
Computer, 31(6):33–43, June 1998.
 
- Samuel J. Leffler,
  Marshall Kirk McKusick, Michael J. Karels, and John S. Quarterman.
The
  Design and Implementation of the 4.3BSD Unix Operating System,
  pages 109–163.
Addison-Wesley, 1988.
 
- Andrew S. Tanenbaum.
Operating Systems: Design and Implementation, pages 191–247.
Prentice-Hall, 1987.
 
Εργασία στο εργαστήριο
Παρατηρήστε στοιχεία της μνήμης από την έξοδο της εντολής vmstat:
vmstat 1
 procs                  memory    swap        io    system         cpu
 r b w  swpd  free  buff cache  si  so   bi   bo   in   cs  us  sy  id
 1 0 0     0   300  6572  9032   0   0   17    3  106   17   1   1  99
 1 0 0     0   272  6372  8892   0   0    0   73  145   25  94   5   1
 1 0 0     0  1552  6284  8784   0   0   74   47  141  153  54  43   3
 1 0 0     0  1228  6284  8784   0   0    0    0  105    9  97   3   0
 1 0 0     0   852  6284  8784   0   0    0    0  105   13  97   3   0
 1 0 0     0  2552  6284  8768   0   0    0   45  139  133  73  23   4
 1 0 0     0   960  6348  8768   0   0    1   77  130   55  74  13  14
 1 0 0     0   952  6348  8768   0   0    0   12  113   63  81  19   0
 1 0 0     0   964  6348  8772   0   0    2   24  123   82  73  25   2
 1 0 0     0  1052  6348  8772   0   0    0   24  122   83  83  16   2
 1 0 0     0  2484  6348  8772   0   0    0   36  131  120  67  32   1
 1 0 0     0  2416  6348  8772   0   0    0  113  136   68  80  15   6
 2 0 0     0  2404  6348  8772   0   0    0   48  141  164  57  40   3         
και από το περιεχόμενο του αρχείου meminfo:
kerkis:/proc$ more /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:  31559680 31137792   421888 15089664  3870720  7208960
Swap:        0        0        0
MemTotal:     30820 kB
MemFree:        412 kB
MemShared:    14736 kB
Buffers:       3780 kB
Cached:        7040 kB
SwapTotal:        0 kB
SwapFree:         0 kB    
Συστήματα αρχείων
Απαιτήσεις
Η φύλαξη δεδομένων σε αρχεία ικανοποιεί τις παρακάτω απαιτήσεις:
-  Αποθήκευση και ανάκτηση μεγάλων ποσοτήτων δεδομένων
 -  Διατήρηση των δεδομένων μετά τον τερματισμό μιας διεργασίας
 -  Πρόσβαση πολλών διεργασιών στα ίδια δεδομένα
 
Ονοματολογία
Ανάλογα με το λειτουργικό σύστημα υπάρχει διαφορετική προσέγγιση
στο διαχωρισμό πεζών και κεφαλαίων:
 
-  Ονομασία μόνο με κεφαλαία, 
ανάκτηση ανεξάρτητα από τον τύπο των γραμμάτων (π.χ. MS-DOS)
 -  Ονομασία με πεζά και κεφαλαία
ανάκτηση ανεξάρτητα από τον τύπο των γραμμάτων (π.χ. Windows-NT)
 -  Ονομασία με πεζά και κεφαλαία
ανάκτηση σύμφωνα με τον τύπο των γραμμάτων (π.χ. Unix)
 
Σε ορισμένα λειτουργικά συστήματα
η επέκταση του αρχείου (filename extension)
έχει ειδική σημασία.
Αυτή μπορεί να υποστηρίζεται μέσω ενός γενικού
αντικειμενοστρεφούς σχεδιασμού του λειτουργικού
συστήματος (π.χ. Windows NT) ή λόγω παραδοχών που γίνονται από
τις εφαρμογές του (π.χ. MS-DOS, Unix, VMS).
Για παράδειγμα στο Windows-NT 
ορισμένοι τύποι επέκτασης είναι οι παρακάτω:
| .exe | Εκτελέσιμο αρχείο | 
| .txt | Αρχείο κειμένου | 
| .bat | Εκτελέσιμο αρχείο εντολών του φλοιού | 
| .bmp | Αρχείο χαρτογραφικής εικόνας | 
| .htm | Αρχείο με κείμενο HTML (Internet) | 
| .hlp | Αρχείο με δεδομένα βοήθειας | 
| .doc | Αρχείο της εφαρμογής Microsoft Word | 
| .xls | Αρχείο της εφαρμογής Microsoft Excel | 
| .c | Αρχείο πηγαίου κώδικα C | 
| .pas | Αρχείο πηγαίου κώδικα Pascal | 
| .for | Αρχείο πηγαίου κώδικα Fortran | 
| .bas | Αρχείο πηγαίου κώδικα Basic | 
| .obj | Μεταγλωττισμένος κώδικας | 
| .lib | Βιβλιοθήκη μεταγλωττισμένου κώδικα | 
| .dll | Δυναμική βιβλιοθήκη | 
Δομή, τύποι και προσπέλαση αρχείων
Τύποι
Πολλά λειτουργικά συστήματα διακρίνουν ειδικούς
τύπους αρχείων:
Δομή
Το λειτουργικό σύστημα μπορεί ακόμα να υποστηρίζει ορισμένη δομή αρχείων:
-  Αδόμητα αρχεία (Unix, Windows-NT, MS-DOS)
 -  Ακολουθίες εγγραφών (CP/M, Concurrent  - Interdata - Perkin Elmer OS/32)
 -  Αρχεία με κλειδί (Perkin Elmer OS/32)
 
Σε λειτουργικά συστήματα με αδόμητα αρχεία το περιεχόμενο των αρχείων
ορίζεται με σύμβαση.
Διακρίνονται αρχεία κειμένου (ASCII) καθώς και δυαδικά αρχεία.
Το περιεχόμενο των δυαδικών αρχείων προσδιορίζεται συνήθως από το
επίθεμά τους ή/και τη χρήση ενός
μαγικού αριθμού (magic number).
Προσπέλαση
Σε παλαιότερα λειτουργικά συστήματα υπήρχε η διάκριση μεταξύ
αρχείων σειριακής προσπέλασης (sequential access) και
αρχείων τυχαίας προσπέλασης (random access).
Ιδιοχαρακτηριστικά
Στα περισσότερα λειτουργικά συστήματα κάθε αρχείο συσχετίζεται
με πρόσθετες πληροφορίες, που καλούνται
ιδιοχαρακτηριστικά του αρχείου (file attributes).
Αυτές μπορεί να είναι:
-  Περιγραφή της προστασίας του αρχείου (ανάγνωση, μεταβολή)
 -  Ταυτότητα του δημιουργού και του ιδιοκτήτη
 -  Τρόποι προσπέλασης (σειριακή, τυχαία)
 -  Ένδειξη τροποποίησης
 -  Ένδειξη κρυφού αρχείου
 -  Ένδειξη προσωρινού αρχείου
 -  Ένδειξη εφεδρείας
 -  Μήκος εγγραφής
 -  Στοιχεία του κλειδιού
 -  Ημερομηνία και ώρα δημιουργίας
 -  Ημερομηνία και ώρα τελευταίας προσπέλασης
 -  Ημερομηνία και ώρα τελευταίας μεταβολής
 -  Ημερομηνία και ώρα τελευταίας μεταβολής των ιδιοχαρακτηριστικών
 -  Τρέχον μέγεθος
 -  Μέγιστο μέγεθος
 
Κλήσεις ΛΣ για χρήση αρχείων
Η πρόσβαση στα αρχεία γίνεται μέσω κλήσεων στο λειτουργικό σύστημα.
Οι σημαντικότερες από αυτές είναι:
-  create 
 -  Δημιουργία ενός νέου αρχείου
 -  open 
 -  Αρχή της πρόσβασης στο αρχείο
 -  read 
 -  Ανάγνωση από το αρχείο
 -  write 
 -  Εγγραφή στο αρχείο
 -  seek 
 -  Μετακίνηση του δείκτη στο αρχείο
 -  close 
 -  Τέλος της πρόσβαση στο αρχείο
 
Η κλήσεις open και create επιστρέφουν κατά κανόνα έναν μικρό ακέραιο 
τον περιγραφέα του αρχείου (file descriptor) ο οποίος
χρησιμοποιείται στη συνέχεια για κάθε άλλη κλήση που έχει σχέση με το 
συγκεκριμένο αρχείο.
Με τον τρόπο αυτό απλουστεύεται η πρόσβαση στο αρχείο μέσω του ονόματός του.
Για παράδειγμα η παρακάτω συνάρτηση αντιγράφει ένα
αρχείο σε ένα άλλο (Unix):
/*
 * Copy file specified by path1 to path2
 * Return 0 on success -1 on error
 * (dds)
 */
int
copyfile(char *path1, char *path2)
{
	char	buf[512];		/* Copy buffer */
	int	ifd, ofd;		/* File descriptors */
	int	nrbytes;		/* Bytes read */
	int	nwbytes;		/* Bytes written */
	struct	stat sbuf;		/* Attribute buffer */
	/* Get attributes of source file */
	if (stat(path1, &sbuf) == -1)
		return (-1);
	/* Open source file */
	if ((ifd = open(path1, O_RDONLY)) < 0)
		return (-1);
	/* Create destination file */
	if ((ofd = creat(path2, sbuf.st_mode & 0777)) < 0) {
		close(ifd);
		return (-1);
	}
	/* Copy source to destination in chunks */
	while ((nrbytes = read(ifd, buf, sizeof(buf))) > 0) {
		if ((nwbytes = write(ofd, buf, nrbytes)) != nrbytes) {
			nrbytes = -1;
			break;
		}
	}
	/* Close source file */
	if (close(ifd) < 0) {
		close(ofd);
		return (-1);
	}
	/* Close destination file */
	if (close(ofd) < 0) {
		return (-1);
	}
	/* Success! */
	return (0);
}
Αρχεία που απεικονίζονται στη μνήμη
Η πρόσβαση σε αρχεία μπορεί να γίνει και χωρίς τη χρήση read/write/seek
με την απευθείας απεικόνισή τους στη μνήμη.
Ο τρόπος προσφέρει διαφάνεια στην πρόσβαση και καλύτερες επιδόσεις,
ειδικά όταν συνδυάζεται με κατάτμηση για την 1-1 απεικόνιση διευθύνσεων
του αρχείου με διευθύνσεις μνήμης και
σελιδοποίηση για την ανίχνευση κάθε ανάγνωσης και εγγραφής σχετικής
με το αρχείο.
Η πρόσβαση στα αρχεία με τον τρόπο αυτό γίνεται μέσω κλήσεων στο 
λειτουργικό σύστημα και στη συνέχεια χρήσης της αντίστοιχης μνήμης
(μέσω δεικτών ή πινάκων).
Οι σχετικές κλήσεις είναι:
-  map 
 -  Σύνδεση μιας περιοχής της μνήμης με ένα αρχείο
 -  unmap 
 -  Τερματισμός της αντίστοιχης σύνδεσης
 
Στο Unix οι αντίστοιχες κλήσεις είναι οι:
void *mmap(void  *start,  size_t length, int prot , int flags, 
	   int fd, off_t offset);
int munmap(void *start, size_t length);           
Υλοποίηση αρχείων
Η υλοποίηση του συστήματος των αρχείων μπορεί να γίνει με διάφορους
τρόπους κατανομής του χώρου του δίσκου.
Κάθε τρόπος πρέπει να επιτρέπει σειριακή και τυχαία πρόσβαση στο αρχείο.
Μερικοί τρόποι είναι οι παρακάτω:
-  Συνεχής κατανομή του χώρου του δίσκου.
 -  Κατανομή του χώρου με μορφή συνδεδεμένης λίστας.
 -  Κατανομή με μορφή συνδεδεμένης λίστας δεικτών σε τμήματα (FAT)
 -  Με τη χρήση πινάκων δεικτών (i-nodes)
 
Ιεραρχικά συστήματα καταλόγων
Κλήσεις ΛΣ για χρήση καταλόγων
Η πρόσβαση στους καταλόγους γίνεται μέσω κλήσεων στο λειτουργικό σύστημα.
Οι σημαντικότερες από αυτές είναι:
-  delete 
 -  Διαγραφή ενός αρχείου από έναν κατάλογο
 -  get attributes 
 -  Ανάγνωση των ιδιοχαρακτηριστικών ενός αρχείου
 -  set attributes 
 -  Αλλαγή των ιδιοχαρακτηριστικών ενός αρχείου
 -  rename 
 -  Μετονομασία ενός αρχείου (ή καταλόγου)
 -  mkdir 
 -  Δημιουργία ενός καταλόγου
 -  rmdir 
 -  Διαγραφή ενός καταλόγου
 -  opendir 
 -  Αρχή πρόσβασης στα στοιχεία ενός καταλόγου
 -  readdir 
 -  Ανάγνωση στοιχείων από έναν κατάλογο
 -  closedir 
 -  Τέλος της πρόσβασης στον κατάλογο
 -  link 
 -  Σύνδεση δύο αρχείων μεταξύ τους
 -  symlink 
 -  Συμβολική σύνδεση δύο αρχείων μεταξύ τους
 
Υλοποίηση καταλόγων
Οι κατάλογοι τυπικά υλοποιούνται ως πίνακες που περιέχουν:
- το όνομα του αρχείου
 - στοιχεία για τη θέση των δεδομένων του
 - στοιχεία για τα ιδιοχαρακτηριστικά του
 
Διαχείριση χώρου
-  Η διαχείριση του χώρου του δίσκου γίνεται με τη χρήση τμημάτων
σταθερού μεγέθους (512 bytes - 32 Kbyte).
 -  Το μέγεθος των τμημάτων εξαρτάται από περιορισμούς του
υλικού και του λειτουργικού συστήματος.
 -  Το μέγεθος των τμημάτων επηρεάζει άμεσα τη σπατάλη χώρου στο δίσκο.
 -  Τα ελεύθερα τμήματα μπορούν να απεικονίζονται:
- με συνδεδεμένη λίστα ή
 - με χάρτη bits.
 
 -  Συχνά το λειτουργικό σύστημα επιβάλλει 
όρια χρήσης (quota) χώρου στο δίσκο
για κάθε χρήστη.
 
Αξιοπιστία συστημάτων αρχείων
Το λειτουργικό σύστημα ή εξωτερικά προγράμματα μεριμνούν για
-  τη διαχείριση κατεστραμμένων τμημάτων του δίσκου
 -  την αντιγραφή των περιεχομένων του δίσκου σε άλλο
μέσο
εφεδρεία (backup).
Για λόγου ταχύτητας υλοποιείται συχνά σύστημα
προοδευτικής εφεδρείας (incremental backup).
 -  τη συνέπεια του συστήματος των αρχείων (fsck, scandisk, chkdsk).
 -  την επαναφορά διαγραμμένων αρχείων
 
Επίδοση συστημάτων αρχείων
- 
Για τη μείωση του χρόνου πρόσβασης στα αρχεία χρησιμοποιείται
συχνά η τεχνική της
κρυφής μνήμης (cache memory).
Αυτή μπορεί να υλοποιηθεί σε συνδυασμό με το σύστημα σελιδοποίησης και
με τη χρήση αντίστοιχων τεχνικών επιλογής των τμημάτων που θα
φυλαχθούν σε αυτή.
Για την εξασφάλιση των δεδομένων που γράφονται στα αρχεία οι
εγγραφές σε περιοχές του δίσκου που αντιστοιχούν σε κρυφή μνήμη
μεταφέρονται άμεσα και στο δίσκο, ή μεταφέρονται στο δίσκο
σε τακτά χρονικά διαστήματα.
Ορισμένες υλοποιήσεις διαφοροποιούν την εγγραφή των δεδομένων ανάλογα
με το είδος τους (δεδομένα ή μεταδεδομένα).
 - 
Για τη βελτίωση της απόδοσης του συστήματος αρχείων υλοποιούνται συχνά
τεχνικές οι οποίες βοηθούν στην κατανομή δεδομένων στα οποία θα
γίνεται η πρόσβαση χρονικά κοντά σε αντίστοιχα κοντινές περιοχές του
δίσκου.
 - 
Με τη δημιουργία και διαγραφή αρχείων μπορεί να συμβεί η δομή του συστήματος
αρχείων να υποστεί σοβαρό
κατακερματισμό (fragmentation).
Λόγω της αντίστοιχης πτώσης της απόδοσης ο σχεδιασμός του συστήματος
μπορεί να αποτρέπει τον κατακερματισμό, ή να διαθέτει ειδικό
πρόγραμμα που να τον αποκαθιστά.
 
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 199-248
	Εκδόσεις Παπασωτηρίου, 1993.
 
Εργασία στο εργαστήριο
Διαβάστε τη σελίδα του εγχειριδίου του Unix για τις κλήσεις
open και stat.
Προσέξτε τις παραμέτρους που λαμβάνουν και τον αριθμό των
πιθανών λαθών που ελέγχουν.
kerkis:/proc$ man  2 open | head -20
OPEN(2)                    System calls                   OPEN(2)
NAME
       open, creat - open and possibly create a file or device
SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
       int creat(const char *pathname, mode_t mode);
DESCRIPTION
       open  attempts to open a file and return a file descriptor              
...
Μετρήστε το χρόνο που χρειάζεται η αντιγραφή ενός αρχείου στο ψευδοαρχείο
/dev/null.
Εκτελέστε την εντολή ξανά και συγκρίνετε τους χρόνους.
Παρατηρήστε το αποτέλεσμα της κρυφής μνήμης.
athena:~> cd /usr/man/man1
athena:/usr/man/man1>     
athena:/usr/man/man1> time cat pgp.1 >/dev/null
0.000u 0.030s 0:00.20 15.0% 0+0k 0+0io 16pf+0w
athena:/usr/man/man1> time cat pgp.1 > /dev/null
0.000u 0.030s 0:00.02 150.0% 0+0k 0+0io 16pf+0w
athena:/usr/man/man1>
Θέματα  ασφάλειας
Το περιβάλλον ασφάλειας
Σε πληροφοριακά συστήματα ελλοχεύει ο κίνδυνος τα δεδομένα που φυλάσσονται σε
αυτό να:
-  χαθούν, καταστραφούν, ή σβηστούν,
 -  αλλοιωθούν
 -  διαδοθούν χωρίς την απαιτούμενη δικαιοδοσία
 
Επιπλέον το ίδιο το σύστημα μπορεί να:
-  χρησιμοποιηθεί χωρίς άδεια,
 -  γίνει αντικείμενο βανδαλισμού.
 
Ενδεχόμενα κίνητρα για τις παραπάνω πράξεις μπορεί να είναι:
-  περιέργεια,
 -  άμεσο οικονομικό όφελος,
 -  πρόκληση,
 -  εμπορική και βιομηχανική κατασκοπία,
 
Ακόμα, σε μια ευνομούμενη πολιτεία πρέπει να προστατεύεται και η ιδιωτική
σφαίρα του κάθε πολίτη (Νόμος για την προστασία του ατόμου από την 
επεξεργασία δεδομένων προσωπικού χαρακτήρα).
Πολιτικές και μηχανισμοί ασφαλείας
Η προστασία ενός πληροφοριακού συστήματος γίνεται με βάση κάποια
πολιτική ασφαλείας (security policy) η οποία κατ'
ελάχιστο ορίζει ποιος έχει πρόσβαση σε τι
και υλοποιείται με βάση ορισμένους
μηχανισμούς ασφαλείας (security mechanisms).
Παράδειγμα πολιτικής ασφαλείας είναι η διαβάθμιση των στρατιωτικών εγγράφων.
Παράδειγμα μηχανισμού ασφαλείας είναι το σύστημα προστασίας των αρχείων
του Unix.
Πιστοποίηση ταυτότητας
Βασικό στοιχείο για την προστασία ενός συστήματος είναι η ταυτοποίηση
του χρήστη.
Αυτή μπορεί να βασίζεται σε:
-  μια μυστική πληροφορία (κάτι που γνωρίζει ο χρήστης),
 -  μια συσκευή (κάτι που κατέχει ο χρήστης),
 -  βιομετρικά χαρακτηριστικά (κάτι που είναι ο χρήστης),
 -  τον τόπο (κάπου που βρίσκεται ο χρήστης).
 
Προσδιορισμός προστασίας
Μερικά προβλήματα
-  Βανδαλισμός (vandalism)
 - 
Η δόλια βλάβη η παρεμπόδιση χρήσης ενός πληροφοριακού συστήματος.
 -  Δούρειος ίππος (Trojan horse)
 - 
Ένα πρόγραμμα το οποίο παραβιάζει μια πολιτική ασφάλειας εμφανιζόμενο
να εκτελεί άλλες λειτουργίες από αυτές που πραγματικά εκτελεί.
 -  Ιός (Virus)
 - 
Πρόγραμμα το οποίο κολλάει σε άλλα προγράμματα αλλάζοντας το εκτελέσιμο
τμήμα τους.
 -  Σκουλήκι (Worm)
 
Διάταξη στον κώδικα ενός προγράμματος η οποία επιτρέπει την παράκαμψη
ενός μηχανισμού ασφαλείας.
Ασφάλεια στο Internet
Το Internet λόγω της μεγάλης διάδοσης που παρουσιάζει ορισμένα ιδιαίτερα
προβλήματα και χαρακτηριστικά που σχετίζονται με την ασφάλεια:
-  rsh/rexec/rlogin 
 -  Προβληματική η πιστοποίηση του χρήστη
 -  telnet/ftp 
 -  Μεταφορά των κωδικών και των δεδομένων χωρίς κρυπτογράφηση
 -  NFS/SMB 
 -  Προβληματική η πιστοποίηση
 -  SMTP 
 -  Εύκολη η δημιουργία πλαστών μηνυμάτων
 -  WWW 
 -  Δύσκολη η υλοποίηση ασφαλών συναλλαγών
 -  Εκτελέσιμο περιεχόμενο (π.χ. Java, ActiveX) 
 -  Δύσκολος ο έλεγχος του περιεχομένου
 -  Άλλες υπηρεσίες 
 -  Συχνές ανασφαλείς υλοποιήσεις
 
Για την εξασφάλιση από μερικούς κινδύνους δικτύων οργανισμών που δεν είναι
δυνατό να διασφαλιστούν ανά μηχάνημα χρησιμοποιείται η τεχνολογία των
πυρίμαχων τοίχων (firewall).
Ο πυρίμαχος τοίχος τοποθετείται στην περίμετρο του δικτύου της εταιρίας και
υλοποιεί μια καθορισμένη πολιτική ασφαλείας.
Ο ανθρώπινος παράγοντας
-  Συχνά ο ανθρώπινος παράγοντας είναι ο ασθενέστερος κρίκος της
αλυσίδας ασφαλείας.
 -  Ο άνθρωπος μπορεί να ξεχάσει να ελέγξει κάτι,
 -  να παραπλανηθεί, ή
 -  να δωροδοκηθεί.
 
Βασικές αρχές κρυπτογραφίας
Μερικές λύσεις σε θέματα ασφαλείας βασίζονται στην κρυπτογραφία.
Αυτή μπορεί να διασφαλίσει:
Για την υλοποίηση των παραπάνω χρησιμοποιούνται αλγόριθμοι:
Τέλος για τη φύλαξη και ασφαλή διανομή στοιχείων των ψηφιακών υπογραφών
μπορούν να χρησιμοποιηθούν
έμπιστες τρίτες οντότητες (trusted third parties)
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 248-278
	Εκδόσεις Παπασωτηρίου, 1993.
 - Δημήτρης Γκρίτζαλης και Στέφανος Γκρίτζαλης
Ασφάλεια λειτουργικών συστημάτων.
	Εκδόσεις ΜΙΤ Εκπαιδευτική - Αναπτυξιακή, 1993.
 
- Peter J. Denning.
Computers Under Attack: Intruders, Worms, and Viruses.
Addison-Wesley, 1990.
 
- Tom Forester and
  Perry Morrison.
Computer Ethics: Cautionary Tales and Ethical Dilemmas in
  Computing.
MIT Press, 1990.
 
- F. T. Grampp and R. H.
  Morris.
UNIX operating system security.
Bell System Technical Journal, 63(8), October 1984.
 
- Stefanos
  Gritzalis and Diomidis Spinellis.
Addressing threats
  and security issues in World Wide Web technology.
In Proceedings CMS '97 3rd IFIP TC6/TC11 International joint working
  Conference on Communications and Multimedia Security, pages 33–46,
  Athens, Greece, September 1997. IFIP, Chapman & Hall.
 
- Stefanos
  Gritzalis and Diomidis Spinellis.
Cryptographic
  protocols over open distributed systems: A taxonomy of flaws and related
  protocol analysis tools.
In 16th International Conference on Computer Safety, Reliability and
  Security: SAFECOMP '97, pages 123–137, York, UK, September 1997.
  European Workshop on Industrial Computer Systems: TC-7, Springer Verlag.
 
- Robert Morris.
Password security: A case history.
Communications of the ACM, 22(11):594–597, November 1979.
 
- Charles Pfleeger.
Security in Computing.
Prentice-Hall, 1996.
 
- Dennis M. Ritchie.
On the
  security of UNIX.
In UNIX Programmer's manual: Supplementary Documents, volume 2,
  pages 592–594. Holt, Rinehart and Winston, seventh edition, 1982.
 
- Eugene H. Spafford.
The internet worm program: An analysis.
Technical Report CSD-TR-823, Purdue University, West Lafayette, IN 47907-2004,
  November 1988.
 
- Ken L. Thompson.
Reflections on trusting trust.
Communications of the ACM, 27(8):761–763, 1984.
 
Εργασία στο εργαστήριο
Αρχεία που σχετίζονται με την ασφάλεια
Μελετήστε το περιεχόμενο των αρχείων:
-  /etc/passwd (5)
 -  Κωδικοί χρηστών (πλασματικοί)
 -  /etc/shadow (5)
 -  Κωδικοί χρηστών (πραγματικοί, χωρίς δικαίωμα πρόσβασης)
 -  /etc/group (5)
 -  Μέλη ομάδων
 -  /etc/shells (5)
 -  Επιτρεπόμενοι φλοιοί
 -  /etc/inetd.conf (5)
 -  Παρεχόμενες υπηρεσίες του Internet
 
Εντολές που σχετίζονται με την ασφάλεια
Μελετήστε τις εντολές:
- chmod (1)
 - Αλλαγή των χαρακτηριστικών προστασίας ενός αρχείου
 - chown (1)
 - Αλλαγή του ιδιοκτήτη ενός αρχείου
 - chgrp (1)
 - Αλλαγή της ομάδας-ιδιοκτήτη ενός αρχείου
 - newgrp (1)
 - Αλλαγή της ομάδας ενός χρήστη
 
Κλήσεις που σχετίζονται με την ασφάλεια
Μελετήστε τις κλήσεις:
- chmod (2)
 - Αλλαγή των χαρακτηριστικών προστασίας ενός αρχείου
 - setuid (2)
 - Αλλαγή του χρήστη που εκτελεί μια διεργασία
 
Είσοδος και έξοδος
Σχεδίαση υλικού
- Οι συσκευές εσόδου εξόδου μπορούν να διαχωριστούν σε:
 - Οι συσκευές ελέγχονται με τη χρήση 
ελεγκτών συσκευών (device controller) που επικοινωνούν
με την κεντρική μονάδα επεξεργασίας μέσω του διαύλου.
 - Σε μεγαλύτερα συστήματα η επικοινωνία μπορεί να γίνεται με τη χρήση
εξειδικευμένων υπολογιστών εισόδου εξόδου.
 -  Η επικοινωνία με του ελεγκτές γίνεται μέσω εντολών που στέλνονται
μέσω διαύλου εισόδου / εξόδου ή μέσω ειδικών διευθύνσεων της μνήμης.
 -  Ορισμένοι ελεγκτές για συσκευές που μεταφέρουν μεγάλο όγκο δεδομένων
υποστηρίζουν
απευθείας πρόσβαση στη μνήμη (direct memory access (DMA)).
Αυτή υλοποιείται συνήθως με τη χρήση ενδιάμεσης μνήμης στον ελεγκτή.
 -  Ορισμένοι ελεγκτές δίσκου υποστηρίζουν την 
υπερπήδηση (interleaving) τμημάτων του δίσκου έτσι ώστε
να συμβαδίζει ο χρόνος περιστροφής του δίσκου με το χρόνο ανάγνωσης των στοιχείων
από αυτόν.
 
Σχεδίαση λογισμικού
Το λογισμικό εισόδου εξόδου εξασφαλίζει:
Για την ικανοποίηση των παραπάνω ο έλεγχος εισόδου εξόδου σε ένα
λειτουργικό σύστημα χωρίζεται στα παρακάτω στρώματα:
-  Χειριστές διακοπών
 -  Οδηγοί συσκευών
 -  Λογισμικό Λ.Σ. ανεξάρτητο από τις συσκευές (ονοματολογία, προστασία)
 -  Λογισμικό επιπέδου χρήστη (ετεροχρονισμός μέσω 
διεργασίας παροχής υπηρεσιών (daemon).
 
Υλοποίηση πρόσβασης σε δίσκους
 
-  Η χρονοδρομολόγιση του βραχίονα του δίσκου μπορεί να γίνει με τους παρακάτω τρόπους: 
 - 
Πολλαπλοί δίσκοι μπορούν να χρησιμοποιηθούν παράλληλα για βελτίωση της
ταχύτητας και της αξιοπιστίας τους με βάση την τεχνολογία
 -  Πλεονάζουσα διάταξη φθηνών δίσκων (Redundant Array of Inexpensive Disks)
 -  Σφάλματα του δίσκου μπορεί να τα χειριστεί ο ελεγκτής του ή το Λ.Σ.
 -  Για τη βελτίωση της απόδοσης του δίσκου μπορεί να χρησιμοποιείται
κρυφή μνήμη στον ελεγκτή, ή από το Λ.Σ.
 -  Ειδική μορφή περιφερειακού τύπου δίσκου είναι ο δίσκος βασισμένος σε RAM.
 
Αξιοποίηση των ρολογιών
Το λειτουργικό σύστημα αξιοποιεί το ρολόι του υπολογιστή το
οποίο είναι υλοποιημένο ως ένας μετρητής για να:
-  γνωρίζει το χρόνο της ημέρας
 -  το χρονοπρογραμματισμό των διεργασιών
 -  την παρακολούθηση της χρήσης της Κ.Μ.Ε.
 -  το χειρισμό κλήσεων εγρήγορσης των χρηστών
 -  τον έλεγχο περιφερειακών που απαιτούν χρονισμό μέσω
χρονιστών επιτήρησης (watchdoc timers).
 -  τη συλλογή στατιστικών στοιχείων
 
Επικοινωνία με το χρήστη
Η επικοινωνία με το χρήστη μπορεί να γίνει μέσω:
-  σειριακών τερματικών
 -  ελεγκτών οθόνης με απευθείας πρόσβαση στη μνήμη
 -  γραφικών τερματικών δικτύου
 
Το λογισμικό εισόδου μπορεί να παρέχει 
ακατέργαστη κατάσταση λειτουργίας (raw mode) και
κατεργασμένη κατάσταση λειτουργίας (cooked mode).
Η τελευταία υποστηρίζει την αλλαγή του κειμένου και την
προβολή (echoing) των χαρακτήρων.
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 283-329
	Εκδόσεις Παπασωτηρίου, 1993.
 
- Maurice J. Bach.
The
  Design of the UNIX Operating System, pages 312–352.
Prentice-Hall, 1986.
 
- Samuel J. Leffler,
  Marshall Kirk McKusick, Michael J. Karels, and John S. Quarterman.
The
  Design and Implementation of the 4.3BSD Unix Operating System,
  pages 167–186, 225–278.
Addison-Wesley, 1988.
 
- Andrew S. Tanenbaum.
Operating Systems: Design and Implementation, pages 110–177.
Prentice-Hall, 1987.
 
Αδιέξοδα
Πόροι
Ένα σύνολο διεργασιών βρίσκεται σε 
αδιέξοδο (deadlock) αν κάθε διεργασία του
συνόλου περιμένει ένα γεγονός που μόνο μια άλλη διεργασία του συνόλου
μπορεί να προκαλέσει.
(Tanenbaum)
Τα αδιέξοδα δημιουργούνται ως αποτέλεσμα της διαχείρισης των πόρων
από τις διαδικασίες.
Κάθε πόρος (resource) μπορεί να είναι
προεκχωρήσιμος (preemptable) δηλαδή να
αποδεσμευτεί από μια διεργασία που τον κατέχει χωρίς παρενέργιες ή
μη προεκχωρήσιμος (nonpreemptable).
Παραδείγματα της πρώτης κατηγορίας είναι ο δίσκος και η μνήμη.
Παραδείγματα της δεύτερης κατηγορίας είναι ο εκτυπωτής και η μονάδα ταινίας.
Τυπικά μια διεργασία χρησιμοποιεί έναν πόρο ως εξής:
-  Ζητά τον πόρο από το λειτουργικό σύστημα (αίτηση χρήσης).
 -  Χρησιμοποιεί τον πόρο.
 -  Ενημερώνει το λειτουργικό σύστημα ότι δε χρειάζεται άλλο τον πόρο
(αποδέσμευση).
 
Η διαδικασία της αίτησης και η αντιμετώπιση αιτήσεων που δεν μπορούν να
καλυφθούν εξαρτόνται από το λειτουργικό σύστημα.
Αδιέξοδα και μοντελοποίησή τους
Οι παρακάτω συνθήκες πρέπει να ικανοποιούνται για να δημιουργηθεί
αδιέξοδο:
-  Αμοιβαίος αποκλεισμός  
 -  Κάθε πόρος είναι δεσμευμένος ή διαθέσιμος.
 -  Δέσμευση και αναμονή 
 -  Διεργασίες που δεσμεύουν πόρους μπορούν να
ζητούν και νέους.
 -  Μη προεκχώρηση 
 -  Μόνο η διεργασία που έχει δεσμεύσει τους πόρους μπορεί
να τους αποδεσμεύσει.
 -  Κυκλική αναμονή 
 -  Οι διαδικασίες που ζητούν πόρους πρέπει να σχηματίζουν
κύκλο.
 
Με βάση την τελευταία συνθήκη τα αδιέξοδα μοντελοποιούνται ως κατευθυνόμενοι
γράφοι με κόμβους τις διεργασίες και τους πόρους.
- Ακμή από διεργασία σε πόρο σημαίνει πως η διεργασία περιμένει να ελευθερωθεί
ο πόρος αυτός.
 - Ακμή από πόρο σε διεργασία σημαίνει πως ο πόρος είναι δεσμευμένος από
την αντίστοιχη διεργασία.
 
Οι παρακάτω στρατηγικές μπορούν να χρησιμοποιηθούν για την αντιμετώπισή τους:
-  Αγνόηση του προβλήματος
 -  Ανίχνευση και επανόρθωση
 -  Δυναμική αποφυγή με προσεκτική κατανομή των πόρων
 -  Πρόληψη με αναίρεση των παραπάνω αναγκαίων συνθηκών
 
Ανίχνευση και επανόρθωση
Η ανίχνευση των αδιεξόδων μπορεί να γίνει με έρευνα του γράφου
των αδιεξόδων για κύκλους.
Αφού ανιχνευθεί το αδιέξοδο η επανόρθωση μπορεί να γίνει με τους
παρακάτω τρόπους:
-  Προεκχώρηση του πόρου
 -  Οπισθοδρόμηση της διεργασίας σε προηγούμενο
σημείο ελέγχου (checkpoint)
 -  Εξάλειψη κάποιων διεργασιών
 
Αποφυγή
Η αποφυγή του αδιεξόδου βασίζεται στη συντηρητική ικανοποίηση των
αιτήσεων για πόρους με στόχο το σύστημα πάντα να βρίσκεται σε μια
ασφαλή κατάσταση κατά την οποία δεν μπορεί να υπάρξει
αδιέξοδο.
Αιτήσεις που οδηγούν σε μη ασφαλείς καταστάσεις δεν ικανοποιούνται.
Πρόληψη
Η αναίρεση μιας τουλάχιστον από τις συνθήκες του αδιεξόδου εξασφαλίζει
ότι δε θα υπάρχουν αδιέξοδα.
-  Αμοιβαίος αποκλεισμός  
 -  (Κάθε πόρος είναι δεσμευμένος ή διαθέσιμος.)
Αποφεύγεται η χρήση δεσμευμένων πόρων π.χ. με τη χρήση ετεροχρονισμού.
 -  Δέσμευση και αναμονή 
 -  (Διεργασίες που δεσμεύουν πόρους μπορούν να
ζητούν και νέους.)
Κάθε διεργασία ζητά από την αρχή τους πόρους που χρειάζεται.
 -  Μη προεκχώρηση 
 -  (Μόνο η διεργασία που έχει δεσμεύσει τους πόρους μπορεί
να τους αποδεσμεύσει.)
Δύσκολο πρακτικά να αναιρεθεί.
 -  Κυκλική αναμονή 
 -  (Οι διαδικασίες που ζητούν πόρους πρέπει να σχηματίζουν
κύκλο.)
Αίτηση για πόρους σύμφωνα με την απαρίθμησή τους.
 
Βάσεις δεδομένων
Σε βάσεις δεδομένων χρησιμοποιείται συχνά το 
κλείδωμα σε δύο φάσεις (two phase locking).
- Οι εγγραφές που χρειάζεται η βάση για να εκτελέσει κάποια συναλλαγή
σε πρώτη φάση κλειδώνονται.
 - Αν κλειδωθούν όλες με επιτυχία τότε ενημερώνονται.
 - Αν όχι, τότε ξεκλειδώνονται όλες και η διεργασία προσπαθεί να εκτελέσει
την ίδια διαδικασία αργότερα.
 
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 331-359
	Εκδόσεις Παπασωτηρίου, 1993.
 
Δομή του λειτουργικού συστήματος Unix
Ιστορία
Χρονολογικός πίνακας του Unix
- Τέλη δεκαετίας 1960
 - Τα Bell Labs (AT&T), GE και το MIT υλοποιούν 
το MULTICS (Multiplexed Information and Computing Services), ένα πολυχρηστικό 
λειτουργικό σύστημα.
Το 1969 τα Bell Labs αποσύρονται από το έργο όταν αυτό έγινε υπερβολικά 
ακριβό και περίπλοκο.
 - 1969
 - Ο Ken Thompson (BL) αναπτύσσει λειτουργικό σύστημα
για έναν χρήστη για τον υπολογιστή DEC PDP-7
 - 1970
 - Ο Brian Kernighan σχηματίζει το όνομα UNIX ως λογοπαίγνιο
του MULTICS.  
Το σύστημα μεταφέρεται στο PDP-11.  
Υποστηρίζει δύο χρήστες, το παγνίδι Spacewar, και επεξεργασία κειμένου.
 - 1973
 - Ο Dennis Ritchie αναπτύσσει σε συνεργασία με τον Thompson
τη γλώσσα προγραμματισμού C και ξαναγράφουν το Unix στη γλώσσα αυτή.
 - Μέσα δεκαετίας 1970
 - Το UNIX (Version 6) διατίθεται δωρεάν σε
πανεπιστήμια.  Μεταφέρεται και σε άλλους υπολογιστές.
Όλος ο πυρήνας αποτελείται από λιγότερες από 10000 γραμμές κώδικα.
 - Τέλη δεκαετίας 1970
 - Εργασία του Thompson μαζί με τον Bill Joy
στο Πανεπιστήμιο του Berkeley (UCB) καταλήγει στην Berkeley Software Distribution (BSD).
Αυτή υποστηρίζει μεταξύ άλλων ιδεατή μνήμη και σελιδοποίηση.
 - 1980
 - Η Microsoft παράγει το XENIX.  
Κυκλοφορεί η πρώτη έκδοση 32 bit, το BSD 4.1.
 - 1983
 - Κυκλοφορεί νέα έκδοση από την
 AT&T με το όνομα System V.  
 Η AT&T την προωθεί ως πρότυπο με τελική μορφή την έκδοση
 SVR4 μετά την υιοθέτηση χαρακτηριστικών του BSD 4.2.
 Παράλληλα η Sun κυκλοφορεί το SunOS με τελική μορφή το Solaris.
 Το Unix διαχωρίζεται σε αντίπαλα στρατόπεδα.
 - 1985
 - Η AT&T δημοσιεύει το πρότυπο SVID
(System V Interface Definition).  
Η ομάδα X/OPEN (αργότερα UNIX International) δημοσιεύει αντίστοιχο πρότυπο.  
Το πρότυπο POSIX 1003.1 υιοθετείται ως κοινό πεδίο.
 - 1988
 - Η Open Software Foundation (OSF) 
ανταγωνίζεται την UI με βάση το AIX της IBM.  
Στο πανεπιστήμιο Carnegie Mellon αναπτύσσεται ο μικρο-πυρήνας MACH.
 - Δεκαετία 1990
 - Αναπτύσσονται και διανέμονται
εκδόσεις του Unix που δε βασίζονται σε κώδικα της AT&T.
Τα BSDI, 386BSD, NetBSD και FreeBSD βασίζονται στη διανομή Net/2 και
αργότερη στην 4.4BSD Lite του Berkeley με κώδικα για τον επεξεργαστή 
Intel 386 από τον Bill Jolitz, ενώ το Linux βασίζεται σε κώδικα που έγραψε 
από την αρχή ο Linux Torvalds.
 
Γενεαλογικό δένδρο του Unix
Το παρακάτω σχήμα (βασισμένο στο βιβλίο Life with Unix)
παριστάνει τη γενεαλογία του Unix:
Κλήσεις του λειτουργικού συστήματος
Όλες οι κλήσεις του λειτουργικού συστήματος χαρακτηρίζονται εσωτερικά
από έναν αριθμό με βάση τον οποίο δρομολογούνται στον αντίστοιχο κώδικα
του πυρήνα.
Ο παρακάτω πίνακας περιέχει τις πρώτες 20 κλήσεις του FreeBSD Unix:
#define SYS_syscall     0
#define SYS_exit        1
#define SYS_fork        2
#define SYS_read        3
#define SYS_write       4
#define SYS_open        5
#define SYS_close       6
#define SYS_wait4       7
                                /* 8 is old creat */
#define SYS_link        9
#define SYS_unlink      10
                                /* 11 is obsolete execv */
#define SYS_chdir       12
#define SYS_fchdir      13
#define SYS_mknod       14
#define SYS_chmod       15
#define SYS_chown       16
#define SYS_break       17
#define SYS_getfsstat   18
                                /* 19 is old lseek */
#define SYS_getpid      20
Για παράδειγμα ο παρακάτω κώδικας του πυρήνα υλοποιεί την κλήση getpid:
int
getpid(p, uap)
        struct proc *p;
        struct getpid_args *uap;
{
        p->p_retval[0] = p->p_pid;
        return (0);
}
Διεργασίες
Κάθε διεργασία φυλάσσεται στον πίνακα διεργασιών με βάση τα
παρακάτω πεδία:
struct  proc {
        TAILQ_ENTRY(proc) p_procq;      /* run/sleep queue. */
        LIST_ENTRY(proc) p_list;        /* List of all processes. */
        /* substructures: */
        struct  pcred *p_cred;          /* Process owner's identity. */
        struct  filedesc *p_fd;         /* Ptr to open files structure. */
        struct  pstats *p_stats;        /* Accounting/statistics (PROC ONLY). */
        struct  plimit *p_limit;        /* Process limits. */
        struct  vm_object *p_upages_obj;/* Upages object */
        struct  sigacts *p_sigacts;     /* Signal actions, state (PROC ONLY). */
        int     p_flag;                 /* P_* flags. */
        char    p_stat;                 /* S* process status. */
        char    p_pad1[3];
        pid_t   p_pid;                  /* Process identifier. */
        LIST_ENTRY(proc) p_hash;        /* Hash chain. */
        LIST_ENTRY(proc) p_pglist;      /* List of processes in pgrp. */
        struct  proc *p_pptr;           /* Pointer to parent process. */
        LIST_ENTRY(proc) p_sibling;     /* List of sibling processes. */
        LIST_HEAD(, proc) p_children;   /* Pointer to list of children. */
        struct callout_handle p_ithandle; /*
                                              * Callout handle for scheduling
                                              * p_realtimer.
                                              */
        pid_t   p_oppid;         /* Save parent pid during ptrace. XXX */
        int     p_dupfd;         /* Sideways return value from fdopen. XXX */
        struct  vmspace *p_vmspace;     /* Address space. */
        /* scheduling */
        u_int   p_estcpu;        /* Time averaged value of p_cpticks. */
        int     p_cpticks;       /* Ticks of cpu time. */
        fixpt_t p_pctcpu;        /* %cpu for this process during p_swtime */
        void    *p_wchan;        /* Sleep address. */
        const char *p_wmesg;     /* Reason for sleep. */
        u_int   p_swtime;        /* Time swapped in or out. */
        u_int   p_slptime;       /* Time since last blocked. */
        struct  itimerval p_realtimer;  /* Alarm timer. */
        struct  timeval p_rtime;        /* Real time. */
        u_quad_t p_uticks;              /* Statclock hits in user mode. */
        u_quad_t p_sticks;              /* Statclock hits in system mode. */
        u_quad_t p_iticks;              /* Statclock hits processing intr. */
        struct  timeval *p_sleepend;    /* Wake time for nanosleep & friends */
        int     p_traceflag;            /* Kernel trace points. */
        struct  vnode *p_tracep;        /* Trace to vnode. */
        int     p_siglist;              /* Signals arrived but not delivered. */
        struct  vnode *p_textvp;        /* Vnode of executable. */
        char    p_lock;                 /* Process lock (prevent swap) count. */
        char    p_oncpu;                /* Which cpu we are on */
        char    p_lastcpu;              /* Last cpu we were on */
        char    p_pad2;                 /* alignment */
        short   p_locks;                /* DEBUG: lockmgr count of held locks */
        short   p_simple_locks;         /* DEBUG: count of held simple locks */
        register_t p_retval[2];         /* syscall aux returns */
        sigset_t p_sigmask;     /* Current signal mask. */
        sigset_t p_sigignore;   /* Signals being ignored. */
        sigset_t p_sigcatch;    /* Signals being caught by user. */
        u_char  p_priority;     /* Process priority. */
        u_char  p_usrpri;       /* User-priority based on p_cpu and p_nice. */
        char    p_nice;         /* Process "nice" value. */
        char    p_comm[MAXCOMLEN+1];
        struct  pgrp *p_pgrp;   /* Pointer to process group. */
        struct  sysentvec *p_sysent; /* System call dispatch information. */
        struct  rtprio p_rtprio;        /* Realtime priority. */
        struct  user *p_addr;   /* Kernel virtual addr of u-area (PROC ONLY). */
        struct  mdproc p_md;    /* Any machine-dependent fields. */
        u_short p_xstat;        /* Exit status for wait; also stop signal. */
        u_short p_acflag;       /* Accounting flags. */
        struct  rusage *p_ru;   /* Exit information. XXX */
        int     p_nthreads;     /* number of threads (only in leader) */
        void    *p_aioinfo;     /* ASYNC I/O info */
        int     p_wakeup;       /* thread id */
        struct proc *p_peers;   
        struct proc *p_leader;
};
Κάθε διεργασία μπορεί να βρίσκεται σε μια από τις παρακάτω καταστάσεις:
#define SIDL    1               /* Process being created by fork. */
#define SRUN    2               /* Currently runnable. */
#define SSLEEP  3               /* Sleeping on an address. */
#define SSTOP   4               /* Process debugging or suspension. */
#define SZOMB   5               /* Awaiting collection by parent. */
- Ο χρονοπρογραμματισμός των διεργασιών γίνεται με βάση πολλαπλές ουρές
αναμονής.
 - Κάθε ουρά έχει διαφορετική προτεραιότητα.
 - Η αλγόριθμος επιλέγει πάντα τη διεργασία που μπορεί να εκτελεστεί από την
ουρά με την υψηλότερη προτεραιότητα.
 - Η διεργασίες που βρίσκονται στην ίδια ουρά εκτελούνται κυκλικά.
 - Διεργασίες μετακινούνται από ουρά σε ουρά έτσι ώστε να επωφελούνται
οι διαλογικές διεργασίες.
 
Διαχείριση αρχείων
Η διαχείριση αρχείων βασίζεται στη δομή δεδομένων του πίνακα
δεικτών, inode, η οποία περιέχει πληροφορίες για κάθε αρχείο.
Τα βασικά στοιχεία της δομής που βρίσκονται στη μνήμη 
περιέχουν στοιχεία για τη διαχείριση του πίνακα των δεικτών:
struct inode {
        struct   lock i_lock;   /* Inode lock. >Keep this first< */
        LIST_ENTRY(inode) i_hash;/* Hash chain. */
        struct  vnode  *i_vnode;/* Vnode associated with this inode. */
        struct  vnode  *i_devvp;/* Vnode for block I/O. */
        u_int32_t i_flag;       /* flags, see below */
        dev_t     i_dev;        /* Device associated with the inode. */
        ino_t     i_number;     /* The identity of the inode. */
        union {                 /* Associated filesystem. */
                struct  fs *fs;         /* FFS */
                struct  lfs *lfs;       /* LFS */
                struct  ext2_sb_info *e2fs;     /* EXT2FS */
        } inode_u;
        struct   dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */
        u_quad_t i_modrev;      /* Revision level for NFS lease. */
        struct   lockf *i_lockf;/* Head of byte-level lock list. */
        /*
         * The on-disk dinode itself.
         */
        struct  dinode i_din;   /* 128 bytes of the on-disk dinode. */
};
Επιπλεόν το τμήμα κάθε πίνακα δεικτών που βρίσκεται στο δίσκο
περιέχει τα ιδιοχαρακτηριστικά του αρχείου,
δείκτες για τα τμήματα που περιέχουν δεδομένα του αρχείου,
καθώς και δείκτες σε τμήματα που περιέχουν δείκτες σε
τμήματα που περιέχουν δεδομένα του αρχείου.
struct dinode {
        u_int16_t       di_mode;        /*   0: IFMT, permissions; see below. */
        int16_t         di_nlink;       /*   2: File link count. */
        u_int64_t       di_size;        /*   8: File byte count. */
        int32_t         di_atime;       /*  16: Last access time. */
        int32_t         di_atimensec;   /*  20: Last access time. */
        int32_t         di_mtime;       /*  24: Last modified time. */
        int32_t         di_mtimensec;   /*  28: Last modified time. */
        int32_t         di_ctime;       /*  32: Last inode change time. */
        int32_t         di_ctimensec;   /*  36: Last inode change time. */
        ufs_daddr_t     di_db[NDADDR];  /*  40: Direct disk blocks. */
        ufs_daddr_t     di_ib[NIADDR];  /*  88: Indirect disk blocks. */
        u_int32_t       di_flags;       /* 100: Status flags (chflags). */
        int32_t         di_blocks;      /* 104: Blocks actually held. */
        int32_t         di_gen;         /* 108: Generation number. */
        u_int32_t       di_uid;         /* 112: File owner. */
        u_int32_t       di_gid;         /* 116: File group. */
        int32_t         di_spare[2];    /* 120: Reserved; currently unused */
};
Διαχείριση καταλόγων
Οι κατάλογοι αρχείων του συστήματος έχουν την παρακάτω δομή:
struct  direct {
        u_int32_t d_ino;                /* inode number of entry */
        u_int16_t d_reclen;             /* length of this record */
        u_int8_t  d_type;               /* file type, see below */
        u_int8_t  d_namlen;             /* length of string in d_name */
        char      d_name[MAXNAMLEN + 1];/* name with length <= MAXNAMLEN */
};
Σε κάθε κατάλογο μπορούν να φυλαχθούν οι παρακάτω τύποι αρχείων:
#define DT_UNKNOWN       0	/* Άγνωστο */
#define DT_FIFO          1	/* Ουρά FIFO (σωλήνωση) */
#define DT_CHR           2	/* Συσκευή χαρακτήρων */
#define DT_DIR           4	/* Κατάλογος */
#define DT_BLK           6	/* Συσκευή τμημάτων */
#define DT_REG           8	/* Κανονικό αρχείο */
#define DT_LNK          10	/* Δεσμός */
#define DT_SOCK         12	/* Διαδιεργασιακή σύνδεση */
Διαχείριση συστημάτων αρχείων
Το σύστημα Unix υποστηρίζει πολλά διαφορετικά συστήματα αρχείων
(Unix file system, Fast File System, ISO-9660 (CD-ROM file system), FAT, κ.λπ.).
Ένα ιδεατό σύστημα αρχείων δρομολογεί τις κλήσεις με βάση ένα αντικειμενοστρεφές
μοντέλο προς την υλοποίηση του αντίστοιχου συστήματος.
Κάθε σύστημα αρχείων υποστηρίζει ορισμένες από τις παρακάτω κλήσεις:
access(struct vop_access_args *);
advlock(struct vop_advlock_args *);
chmod(struct vnode *, int, struct ucred *, struct proc *);
chown(struct vnode *, uid_t, gid_t, struct ucred *, struct proc *);
close(struct vop_close_args *);
create(struct vop_create_args *);
getattr(struct vop_getattr_args *);
link(struct vop_link_args *);
makeinode(int mode, struct vnode *, struct vnode **, struct componentname *);
missingop(struct vop_generic_args *ap);
mkdir(struct vop_mkdir_args *);
mknod(struct vop_mknod_args *);
mmap(struct vop_mmap_args *);
open(struct vop_open_args *);
print(struct vop_print_args *);
readdir(struct vop_readdir_args *);
readlink(struct vop_readlink_args *);
remove(struct vop_remove_args *);
rename(struct vop_rename_args *);
rmdir(struct vop_rmdir_args *);
setattr(struct vop_setattr_args *);
strategy(struct vop_strategy_args *);
symlink(struct vop_symlink_args *);
Σελιδοποίηση
Κάθε σελίδα συνδέεται με την παρακάτω δομή δεδομένων που περιγράφει
τα χαρακτηριστικά της:
struct vm_page {
        TAILQ_ENTRY(vm_page) pageq;     /* queue info for FIFO queue or free list (P) */
        TAILQ_ENTRY(vm_page) hashq;     /* hash table links (O) */
        TAILQ_ENTRY(vm_page) listq;     /* pages in same object (O) */
        vm_object_t object;             /* which object am I in (O,P) */
        vm_pindex_t pindex;             /* offset into object (O,P) */
        vm_offset_t phys_addr;          /* physical address of page */
        u_short queue;                  /* page queue index */
        u_short flags,                  /* see below */
                pc;                     /* page color */
        u_short wire_count;             /* wired down maps refs (P) */
        short hold_count;               /* page hold count */
        u_char  act_count;              /* page usage count */
        u_char  busy;                   /* page busy count */
        /* NOTE that these must support one bit per DEV_BSIZE in a page!!! */
        /* so, on normal X86 kernels, they must be at least 8 bits wide */
        u_char  valid;                  /* map of valid DEV_BSIZE chunks */
        u_char  dirty;                  /* map of dirty DEV_BSIZE chunks */
};
Αντίστοιχα η σελίδα μπορεί να βρίσκεται σε μια από τις παρακάτω καταστάσεις:
#define PG_BUSY         0x01            /* page is in transit (O) */
#define PG_WANTED       0x02            /* someone is waiting for page (O) */
#define PG_TABLED       0x04            /* page is in VP table (O) */
#define PG_FICTITIOUS   0x08            /* physical page doesn't exist (O) */
#define PG_WRITEABLE    0x10            /* page is mapped writeable */
#define PG_MAPPED       0x20            /* page is mapped */
#define PG_ZERO         0x40            /* page is zeroed */
#define PG_REFERENCED   0x80            /* page has been referenced */
#define PG_CLEANCHK     0x100           /* page has been checked for cleaning */
Όλες οι σελίδες ανοίκουν σε μια από 5 διαφορετικές λίστες ταξινομημένες
σύμφωνα με το κριτήριο LRU (Least Recently Used - Λιγότερο πρόσφατη
χρησιμοποιημένη).
 -       free
 - 
Σελίδες έτοιμες για χρήση.
 
 -       cache
 - 
Σελίδες σχεδόν έτοιμες για χρήση αφού ελευθερωθούν από τη
χρήση βοηθητικής μνήμης.
 
 -       inactive
 - 
Σελίδες που δεν έχουν χρησιμοποιηθεί πρόσφατα και είναι υποψήφιες
για νέα χρήση.
 
 -       active
 - 
Σελίδες που έχουν πρόσφατα χρησιμοποιηθεί.
 
 -       zero
 - 
Ελεύθερες σελίδες που έχουν μηδενιστεί.
 
Βιβλιογραφία
- Andrew S. Tanenbaum
Σύγχρονα λειτουργικά συστήματα. σ. 363-435
	Εκδόσεις Παπασωτηρίου, 1993.
 
- Maurice J. Bach.
The
  Design of the UNIX Operating System.
Prentice-Hall, 1986.
 
- Samuel J. Leffler,
  Marshall Kirk McKusick, Michael J. Karels, and John S. Quarterman.
The
  Design and Implementation of the 4.3BSD Unix Operating System.
Addison-Wesley, 1988.
 
- Don Libes and Sandy
  Ressler.
Life
  with UNIX.
Prentice-Hall, 1989.
 
- AT & T, editor.
UNIX System Readings and Applications, volume I, II.
Prentice-Hall, 1987.
 
- Andrew S. Tanenbaum.
Operating Systems: Design and Implementation.
Prentice-Hall, 1987.
 
- Mitchell Waite, editor.
UNIX
  Papers for UNIX Developers and Power Users.
Howard W. Sams & Company, 1987.
 
Δομή του λειτουργικού συστήματος Windows-NT
Ιστορία
Η ανάπτυξη του λειτουργικού συστήματος Windows NT ξεκίνησε από τη Microsoft
το 1988 ως αποτέλεσμα της απογοήτευσης της Microsoft σχετικά με το
λειτουργικό σύστημα OS/2 το οποίο ανέπτυσσε σε συνεργασία με την IBM.
Συγκεκριμένα, το OS/2 βασιζόταν σε τεχνολογικές αποφάσεις που δεν επέτρεπαν
την εκμετάλλευση ανερχομένων τεχνολογιών όπως:
Στην ανάπτυξη ηγετικό ρόλο έπαιξε ο Dave Cutler ο οποίος προερχόμενος από την
εταιρία Digital ήταν βασικός αρχιτέκτονας του λειτουργικού συστήματος
VAX VMS.
Στόχοι
Ο σχεδιασμός και η υλοποίηση των Windows NT βασίστηκαν σε ορισμένους
βασικούς στόχους.
 Μεταφερσιμότητα
-  Υποστήριξη πολλαπλών υπολογιστικών αρχιτεκτονικών 
  
  - Intel x86/Pentium
  
 - DEC Alpha AXP
  
 - MIPS R4x00 (δεν υποστηρίζεται πλέον)
  
 - Intergraph Clipper (δεν υποστηρίχθηκε ποτέ εμπορικά;)
  
 
 -  Απομόνωση των τμημάτων που έχουν άμεση σχέση με το υλικό.
 -  Στη δομή περιλαμβάνεται ένα επίπεδο αφαίρεσης ιδιοτήτων του υλικού
    το Hardware Abstraction Layer (HAL).
 
 Ασφάλεια
-  Σχεδιασμένο για να μπορεί να πιστοποιηθεί σε επίπεδο C2
 -  Όλα τα αντικείμενα στα οποία η πρόσβαση μπορεί να γίνει από
πάνω από μια οντότητα προστατεύονται μέσω μιας λίστας ελέγχου προσπέλασης.
 
 Συμβατότητα 
-  MS-DOS και Windows 3.X
 -  LAN Manager (η υποστήριξη δικτύου PC της IBM)
 -  Μη γραφικές εφαρμογές 16 bit του OS/2 1.X
 -  Συστήματα αρχείων FAT (MS-DOS) και HPFS (OS/2)
 -  POSIX (Unix)
 
 Επεκτασιμότητα 
-  Επεκτάσεις χωρίς προνομιούχο κώδικα (υποσυστήματα)
 -  Οδηγοί συσκευών
 -  Συστήματα αρχείων
 -  Συστήματα αρχείων δικτύου (network redirectors)
 
 Στιβαρότητα 
(Προφανώς σε σχέση με άλλα λειτουργικά συστήματα της Microsoft)
 Διασυνδεσιμότητα 
-  LAN Manager (IBM PC)
 -  TCP/IP (Internet)
 -  DECNet (Digital)
 -  Υπηρεσίες SNA (ΙΒΜ mini/mainframe)
 -  Macintosh (Apple)
 -  Netware (Novell)
 
 Διεθνοποίηση 
-  Εύκολη τοπική προσαρμογή 
 -  Όλες οι συμβολοσειρές είναι σε Unicode
 
Μικροπυρήνας
 
  | Εκτελεστής | 
 
  | Υποσύστημα εισόδου εξόδου | 
  Παρακολουθητής ασφάλειας | 
  Διαδιεργασιακή επικοινωνία | 
  Υπηρεσίες αντικειμένων | 
  Ιδεατή μνήμη | 
  Δομή διεργασίας | 
 
  | Συστήματα αρχείων | 
  Διαχείριση αντικειμένων | 
  Εκτελεστής | 
 
  | Οδηγοί συσκευών | 
  Αφαίρεσης ιδιοτήτων του υλικού (HAL) | 
  Μικροπυρήνας | 
 
  | Διεπαφή υλικού | 
 
  | Συσκευές εισόδου εξόδου | 
  Απευθείας πρόσβαση στη μνήμη (DMA) | 
  Απεικόνιση του διαύλου | 
  Ρολόι και χρονόμετρα | 
  Έλεγχος βοηθητικής μνήμης | 
  Διεκπεραίωση διακοπών | 
  Αρχιτεκτονική προνομίων | 
Τα Windows NT βασίζονται στη δομή του μικροπυρήνα.
Αυτός προσφέρει τις παρακάτω υπηρεσίες:
-  υποστήριξη της αρχιτεκτονικής του επεξεργαστή,
 -  συγχρονισμός χαμηλού επιπέδου,
 -  υποστήριξη διακοπών και εξαιρέσεων,
 -  λειτουργίες υλικού χαμηλού επιπέδου,
 -  αντικείμενα διεκπεραίωσης και ελέγχου.
 
Το σύνολο του κώδικα είναι περίπου 60Κ.
Ο κώδικας εκτελείται χωρίς προεκχώρηση και σελιδοποίηση, αλλά με 
υποστήριξη διακοπών.
Τα αντικείμενα διεκπεραίωσης είναι:
Τα αντικείμενα ελέγχου είναι:
-  διεργασίες,
 -  διακοπές,
 -  ουρές συσκευών,
 -  ασύγχρονες κλήσεις διαδικασιών,
 -  κλήσεις διαδικασιών υπό αναβολή.
 
Εκτελεστής
Ο εκτελεστής αποτελεί το άνω τμήμα του πυρήνα και επικοινωνεί με τις
διεργασίες του χρήστη.
Περιλαμβάνει ξεχωριστά τμήματα τα οποία προσφέρουν συγκεκριμένες
υπηρεσίες.
Τμήματα του εκτελεστή μπορούν να βρίσκονται σε ιδεατή μνήμη
μέσω σελιδοποίησης.
Υπηρεσίες διαχείρισης αντικειμένων
Οι υπηρεσίες διαχείρισης αντικειμένων προσφέρουν:
-  ομοιόμορφο σύστημα ονοματοδοσίας,
 -  έλεγχο πρόσβασης με αντίστοιχες λίστες ελέγχου πρόσβασης,
 -  διαδικασίες για τη δημιουργία αντικειμένων του χρήστη (διεργασίες,
νήματα,  γεγονότα, αρχεία).
 
Διαχείριση μνήμης
Το υποσύστημα διαχείρισης μνήμης προσφέρει:
-  περιβάλλον 4GB σελιδοποιημένης μνήμης,
 -  αρχεία που απεικονίζονται στη μνήμη,
 -  λειτουργίες μεταξύ διεργασιών,
 -  σελίδες που αντιγράφονται κατά την εγγραφή τους,
 -  πολλαπλά αρχεία σελιδοποίησης,
 -  υποστήριξη για το διαχειριστή κρυφής μνήμης.
 
Υποσύστημα εισόδου εξόδου
Το υποσύστημα εισόδου και εξόδου προσφέρει:
-  ασύγχρονο μοντέλο εισόδου και εξόδου,
 -  αντικείμενα στα οποία η πρόσβαση γίνεται με τον τρόπο open, operate, close,
 -  υπηρεσίες για οδηγούς συσκευών και συστήματα αρχείων,
 -  γενικευμένη κρυφή μνήμη, ενοποιημένη με το σύστημα διαχείρισης μνήμης.
 
Σύστημα αρχείων NTFS
Το σύστημα αρχείων NTFS έχει τα παρακάτω χαρακτηριστικά:
-  υποστηρίζει μεγάλους δίσκους και αρχεία με τη χρήση 64 bit
για το μέγεθος του αρχείου,
 -  επιτρέπει την αποκατάστασή του μετά από ανώμαλες καταστάσεις σε μικρό 
χρόνο,
 -  όλα τα ονόματα των αρχείων φυλάσσονται σε UNICODE,
 -  η πρόσβαση σε αρχεία γίνεται με βάση λίστες ελέγχου πρόσβασης,
 
 
Διαδιεργασιακή επικοινωνία
Η διαδιεργασιακή επικοινωνία γίνεται μέσω του μηχανισμού Local Procedure
Call (τοπική κλήση διαδικασίας).
Ο μηχανισμός αυτός αποτελεί μια αποδοτική υλοποίηση της κλήσης διαδικασιών
σε απομακρυσμένους υπολογιστές (remote procedure call).
Οι διεργασίες μπορούν να καλούν διαδικασίες σε άλλες διεργασίες μέσω του 
εκτελεστή και να μεταφέρουν δεδομένα μέσω διαμοιρασμένης μνήμης.
Για λόγους ασφαλείας μια διεργασία εξυπηρετητή μπορεί να υποδυθεί τα
χαρακτηριστικά ασφαλείας του πελάτη που την καλεί.
Η εξυπηρέτηση της επικοινωνίας γίνεται μέσω ενός ξεχωριστού νήματος για
κάθε σύνδεση μεταξύ δύο διεργασιών.
Το ίδιο μοντέλο επικοινωνίας χρησιμοποιείται και για τις κλήσεις
από τις διεργασίες προς το λειτουργικό σύστημα.
Πολιτική σελιδοποίησης
Η πολιτική σελιδοποίησης είναι απλή και παρακολουθεί τη χρήση μνήμης
για κάθε διεργασία ξεχωριστά.
Όταν υπάρχει διαθέσιμη μνήμη στο σύστημα οι σελίδες του συνόλου εργασίας
της διεργασίας αυξάνονται, σε αντίθετη περίπτωση οι σελίδες μειώνονται.
Υποσυστήματα
Τα 
υποσυστήματα (subsystems) των Windows ΝΤ επιτρέπουν τη 
μίμηση διαφορετικών συστημάτων:
-  Windows (περιλαμβάνει και εφαρμογές MS-DOS και Windows 3.1)
 -  POSIX (για εφαρμογές Unix)
 -  16 bit OS/2
 -  περιβάλλον αποσφαλμάτωσης (ελέγχει εφαρμογές για λάθη)
 
Η λειτουργία των υποσυστημάτων βασίζεται στο μοντέλο του πελάτη υπηρέτη.
Κάθε διεργασία εκτελείται ως πελάτης του συγκεκριμένου υποσυστήματος για
το οποίο είναι σχεδιασμένη.
Το υποσύστημα εκτελείται έξω από τον πυρήνα ως υπηρέτης που λαμβάνει
εντολές από τη διεργασία και τις μεταβιβάζει στον πυρήνα του λειτουργικού
συστήματος.
Ορισμένες λειτουργίες του υποσυστήματος μπορεί να εκτελούνται απευθείας
στον υπηρέτη του χωρίς τη διαμεσολάβηση του πυρήνα.
Νήματα
Τα νήματα προσδίδουν στο λειτουργικό σύστημα τα παρακάτω πλεονεκτήματα:
 -  ταχύτερη απόκριση,
 
 -  ευκολότερη υλοποίηση παράλληλων αλγορίθμων,
 
 -  ασύγχρονη απόκριση σε γεγονότα,
 
 -  φθηνή επικοινωνία μεταξύ νημάτων,
 
 -  εκμετάλλευση συμμετρικής πολυεπεξεργασίας.
 
Ακόμα, τα νήματα επιτρέπουν στις εφαρμογές:
 -  διαχωρισμό των λειτουργιών τους (εκτύπωση, σελιδοποίηση, επανυπολογισμός),
 
 -  να συνεχίσουν να αποκρίνονται στο χρήστη όσο το κύριο νήμα δεν είναι
 αποκλεισμένο.
 
Εφαρμογές εξυπηρετητή μπορούν συχνά να υλοποιηθούν με τη χρήση νέου νήματος
ανά πελάτη, ή με την κατανομή τους σε αιτήσεις από ένα σταθερό σύνολο
διαθέσιμων νημάτων.
Οι διεργασίες μπορούν να δημιουργήσουν νήματα με τα παρακάτω χαρακτηριστικά:
-  πολλαπλά νήματα ανά διεργασία,
 -  όλα τα νήματα είναι ομότιμα,
 -  όλα τα νήματα μπορούν να έχουν πρόσβαση στα γραφικά,
 -  υποστηρίζεται προεκχωρητικός χρονοπρογραμματισμός των νημάτων με έλεγχο
προτεραιότητας,
 
Συγχρονισμός
Για την υλοποίηση συγχρονισμού προσφέρονται οι παρακάτω μηχανισμοί:
-  κρίσιμα τμήματα,
 -  αντικείμενα αμοιβαίου αποκλεισμού,
 -  συμβάντα,
 -  σημαφόροι.
 
Στα παραπάνω αντικείμενα μια διεργασία μπορεί να εκτελέσει μια κλήση αναμονής
μέχρι το αντικείμενο να ελευθερωθεί.
Διαχείριση μνήμης
Η διαχείριση της μνήμης στα Windows NT έχει τα παρακάτω ιδιαίτερα
χαρακτηριστικά:
-  η σελιδοποίηση υλοποιείται μέσω φύλαξης των σελίδων σε πολλαπλά αρχεία,
 -  υποστηρίζονται διαμοιρασμένες περιοχές μνήμης με συγκεκριμένο
όνομα και λίστα ελέγχου πρόσβασης,
 -  κάθε σελίδα μπορεί να συνδέεται με ξεχωριστή προστασία,
 -  είναι δυνατή η κατανομή αραιών τμημάτων μνήμης.
 
Βιβλιογραφία
- Helen Custer.
Inside Windows NT.
Microsoft Press, Redmond, WA, USA, 1992.
 
- Usenix Association.
USENIX Windows NT Workshop, Seattle, Washington, USA, August
  1997.
 
Θέματα εξετάσεων
Πρόοδος 1997
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
ΛΕΙΤΟΥΡΓΙΚΑ
ΣΥΣΤΗΜΑΤΑ
 Ι
(1η Πρόοδος)
| Διδάσκων: Διομήδης Σπινέλλης
 | Νοέμβριος 1997
 | 
Θέμα
1ο:
- Τι είναι
ο χρονοδρομολογητής
(scheduler);
 - Τι στόχους
πρέπει να έχει
ο αλγόριθμος
χρονοπρογραμματισμού;
 
Θέμα
2ο:
- Αναλύστε
συνηθισμένες
δομές δεδομένων
με τις οποίες
γίνεται η
κατανομή χώρου
στο δίσκο για
την υλοποίηση
αρχείων.
 - Σε τι
διαφέρει η
εναλλαγή (swapping)
από τη
σελιδοποίηση
(paging);
 
Θέμα
3ο:
- Σε τι
διαφέρει η
πολιτική από
το μηχανισμό
ασφαλείας;
 Δώστε παραδείγματα.
 - Για
επιθέσεις
σε υπολογιστικά
συστήματα
χρησιμοποιούνται
μεταξύ άλλων
και οι τεχνολογίες
του "Δουρείου
Ίππου" (Trojan Horse),
της "Καταπακτής"
(Trapdoor), και
της "Ωρολογιακής
Βόμβας" (Time
Bomb).  Εξηγήστε
με παραδείγματα
τι είναι οι
τεχνολογίες
αυτές.
 
Θέμα
4ο:
Σε τι
χρησιμεύει
το σύστημα
αρχείων που
προσφέρει
το λειτουργικό
σύστημα;
Θέμα
5ο:
- Σχεδιάστε
το ιεραρχικό
δένδρο που
θα προκύψει
από την εκτέλεση
των εντολών:
cd /; mkdir a b c a/a b/a; cd a; mkdir
../e ../a/f ../b/a/g; cd ../b/./; mkdir /a/k a/b ../a/./b /c
 - Με τη
χρήση των
εντολών uniq
(αφαιρεί
τις κοινές
γραμμές από
ένα ταξινομημένο
αρχείο), sort (ταξινόμηση),
makewords (σπάει
ένα αρχείο
σε μια λέξη
ανά γραμμή),
comm (βρίσκει
τις μη κοινές
γραμμές ανάμεσα
σε δύο ταξινομημένα
αρχεία), και
του λεξικού
/usr/dict/words περιγράψτε
αδρά τη δομή
ενός ορθογραφικού
διορθωτή.
 
Θέμα
6ο:
Με βάση
την παρακάτω
σημειολογία
κανονικών
εκφράσεων:
^  Αρχή
της γραμμής
$  Τέλος
της γραμμής
.  Οποιοδήποτε
γράμμα
[abc]  Ένα
από τα γράμματα
a, b, ή c
(Έκφραση)
Το περιεχόμενο
στην παρένθεση
\1 \2 ... \ν To περιεχόμενο
της νοστής
παρένθεσης
- ορίστε
κανονική έκφραση
που να βρίσκει
λέξεις με παλινδρομήματα
6 γραμμάτων
(π.χ. glossolalia, staccato),
 - ορίστε
κανονική έκφραση
που να βρίσκει
λέξεις με τρία
συνεχόμενα
φωνήεντα.
 
| Διάρκεια εξέτασης 1.5 ώρα.
 | Καλή επιτυχία!
 | 
Εξεταστική περιόδος Ιανουαρίου 1998
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
| ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ  Ι
 | Εξεταστική περίοδος
 
Ιανουαρίου 1998
  | 
|  Διδάσκων: Διομήδης Σπινέλλης
 |  | 
Θέμα
1ο:
- Κατά
την παράλληλη
εκτέλεση διεργασιών
τι ονομάζουμε
συνθήκη ανταγωνισμού;
 Δώστε ένα
παράδειγμα.
 - Σε τι
διαφέρει ο
χρονοπρογραμματισμός
προεκχώρισης
(preemptive scheduling) από το μη
προεκχωρητικό
χρονοπρογραμματισμό
(nonpreemptive scheduling);  Πως μπορεί
να υλοποιηθεί
το κάθε είδος;
 
Θέμα
2ο:
- Η Microsoft αποφασίζει
να διπλασιάσει
το μήκος της
σελίδας του
συστήματος
σελιδοποίησης
των Windows NT.  Τι επιπτώσεις
θα έχει η επιλογή
αυτή στην
εσωτερική
δομή, τις απαιτήσεις
μνήμης, και
τις επιδόσεις
του λειτουργικού
συστήματος;
 - Ποιες
τεχνικές μπορούν
να χρησιμοποιηθούν
για τη βελτίωση
της επίδοσης
του συστήματος
αρχείων;
 
Θέμα
3ο:
- Ποιες
συνθήκες
πρέπει να ικανοποιούνται
για να δημιουργηθεί
αδιέξοδο;  Πως
μπορούν να
αντιμετωπιστούν
τα αδιέξοδα;
 - Γιατί
απαιτείται
η πιστοποίηση
της ταυτότητας
του χρήστη
για την προστασία
ενός συστήματος;
 Πως μπορεί
να πραγματοποιηθεί
η πιστοποίηση
αυτή;  Δώστε
ένα παράδειγμα.
 
Θέμα
4ο:
- Σχεδιάστε
το ιεραρχικό
δένδρο που
θα προκύψει
από την εκτέλεση
των εντολών:
cd /; mkdir a b c a/a b/a; cd a; mkdir
../e ../a/f ../b/a/g; cd ../b/./; mkdir /a/k a/b ../a/./b /c
 - Με τη
χρήση των
εντολών uniq
-c (μετράει
τις κοινές
γραμμές σε
ένα ταξινομημένο
αρχείο), sort (ταξινόμηση),
και makewords (σπάει
ένα αρχείο
σε μια λέξη
ανά γραμμή)
περιγράψτε
αδρά τη δομή
ενός προγράμματος
που τυπώνει
έναν πίνακα
με τη συχνότητα
κάθε λέξης
σε ένα κείμενο.
 Ο πίνακας πρέπει
να είναι ταξινομημένος
ανάλογα με
τη συχνότητα
της κάθε λέξης.
 
Θέμα
5ο:
Με βάση
την παρακάτω
σημειολογία
κανονικών
εκφράσεων:
^  Αρχή
της γραμμής
$  Τέλος
της γραμμής
.  Οποιοδήποτε
γράμμα
*  Καμία
ή περισσότερες
φορές
[abc]  Ένα
από τα γράμματα
a, b, ή c
(έκφραση)
Το περιεχόμενο
στην παρένθεση
\1 \2 ... \ν To περιεχόμενο
της ν-στής
παρένθεσης
- ορίστε
κανονική έκφραση
που να βρίσκει
λέξεις που
να αρχίζουν
και να τελειώνουν
με το ίδιο γράμμα
(π.χ. erase, alpha, kodak).
 - ορίστε
κανονική έκφραση
που να βρίσκει
λέξεις τριών
γραμμάτων
που να αρχίζουν
και να τελειώνουν
με σύμφωνο
(π.χ. get, him).
 
| Διάρκεια εξέτασης 1.5 ώρα.
 | Καλή επιτυχία!
 | 
Εξεταστική περιόδος Σεπτεμβρίου 1998
ΠΑΝΕΠΙΣΤΗΜΙΟ
ΑΙΓΑΙΟΥ
Τμήμα
Μαθηματικών
| 
 ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ  Ι  | 
 Εξεταστική περίοδος 
Σεπτεμβρίου 1998  | 
| 
Διδάσκων: Διομήδης Σπινέλλης | 
  | 
Θέμα 1ο:
- Περιγράψτε και συγκρίνετε μεταξύ τους δύο διαφορετικές λύσεις στο πρόβλημα του αμοιβαίου αποκλεισμού.
 
- Περιγράψτε χαρακτηριστικές πολιτικές χρονοπρογραμματισμού.  Ποια πολιτική θα επιλέγατε για το λειτουργικό σύστημα μιας μονάδας ελέγχου εντατικής θεραπείας και ποια πολιτική για τον κεντρικό πολυχρηστικό υπολογιστή του Πανεπιστημίου;  Τεκμηριώστε την άποψή σας.
 
Θέμα 2ο:
- Οι υπολογιστές του κέντρου πληροφορικής μπορούν να εκτελέσουν προγράμματα που απαιτούν μέχρι και 64ΜΒ μνήμης αν και διαθέτουν μόνο 32ΜΒ φυσικής μνήμης.  Εξηγήστε λεπτομερειακά πως υλοποιείται η δυνατότητα αυτή.
 
Θέμα 3ο:
- Τι λύσεις μπορεί να προσφέρει η κρυπτογραφία σε θέματα ασφάλειας;  Εξηγήστε.
 
- Περιγράψτε τις κλήσεις του λειτουργικού συστήματος που θα απαιτηθούν για την εκτύπωση των περιεχομένων ενός αρχείου στην οθόνη.
 
Θέμα 4ο:
- Σχεδιάστε το ιεραρχικό δένδρο που θα προκύψει από την εκτέλεση των εντολών:
cd /; mkdir a b c b/a a/a; cd a; mkdir ../e ../a/f ../b/a/g; cd ../b/./; mkdir /a/k a/b ../a/./b /c 
- Εξηγήστε το τελικό αποτέλεσμα της παρακάτω σειράς εντολών του φλοιού sh:
 
for i in *.c
do
	echo "mv $i $i.old"
done | sh
Θέμα 5ο:
Με βάση την παρακάτω σημειολογία κανονικών εκφράσεων:
^		Αρχή της γραμμής 
$		Τέλος της γραμμής 
.		Οποιοδήποτε γράμμα
*		Καμία ή περισσότερες φορές
[abc]		Ένα από τα γράμματα a, b, ή c
(έκφραση)	Το περιεχόμενο στην παρένθεση 
\1 \2 ... \ν	To περιεχόμενο της ν-στής παρένθεσης
- ορίστε κανονική έκφραση που να βρίσκει λέξεις που να περιέχουν με τη σειρά τα τέσσερα πρώτα γράμματα του λατινικού αλφαβήτου (π.χ. abducted, barbecued, fabricated).
 
- ορίστε κανονική έκφραση που να βρίσκει λέξεις που να αρχίζουν και να τελειώνουν με το ίδιο ζεύγος χαρακτήρων (π.χ. tomato, amalgam, decade, eraser, sense).
 
| 
 Διάρκεια εξέτασης 1.5 ώρα.  | 
 Καλή επιτυχία!  |