74
1 Λειτουργικά Συστήματα Ι Κεφάλαιο 4ο: Συστήματα Αρχείων «Σύγχρονα Λειτουργικά Συστήματα» -- A.S. Tanenbaum (Κλειδάριθμος) “Distributed Systems, Concepts and Design”, G. Coulouris and J. Dollimore, (Addison-Wesley)

Λειτουργικά Συστήματα Ι

Embed Size (px)

DESCRIPTION

Λειτουργικά Συστήματα Ι. Κεφάλαιο 4 ο : Συστήματα Αρχείων. «Σύγχρονα Λειτουργικά Συστήματα» -- A.S. Tanenbaum ( Κλειδάριθμος) “Distributed Systems, Concepts and Design”, G. Coulouris and J. Dollimore, (Addison-Wesley). 5.1 Περίληψη. - PowerPoint PPT Presentation

Citation preview

Page 1: Λειτουργικά Συστήματα Ι

1

Λειτουργικά Συστήματα Ι

Κεφάλαιο 4ο:Συστήματα Αρχείων

• «Σύγχρονα Λειτουργικά Συστήματα» -- A.S. Tanenbaum (Κλειδάριθμος)• “Distributed Systems, Concepts and Design”, G. Coulouris and J. Dollimore,

(Addison-Wesley)

Page 2: Λειτουργικά Συστήματα Ι

2

5.1 Περίληψη Αρχείο (File): Περιλαμβάνει ένα σύνολο λογικά

συσχετιζόμενων δεδομένων, μη-προσωρινής φύσης (συνήθως αποθηκευμένο σε δίσκους).

Συστήματα Αρχείων (File Systems): Μέρος ενός Λ.Σ. Ασχολείται με την οργάνωση, αποθήκευση, προσπέλαση, προστασία, διαμοιρασμό και ονομασία (naming) των αρχείων.

Προσφέρει το file abstraction: κρύβει όλες τις λεπτομέρειες διαχείρισης και προσπέλασης των συσκευών αποθήκευσης (π.χ. μαγνητικών δίσκων), οργάνωσης δεδομένων ενός αρχείου, κλπ

Page 3: Λειτουργικά Συστήματα Ι

3

5.1 Περίληψη Κατάλογος (Directory): Επιτρέπει ονόματα υψηλού επιπέδου

(π.χ. ASCII χαρακτηροσειρές) ν' ανατεθούν σ' αυτό το “storage abstraction” π.χ. " peter/foo" σε κάποια εσωτερική ταυτότητα (file id)

(συνήθως ένας μεγάλος αριθμός που ορίζει το αρχείο «peter/foo» στο σύστημα).

Εξυπηρετεί την: Ονομασία (File naming): Η διαδικασία μετάφρασης

ενός υψηλού-επιπέδου ονόματος (user-level name) ενός αρχείου στο αντίστοιχο file ID.

Έλεγχος πρόσβασης (Access Control): περιορίζει πρόσβαση σε αρχεία. Μόνο εξουσιοδοτημένοι χρήστες μπορούν να προσπελάσουν συγκεκριμένα αρχεία.

Page 4: Λειτουργικά Συστήματα Ι

4

Οργάνωση ενός Συστήματος Αρχείων Υπηρεσία Καταλόγου (Directory Service):

Directory Module: Μετάφραση υψηλού επιπέδου ονόματα -> File Ids

Access Control Module: έλεγχος άδειας πρόσβασης

Υπηρεσία Αρχείων (File Service): File Module: File IDs -> «files» (δομές που καθορίζουν που

βρίσκονται τα δεδομένα) File Access Module: Προσπέλαση αρχείου

Υπηρεσία Αποθήκευσης (Block Service): Block Module: Διαχείριση χώρου στο δίσκο Device Module: disk I/O & buffering

Page 5: Λειτουργικά Συστήματα Ι

5

Οργάνωση ενός Συστήματος Αρχείων File Service: - Υλοποιεί έναν «επίπεδο χώρο ονομάτων» (flat

file namespace). Πρέπει να μπορεί να προσδιορίζει την ταυτότητα του ζητούμενου αρχείου (μονοσήμαντα) μοναδικές ταυτότητες (unique file ids -- UFIDs). Δεδομένου του UFID η (μετα)πληροφορία του αντίστοιχου αρχείου μπορεί να εντοπιστεί.

Files = Δεδομένα + Ιδιχαρακτηριστικά (Data + attributes).

Attributes = Metadata (δηλ. πληροφορία για την πληροφορία). Συνήθως περιγράφουν το μέγεθος, ιδιοκτήτη, λίστα ελέγχου πρόσβασης, κ.λπ. Μερικά είναι προσπελάσιμες από τους χρήστες.

Block Service: Διαχειρίζεται μονάδες αποθήκευσης του δίσκου (disk blocks): Αναθέτει/ελευθερώνει blocks σε/από files και προσπελαύνει/ενημερώνει blocks.

Page 6: Λειτουργικά Συστήματα Ι

6

Οργάνωση ενός Συστήματος Αρχείων Υπηρεσία Καταλόγου (Directory Service): Διαχειρίζεται

καταλόγους (directories) – συνήθως σαν ειδικά αρχεία. ο directory server είναι πελάτης του file server.

Διαχειρίζεται UFIDs, όταν δημιουργούνται αρχεία, που επιστρέφονται στους χρήστες.

Έπειτα, οι χρήστες αναφέρονται στα αρχεία χρησιμοποιώντας τα UFIDs.

UFIDs μπορεί να είναι δικαιώματα (capabilities): δηλ. χρησιμοποιούνται από τους κατέχοντες σαν απόδειξη προς τον File Server του δικαιώματος προσπέλασης αρχείων.

Page 7: Λειτουργικά Συστήματα Ι

7

Οργάνωση ενός Συστήματος Αρχείων

ο directory server πριν επιστρέψει UFIDs σε χρήστες πρέπει πρώτα να ελέγξει ότι οι χρήστες διαθέτουν τα ανάλογα δικαιώματα πρόσβασης.

Ο διαχωρισμός του Directory Service από το File Service μπορεί να δημιουργήσει προβλήματα! π.χ. όταν διαγράφουμε ένα αρχείο, πρέπει να: 1) διαγραφεί directory info και 2) διαγραφούν file blocks. Αν το πρόγραμμα, λόγω βλάβης, δεν εκτελέσει το βήμα (2) τότε έχουμε ένα μη-προσπελάσιμο αρχείο το οποίο δεν μπορούμε να διαγράψουμε.

Page 8: Λειτουργικά Συστήματα Ι

8

5.2 Υπηρεσία Καταλόγου (Directory Service)

Έλεγχος πρόσβασης: Η Υπηρεσία καταλόγων διαχειρίζεται καταλόγους που αποθηκεύουν ζεύγη (file name, UFID).

Πριν επιστρέψει ένα UFID, πρέπει να ελέγξει αν ο χρήστης έχει δικαίωμα πρόσβασης access control.

User Ids: προσδιορίζουν την ταυτότητα χρηστών που προσπελαύνουν αρχεία. Κάθε χρήστης σχετίζεται με ένα user id μετά από μια

διαδικασία authentication (εξακρίβωση στοιχείων) (π.χ. passwords).

Μπορεί να υπάρχει ξεχωριστός authentication server.

Page 9: Λειτουργικά Συστήματα Ι

9

5.2 Υπηρεσία Καταλόγου (Directory Service)

Access Controll Lists (ACLs)

Επίσης ομάδες χρηστών (με ομαδικά δικαιώματα πρόσβασης) μπορούν να δημιουργηθούν

Σύνοψη: Δεδομένου ενός user id και ενός ονόματος αρχείου ο dir. server

προσπελαύνει το ACL του αρχείου και, αν όλοι οι έλεγχοι εκτελεστούν ομαλά, επιστρέφει ένα UFID στον χρήστη.

Σε όλες τις μετέπειτα αιτήσεις του ο χρήστης προσκομίζει μόνο το UFID για ν' αποδείξει το δικαίωμα πρόσβασής του στο αρχείο.

Operation Users

Read Write

Λίστα με χρήστες Λίστα με χρήστες

Page 10: Λειτουργικά Συστήματα Ι

10

Λειτουργίες Υπηρεσίας Καταλόγων:

Ονομασία και έλεγχος πρόσβασης (access control). Διαχειρίζεται directories (ειδικά αρχεία). Επιστρέφει ένα UFID με καθορισμένα δικαιώματα

προσπέλασης ή λάθος! Τα directories επίσης ονομάζονται με τα UFIDs.

(Ενδεικτικές) Λειτουργίες: LookUp(DirUFID, Name, Access Mode, Userld,

&UFID)Σε επιτυχία ελέγχου πρόσβασης, επιστρέφει το

UFID του αρχείου-ορίσματος

Page 11: Λειτουργικά Συστήματα Ι

11

Λειτουργίες Υπηρεσίας Καταλόγων:

AddName(DirUFID, Name, UFID, UserId)Προσθέτει το ζεύγος (Name, UFID) στο directory

UnName (DirUFID, Name)Το ζεύγος που περιέχει το "Name" διαγράφεται από το DirUFID

ReName (DirUFID, Old Name, New Name)Αλλάζει το ζεύγος (OldName, UFID) -> (NewName, UFID)

GetName (DirUFID, pattern)Επιστρέφει όλα τ' ονόματα το DirUFID που ταιριάζουν στο "pattern".

Page 12: Λειτουργικά Συστήματα Ι

12

Λειτουργίες Υπηρεσίας Καταλόγων:

Το Directory service πρέπει επίσης να μπορεί να αλλάζει ιδιότητες ενός αρχείου -- π.χ. το ACL, για να υποστηρίζει «chmod»... Επίσης πρέπει να παρέχει λειτουργίες για να εξετάζονται τα

attributes.

Το directory service είναι ο ιδιοκτήτης όλων των directories. Για κοινόχρηστα (shared) directories πρέπει να δηλώσουμε ένα χρήστη σαν ιδιοκτήτη και μια στρατηγική access-permission.

Xαμένα Αρχεία: Για λειτουργία create-file: καλούμε το create system call (λειτουργία File Service) και κατόπιν AddName (λειτουργία Directory Service). Έτσι, σφάλματα/αποτυχίες δημιουργούν προβλήματα.

Page 13: Λειτουργικά Συστήματα Ι

13

5.3 Υπηρεσία Αρχείων (File Service)

Λειτουργίες (στα δεδομένα) – Μια εναλλακτική: Create (&UFID): Δημιουργεί ένα νέο (άδειο) αρχείο και

επιστρέφει ένα UFID Delete (UFID) : Διαγράφει το αρχείο Length (UFID) : Επιστρέφει το μήκος του αρχείου Read (UFID, position, number, &buffer): Διαβάζει

"number" bytes αρχίζοντας από τη θέση "position" του αρχείου UFID και τα τοποθετεί στο "buffer".

Write (UFID, position, buffer): Γράφει τα δεδομένα του "buffer" στο αρχείο UFID στη θέση "position".

Page 14: Λειτουργικά Συστήματα Ι

14

5.3 Υπηρεσία Αρχείων (File Service)

Λειτουργίες στα atributes: SetAttributes (UFID, attributes) GetAttributes (UFID, &attributes)

UFIDs: Πρέπει να είναι: μοναδικά (μεταξύ όλων των files και όλων των κόμβων που

υλοποιούν το F.S.) δύσκολο να "μαντευτούν"

server host id Internet address, (μπορεί να είναι μικρότερο για ένα ethernet)

random number για να είναι δύσκολο να μαντευτεί.

48 bits 32 bits 32 bits

server host id file number random number

Page 15: Λειτουργικά Συστήματα Ι

15

5.3 Υπηρεσία Αρχείων (File Service)

Για διαμοιραζόμενα αρχεία πολλοί διαφορετικοί τύποι πρόσβασης (για διαφορετικούς clients) είναι δυνατοί Τα UFIDs πρέπει να είναι περισσότερο ευέλικτα. Τα UFIDs μπορούν να περιέχουν ένα permission field (π.χ. r, w, ...) διαφορετικά UFIDs για διαφορετικούς τύπους πρόσβασης για το ίδιο file.

Παράδειγμα: 2 bits (για r-o, w-o, & r+w) για permission field.

Χρειάζεται πολύ προσοχή με αυτό το σχήμα: Το permission field πρέπει να συνδυάζεται με το τυχαίο κομμάτι. Αλλιώς κάποιος εύκολα θ' άλλαζε permissions για πιο αυστηρή πρόσβαση.

Κρυπτογράφηση (encrypt permission field + random number) χρησιμοποιώντας ένα κρυφό κλειδί! (γνωστό στο server).

Page 16: Λειτουργικά Συστήματα Ι

16

5.3 Υπηρεσία Αρχείων (File Service)

Υλοποίηση - Απαιτείται δυναμική ανάθεση [ (de) allocation] των blocks του δίσκου ώστε να επιτρέπονται δυναμικές αλλαγές στα αρχεία.

Ένα αρχείο γενικά καταλαμβάνει μη συνεχόμενα disk blocks (Γιατί;)

Το file service διατηρεί μια δομή δεδομένων, το file index. Το file index συνήθως περιέχει τα attributes του αρχείου και μια ακολουθία από δείκτες στα μπλοκ του δίσκου που περιέχουν τα δεδομένα του αρχείου.

Το file index πρέπει να υποστηρίζει σειριακή και τυχαία πρόσβαση (sequential + random access) ενός file.

Γιατί τα attributes δεν αποθηκεύονται σε blocks μαζί με τα δεδομένα; (Eχουν διαφορετικές απαιτήσεις ελέγχου πρόσβασης).

Page 17: Λειτουργικά Συστήματα Ι

17

5.3 Υπηρεσία Αρχείων (File Service)

Εντοπίζοντας δεδομένα αρχείωνInput: UFIDOutput: Τοποθεσία του file indexΤο κάνει το File Location Map!

Στην πραγματικότητα κάθε αίτηση που έρχεται στο file service περιέχει ένα UFID και ένα offset (πχ read(ufid, 1500, &buffer) (a) UFID δείκτη του μπλοκ για το file index (b) offset δείκτη του μπλοκ για το ζητούμενο μπλοκ του αρχείου(a)+(b) : «μετάφραση σε 2 βήματα»

Τα File Location Maps κάνουν το (a). Εξ αιτίας της ύπαρξης τους τα files μπορούν να μεταφερθούν.

To (b) γίνεται χρησιμοποιώντας το file index.

Page 18: Λειτουργικά Συστήματα Ι

18

5.3 Υπηρεσία Αρχείων (File Service)

Παράδειγμα File index

Το file index απασχολεί επίσης blocks.

Page 19: Λειτουργικά Συστήματα Ι

19

5.3 Υπηρεσία Αρχείων (File Service)

Μπορούμε να έχουμε file index πολλαπλών επιπέδων π.χ. file index 2 επιπέδων :

Page 20: Λειτουργικά Συστήματα Ι

20

5.3 Υπηρεσία Αρχείων (File Service)

Το UNIX έχει μια δομή που ονομάζεται i-node (file index).

Page 21: Λειτουργικά Συστήματα Ι

21

5.4 Υπηρεσία Αποθήκευσης (Block Service)

Γενικά: δέσμευση και αποδέσμευση blocks του δίσκου μεταφορά δεδομένων από και προς τα μπλοκς του

δίσκου

Δείκτες σε μπλοκς: disk_id + διεύθυνση στο δίσκο

Λειτουργίες AllocateBlock (&blockptr) -- δεσμεύει ένα νέο

block στο δίσκο και επιστρέφει ένα δείκτη σε αυτό το block

Page 22: Λειτουργικά Συστήματα Ι

22

5.4 Υπηρεσία Αποθήκευσης (Block Service)

FreeBlock (blockptr) -- ελευθερώνει το block που δείχνεται από το blockptr.

GetBlock (blockptr, &buffer) -- διαβάζει τα περιεχόμενα του block που δείχνεται από το δείκτη blockptr και τ' αποθηκεύει στο buffer.

PutBlock (blockptr, &buffer) -- γράφει τα περιεχόμενα του buffer στο disk block που δείχνεται από το blockptr

Οι παραπάνω λειτουργίες υλοποιούνται χρησιμοποιώντας περισσότερο στοιχειώδεις λειτουργίες του δίσκου (primitive disk ops), …παρέχονται από το device module.

Page 23: Λειτουργικά Συστήματα Ι

23

5.4 Υπηρεσία Αποθήκευσης (Block Service)

Μέγεθος Μονάδας Αποθήκευσης Πληροφορίας (Block Size)

Tradeoff: Χώρος: μειωμένη χρήση αποθηκευτικού χώρου στο δίσκο

για μεγάλα blocks έναντι καλύτερης χρήσης αποθηκευτικού χώρου στο δίσκο (μικρότερα blocks): προσέξτε την ύπαρξη πολλών μικρότερων αρχείων.

Ταχύτητα: Η μεταφορά των δεδομένων μεταξύ δίσκου -- κύριας μνήμης είναι >1000 φορές πιο γρήγορη από το κόστος αναζήτησης + κόστος περιστροφής

όσο λιγότερα blocks αναζητούμε τόσο το καλύτερο.

Page 24: Λειτουργικά Συστήματα Ι

24

5.4 Υπηρεσία Αποθήκευσης (Block Service)

Κάποια συστήματα χρησιμοποιούν πολλαπλά μεγέθη block (π.χ., UNIX 4.2. BSD):

Eνα block χωρίζεται σε τμήματα (fragments). Ένα αρχείο των N bytes αποτελείται από (N / b) blocks και

από κανένα ή ένα τμήμα από κάθε μέγεθος (b/2, b/4, b/8) (b είναι ο αριθμός των bytes ανά block)

Εάν b είναι 8K, πολλά μικρά αρχεία μπορούν να αποθηκευτούν σ' ένα απλό block (χρησιμοποιώντας τα τμήματά του).

Αυτός ήταν ο κύριος λόγος της επιτάχυνσης του συστήματος αρχείων του UNIX BSD από 2-5% σε 30-47% της ονομαστικής «ταχύτητας» του δίσκου (raw disk bandwidth).

Page 25: Λειτουργικά Συστήματα Ι

25

5.4.1 Λειτουργίες του File Service / Επικοινωνία με το Block Service

Create: παράγει UFID + δεσμεύει χώρο για το file index + αρχικοποιεί ιδιοχαρακτηριστικά (attributes) + προσθέτει μια νέα είσοδο (entry) στο File Location Map και επιστρέφει το UFID.

Delete: σβήνει την είσοδο από το FLM + ελευθερώνει όλα τα blocks του αρχείου και τ' αντίστοιχα blocks που δεσμεύει το file index.

Read: χρησιμοποιείται η GetBlock για κάθε μπλοκ που χρειάζεται

Write: AllocateBlock (στο τέλος του αρχείου) + PutBlock ή GetBlock (overwrite) + PutBlock

Page 26: Λειτουργικά Συστήματα Ι

26

5.5 Ανεκτικότητα σε Σφάλματα

Γενικά: να προφυλάσουμε τη συνέπεια της πληροφορίας σε αρχεία (από

αποτυχία (crashing) του συστήματος), s/w bugs του λειτουργικού συστήματος, προσωρινά σφάλματα υλικού κατά τη διάρκεια

ανάγνωσης/εγγραφής στο δίσκο, κλπ.

Προσεκτική Μνήμη -- Careful Storage: Ένα abstraction

Η χρήση της αποσκοπεί στο να γίνουν ανιχνεύσιμα τα σφάλματα και οι αποτυχίες

CarefulPut / CarefulGet Βασική ιδέα:

Αποθήκευση ενός checksum μαζί με κάθε block κάθε φορά που μεταβάλλονται τα περιεχόμενα ενός block.

Page 27: Λειτουργικά Συστήματα Ι

27

5.5 Ανεκτικότητα σε Σφάλματα

CarefulGet (Read): επαναπροσδιορισμός του checksum των δεδομένων που

διαβάζουμε σύγκριση μ' εκείνο που είναι αποθηκευμένο μαζί με το block. Εάν διαφέρουν τότε: επανέλαβε/εγκατέλειψε και επέστρεψε

μήνυμα λάθους.

CarefulPut (Write): Μετά την εγγραφή, ξαναδιάβασε το block από το δίσκο και

σύγκρινε το checksum με το πρωτότυπο. Επανέλαβε, εάν χρειάζεται. Εάν το πρόβλημα εμμένει, σημείωσε το block ως "bad”,

ζήτησε ένα νέο block από το block service, και ξαναδοκίμασε.

Παρατήρηση:Αποτυχία κατά τη διάρκεια κάποιας εγγραφής, ένα block ίσως εγγραφεί κατά ένα μέρος του, … αρχείο, inode, FLM,… χάνονται.

Page 28: Λειτουργικά Συστήματα Ι

28

5.5 Ανεκτικότητα σε Σφάλματα

Σταθερή Μνήμη (Stable Storage)

Μια αφαίρεση που χρησιμοποιείται για ν' αποφευχθεί το παραπάνω πρόβλημα – δηλ. να ανανήψει το σύστημα.

βασίζεται σε προσεκτικά (careful) put & (careful) get.

Προκειμένου το σύστημα ν' αναρρώσει από αποτυχίες εγγραφών, χρειάζεται κάποιος πλεονασμός/αντίγραφα.

Ο στόχος είναι το σύστημα να αποτύχει καθώς εγγράφεται ένα από τα δύο αντίγραφα το άλλο θα παραμείνει ανέπαφο μπορούμε να χρησιμοποιήσουμε το ανέπαφο αντίγραφο για να επαναφέρουμε το block στην κατάσταση που ήταν πριν την ανεπιτυχή εγγραφή.

Page 29: Λειτουργικά Συστήματα Ι

29

5.5 Ανεκτικότητα σε Σφάλματα

Η σταθερή μνήμη αποτελείται από σταθερά blocks (stable blocks).Κάθε σταθερό block αποτελείται από δύο διαφορετικά block και οι λειτουργίες εγγραφής διεξάγονται και στα δύο blocks (καλύτερα να τοποθετούνται τα δύο αντίγραφα σε διαφορετικούς δίσκους).

StableGet: διάβασε ένα block με CarefulGet; εάν ανιχνευθεί σφάλμα, τότε διάβασε το έταιρο block με την

CarefulGet. StablePut:

γράψε κάθε block με αυστηρή σειρά με (careful) PutBlock. Το δεύτερο block εγγράφεται ΜΟΝΟ ΑΝ το πρώτο (careful) PutBlock

ήταν επιτυχές. Για παράλληλες λειτουργίες, χρησιμοποιείται monitor ή mutex.

Page 30: Λειτουργικά Συστήματα Ι

30

5.6 Αρχεία "στο μικροσκόπιο“

Γιατί Αρχεία;

3 κύριοι λόγοι: Για να μπορούν προγράμματα να χρησιμοποιήσουν

πληροφορία μεγαλύτερη από το μέγεθος του virtual address space.

Για να υπάρχουν πληροφορίες/δεδομένα ανεξάρτητα από τη «ζωή των προγραμμάτων» που τα χρησιμοποιούν.

Για να μπορούν δεδομένα να διαμοιράζονται μεταξύ προγραμμάτων (δια μέσου κοινών αρχείων).

Page 31: Λειτουργικά Συστήματα Ι

31

5.6 Αρχεία "στο μικροσκόπιο“

Το F.S. είναι υπεύθυνο για την δόμηση/οργάνωση, προσπέλαση, προστασία, ονομασία, και υλοποίηση στο δίσκο.

Η "ονομασία" αναφέρεται στη διαδικασία μετάφρασης ενός υψηλού-επιπέδου ASCII ονόματος σε εσωτερικά file ids με βάση τα οποία το σύστημα μπορεί να προσπελάσει το αρχείο.

Το ΣΑ υλοποιεί/προσφέρει το abstraction του αρχείου (δηλ. κρύβει λεπτομέρειες υλοποίησης του file).

Page 32: Λειτουργικά Συστήματα Ι

32

5.6 Αρχεία "στο μικροσκόπιο“

Η δομή των αρχείων ποικίλει:

Συνήθως ένα file είναι απλώς μια σειρά από bytes χωρίς καμία δομή, τουλάχιστον σε ότι αφορά το Λ.Σ.

Σε μερικά (παλαιότερα) F.S. ένα file είναι μια σειρά από records (που αποτελούνται από ένα συγκεκριμένο αριθμό bytes). Read & write λειτουργίες τώρα επιδρούν σε records και όχι σε τυχαία bytes.

Σ' άλλα F.Ss ένα file έχει μια δενδρική οργάνωση, όπου οι κόμβοι είναι records. Κάθε record έχει και μία κλειδί/κλειδολέξη με βάση την οποία προσπελαύνονται συγκεκριμένα records.

Page 33: Λειτουργικά Συστήματα Ι

33

5.6 Αρχεία "στο μικροσκόπιο“

Τύποι Αρχείων:

Data Files: περιέχουν πληροφορίες χρηστών (user-data)

Directory files: περιέχουν κυρίως ζεύγη όπως: (ASCII file name, fid).

Block Special Files: χρησιμοποιούνται για να μοντελοποιήσουν δίσκους σαν αρχεία απ' ευθείας πρόσβαση σε ένα δίσκο γίνεται με open(), read(), write(), close()...

Character Special Files: Μοντελοποιούν σειριακές συσκευές όπως τερματικά, εκτυπωτές, κ.λπ.

Page 34: Λειτουργικά Συστήματα Ι

34

5.6 Αρχεία "στο μικροσκόπιο“

Data Files μπορεί να είναι ASCII αρχεία περιέχουν κείμενο από ASCII chars, <CR>, κ.λπ. Binary αρχεία συνήθως είναι «εκτελέσιμα» -- executable images

(δηλ. προγράμματα μετά τη μετάφραση & σύνδεση ή μεταφρασμένες ρουτίνες μιας βιβλιοθήκης που περιμένουν να συνδεθούν με προγράμματα.

Τύποι προσπέλασης: Σειριακή: (Sequential Access:) Όλα τα bytes ενός αρχείου

προσπελαύνονται κατά σειρά (από το 1ο μέχρι το τελευταίο μπλοκ).

Τυχαία: (Random Access). Όταν τα bytes/records ενός αρχείου προσπελαύνονται κατά μια τυχαία σειρά.

Page 35: Λειτουργικά Συστήματα Ι

5.6 Αρχεία "στο μικροσκόπιο“

Η αφαίρεση: Ο χρήστης βλέπει κάθε αρχείο σα μια σειρά από

ψηφία, καθένα από τα οποία είναι προσπελάσιμο. οι λειτουργίες προσπέλασης επιτρέπουν στο

χτήστη να ορίσει ποια ψηφία εμπλέκονται στην κάθε του εντολή.

Το σύστημα αρχείων αποθηκεύει και διαχειρίζεται δίσκους και τα μπλοκ των δίσκων.

Πρέπει να μεταφράζει εντολές χρηστών στα κατάλληλα μπλοκ που πρέπει να προσπελαστούν από το δίσκο και να τα προπελαύνει αρμοδίως.

35

Page 36: Λειτουργικά Συστήματα Ι

36

Προσπέλαση και Λειτουργίες

Η τυχαία προσπέλαση υλοποιείται με 2 τρόπους: Κάθε read() & write() προσδιορίζει που ακριβώς στο αρχείο

θα επιδράσει η λειτουργία - δηλ. ποιο θα είναι το 1ο byte.

Το F.S. κρατάει έναν read/write δείκτη (για κάθε process που προσπελαύνει ένα αρχείο). Το 1ο byte είναι αυτό στο οποίο δείχνει ο δείκτης.

[Υπάρχει και ένα system call seek() με το οποίο ο χρήστης μπορεί να ενημερώσει το δικό του r/w pointer. ]

Λειτουργίες που παρέχονται συνήθως από ένα F.S.:

open(), close(), read(), write(), append(), seek(), create(), delete(), get/set-attributes(), rename().

Page 37: Λειτουργικά Συστήματα Ι

37

Προσπέλαση και Λειτουργίες

Οι μόνες λειτουργίες που χρειάζονται δικαιολόγηση ύπαρξης είναι οι open() & close(). Ο κύριος λόγος ύπαρξης είναι υψηλή απόδοση (performance). Ο χρήστης δηλώνει ότι πρόκειται να προσπελάσει ένα file με

το open().

Το F.S. : ελέγχει τα δικαιώματα πρόσβασης του χρήστη στο αρχείο

και αποταμιεύει στη Κ.Μ. του FS χρήσιμες πληροφορίες, όπως σε

ποια disk blocks βρίσκονται αποθηκευμένα τα δεδομένα του αρχείου και τα attributes.

αυτές οι πληροφορίες έτσι θα βρίσκονται στη Κ.Μ. κάθε read() & write() δεν θα χρειαστεί διπλό κόστος I/O, ούτε το κόστος ελέγχου πρόσβασης.

Page 38: Λειτουργικά Συστήματα Ι

38

Αρχεία Χαρτογραφημένα στη Μνήμη -- Memory mapped files

Πολλοί υποστηρίζουν ότι το παραπάνω interface του Σ.Α. είναι... "άβολο". Μια εναλλακτική λύση είναι memory-mapped files.

Ο χρήστης μπορεί να καλέσει το Map (filename, virtual-address) όπου το virtual-address είναι μια μεταβλητή προγράμματος (π.χ. filebuffer , τύπου char *).

Το Λ.Σ., εκτελώντας αυτή την εντολή, χρησιμοποιεί τους πίνακες που κρατούν τις διευθύνσεις των disk blocks που αποτελούν το αρχείο και ενημερώνει τα disk blocks που αποτελούν το χώρο εναλλαγής ("swap space«) για το process και συγκεκριμένα το χώρο που αφορά στη μεταβλητή filebuffer

Page 39: Λειτουργικά Συστήματα Ι

39

Αρχεία Χαρτογραφημένα στη Μνήμη -- Memory mapped files

το swap space για το virtual address space στο οποίο χαρτογραφείται το αρχείο περιέχει τα disk blocks του αρχείου.

τα page faults εξυπηρετούνται προσπελαύνοντας τα κατάλληλα disk blocks (από το swap space)

το process προσπελαύνει ένα αρχείο όπως οποιαδήποτε μεταβλητή/δομή δεδομένων του προγράμματός του (π.χ. με ένα for loop... for (i>=1) do {… file[i]:= …. }

Page 40: Λειτουργικά Συστήματα Ι

40

Αρχεία Χαρτογραφημένα στη Μνήμη -- Memory mapped files

Επιτρέποντας memory-mapped αρχεία, δημιουργεί δυνητικά προβλήματα διαμοιρασμού και συνέπειας.

π.χ.

Ένα process Π1 έχει ενημερώσει ένα αρχείο, αλλά τα σχετικά blocks του αρχείου δεν έχουν αποθηκευτεί στο δίσκο ακόμα (δηλ. δεν έγιναν page out).

Ένα άλλο process Π2 τότε προσπελαύνει το ίδιο αρχείο χρησιμοποιώντας για παράδειγμα το κανονικό File System interface (open()/read(),…)

δεν θα δει την πιο πρόσφατη πληροφορία. !

Page 41: Λειτουργικά Συστήματα Ι

41

5.7 Κατάλογοι "στο μικροσκόπιο“

τα directories συνήθως υλοποιούνται σαν αρχεία («directory files»).

εγγραφές (directory entries) είναι ζεύγη: (filename, UFID).Ειδικότερα αυτό το UFID προσδιορίζει (δομές που κρατούν) τις διευθύνσεις των disk blocks που αποτελούν το αρχείο καθώς και τα ιδιοχαρακτηριστικά (attributes) του.

Συνήθως, η εγγραφή καταλόγου: είτε περιέχει κατ' ευθείαν την πληροφορία για τις διευθύνσεις

των μπλοκς του δίσκου, είτε περιέχει ένα δείκτη σε κάποια δομή του πυρήνα, που

περιέχει την παραπάνω πληροφορία.

Page 42: Λειτουργικά Συστήματα Ι

42

5.7 Κατάλογοι "στο μικροσκόπιο“

Όταν το Σ.Α. εξυπηρετεί την εντολή open(fname, ...):

ψάχνει τον κατάλογο μέχρι να βρει την εγγραφή για το fname.

μετά ενημερώνει έναν πίνακα του πυρήνα (inode table) με τα ιδιοχαρακτηριστικά και τις διευθύνσεις στο δίσκο για τα μπλοκς του αρχείου fname.

Όλα τα read()/write() του ίδιου χρήστη γι αυτό το αρχείο fname χρησιμοποιούν αυτόν τον πίνακα (inode table) για να εκτελεστούν.

Page 43: Λειτουργικά Συστήματα Ι

43

5.7 Κατάλογοι "στο μικροσκόπιο“

Συχνά, οι χρήστες θέλουν να οργανώσουν λογικά τα αρχεία τους. Αυτό έχει συνήθως ως αποτέλεσμα την δημιουργία ιεραρχικών Σ.Α. Δηλ. υπάρχουν κατάλογοι που περιέχουν άλλους καταλόγους, κ.ο.κ.

Αυτό με τη σειρά του έχει ως αποτέλεσμα τα αρχεία να ονομάζονται με «ονόματα μονοπατιών» (pathnames) όπως /usr/peter/foo.

Το πρώτο "/" είναι το «root directory» του Σ.Α. Κάποιο dir. του root έχει όλους τους χρήστες, "usr". Ένας χρήστης είναι ο "peter" ο οποίος έχει το δικό του

dir το οποίο με τη σειρά του έχει ένα αρχείο με το όνομα "foo".

Page 44: Λειτουργικά Συστήματα Ι

44

5.7 Κατάλογοι "στο μικροσκόπιο“

Σε ιεραρχικά συστήματα υπάρχουν 2 τρόποι ονομασίας ενός αρχείου: απόλυτη και σχετική ονομασία [absolute & relative path name].

Το απόλυτα όνομα είναι μοναδικό για κάθε αρχείο και πάντα αρχίζει με το root directory.

Το σχετικό όνομα σχετίζεται με την έννοια του current (ή working) directory. Αν το τωρινό dir είναι το /usr/peter, τότε τα ονόματα "foo" & "/usr/peter/foo" αναφέρονται στο ίδιο αρχείο.

Κάθε process φυσικά έχει το δικό της current directory (δηλ. είναι μια per-process μεταβλητή). Έτσι αν για τον χρήστη "dora" το current dir. είναι /usr/dora και για τον χρήστη "peter" το current dir είναι /usr/peter τότε το σχετικό όνομα "foo" αναφέρεται σε διαφορετικά αρχεία, ανάλογα με τον χρήστη.

Page 45: Λειτουργικά Συστήματα Ι

45

5.7 Κατάλογοι "στο μικροσκόπιο“ Οι πιο συνήθης λειτουργίες που παρέχονται από directory

services είναι: opendir(), closedir(), create(), delete(), read-dir(), rename(), link(), unlink().

Το read_dir() μπορεί υλοποιηθεί χρησιμοποιώντας το read() για το σχετικό dir. file. Αλλά συνήθως υλοποιείται διαφορετικά, έτσι ώστε να επιστρέφει την επόμενη εγγραφή του dir.

απαλλάσσεται ο προγραμματιστής από την ανάγκη να ξέρει ακριβώς την εσωτερική δομή των dir.entries (π.χ. πόσα bytes και που είναι το filename, τα attributes, disk blocks, κ.λπ).

To link() επιτρέπει σε πολλά directories να "περιέχουν" το ίδιο αρχείο - έτσι π.χ., επιτρέπεται ο διαμοιρασμός του αρχείου από διαφορετικούς χρήστες που το τοποθετούν στο δικό τους directory.

Το unlink() διαγράφει ένα directory entry. Αν αυτό ήταν το μοναδικό dir. entry που αναφέρεται στο αρχείο τότε το αρχείο διαγράφεται επίσης.

Page 46: Λειτουργικά Συστήματα Ι

46

5.8 Σημαντικά Θέματα Υλοποίησης

Διαχείριση των disk blocks ενός αρχείου

Συνήθως ο τρόπος διαχείρισης των disk blocks εξαρτάται από τον τρόπο ανάθεσης blocks σ' ένα αρχείο.

Υπάρχουν 3 βασικές στρατηγικές ανάθεσης: Συνεχόμενη ανάθεση (contiguous allocation), Ανάθεση βασιζόμενη σε συνδεδεμένες λίστες (linked-

list), & Δεικτοδοτημένη ανάθεση (indexed allocation)

Page 47: Λειτουργικά Συστήματα Ι

47

Συνεχόμενη Ανάθεση (Contiguous)

Ο πιο απλός τρόπος ανάθεσης.

Όταν ένα αρχείο χρειάζεται N disk blocks, τότε Ν συνεχόμενα blocks ανατίθενται στο αρχείο αυτό.

Πέραν της απλότητας, αυτή η στρατηγική έχει το

πλεονέκτημα ότι για να διαβαστεί ολόκληρο το αρχείο απαιτείται να πληρωθεί το κόστος για το disk seek και η κα8υστέρηση περιστροφής δίσκου (disk rotational delay) μόνο μια φορά.

Αυτό είναι σημαντικό εξ αιτίας των σχετικών μεγάλων κοστών !!!

Page 48: Λειτουργικά Συστήματα Ι

48

Συνεχόμενη Ανάθεση

Τα μειονεκτήματα της συνεχόμενης ανάθεσης είναι

ότι συχνά δεν είναι γνωστό από πριν (και είναι μεταβαλλόμενο) το μέγιστο μέγεθος του αρχείου το ΣΑ δεν μπορεί να ξέρει πόσα disk blocks ν' αναθέσει. !

Επίσης (κυρίως όταν τα αρχεία διαγράφονται) δημιουργούνται προβλήματα κατακερματισμού (fragmentation). Δηλ. ένας δίσκος μπορεί να διαθέτει συνολικά N ελεύθερα (free) blocks και ένα αρχείο που χρειάζεται N blocks να μην μπορεί να δημιουργηθεί λόγω του ότι τα N ελεύθερα blocks του δίσκου δεν είναι συνεχόμενα.

Αυτό το πρόβλημα λύνεται μόνο μέσω σύμπτυξης (compaction) αλλά αυτό στοιχίζει πάρα πολύ (disk_to_disk copying). Μπορεί όμως να γίνει "off-line" δηλ. την νύχτα όταν το σύστημα δεν χρησιμοποιείται.

Page 49: Λειτουργικά Συστήματα Ι

49

Ανάθεση με συνδεδεμένες λίστες

Linked List Allocation:

Μ' αυτή τη στρατηγική τα αρχεία είναι μια λίστα από blocks, με μερικά bytes του κάθε block να δείχνουν στο επόμενο block της λίστας. αποφεύγεται το πρόβλημα κατακερματισμού. Επίσης η κάθε εγγραφή καταλόγου αποθηκεύει μόνο τη διεύθυνση του 1ου block του αρχείου.

Το βασικό πρόβλημα αυτής της μεθόδου είναι ότι όταν επιθυμείται τυχαία προσπέλαση (random access), η απόδοση του συστήματος είναι άθλια!

Page 50: Λειτουργικά Συστήματα Ι

50

Ανάθεση με συνδεδεμένες λίστες

Παράδειγμα: Για να προσπελαστεί το Ν-οστό block πρέπει πρώτα να

γίνουν Ν-1 παραπανίσια disk Ι/Οs.

Το πρόβλημα αυτό μπορεί να λυθεί χρησιμοποιώντας ένα χάρτη δεικτοδότησης (index) στη Κ.Μ. που περιέχει τους δείκτες για τα disk blocks.

Page 51: Λειτουργικά Συστήματα Ι

51

Δεικτοδοτημένη ανάθεση (indexed allocation)

Η πρώτη επιλογή αφορά στο αν υπάρχει "per file" index ή ένα index για όλα τα αρχεία στο σύστημα. Το UNIX FS χρησιμοποιεί per-file index ενώ το MS-DOS χρησιμοποιεί "global" index.

Με global index, το index βρίσκεται πάντα στη ΚΜ

παραπανίσια disk I/Os ελαχιστοποιούνται.

Το πρόβλημα όμως είναι ότι το global index καταναλώνει πολύ Κ.Μ. γιατί διαθέτει μια εγγραφή για κάθε block του δίσκου.

Page 52: Λειτουργικά Συστήματα Ι

52

Δεικτοδοτημένη ανάθεση (indexed allocation)

Ένα παράδειγμα per-file index είναι τα inodes που χρησιμοποιεί το UNIX.

To inode πρώτα περιέχει τα attributes. Κατόπιν 10 δείκτες για τα πρώτα 10 blocks του αρχείου.

Κατόπιν ένα δείκτη που δείχνει σ' ένα disk block (single indirect block) που με τη σειρά του δείχνει στα επόμενα 256 disk blocks του file.

Κατόπιν ένα δείκτη σε double indirect block Κατόπιν ένα δείκτη σε triple indirect block.

Page 53: Λειτουργικά Συστήματα Ι

53

5.8.2 Υλοποίηση Καταλόγων

Η δομή των στοιχείων των καταλόγων διαφέρει από ΣΑ σε ΣΑ, όπως είπαμε.

Στο UNIX: έχει τη μορφή (fname, inode#).

Όλα τα inodes (για όλα τα ΣΑ) είναι αποθηκευμένα στην αρχή του δίσκου που αποθηκεύει το ΣΑ, και ονομάζονται με inode1, inode2, inode3, ...

Μετάφραση Ονόματος (Pathname translation): Η διαδικασία που δέχεται σαν είσοδο ένα pathname (π.χ. "/d1/d2/d3/foo") και παράγει σαν έξοδο το inode# του αρχείου.

Page 54: Λειτουργικά Συστήματα Ι

54

Μετάφραση Ονόματος Μονοπατιού

Η διαδικασία αυτή έχει ως εξής: 1.

a) Το inode για το root directory "/" ανακτάται από τον δίσκο. (Αυτό το inode βρίσκεται σε μια γνωστή και μη ενημερώσιμη διεύθυνση στο δίσκο).

b) Απ' το inode του root βρίσκονται τα disk blocks (που περιέχουν τα dir. entries), ανακτώνται και ψάχνονται για την εγγραφή "d1". Όταν βρίσκεται η εγγραφή για το "d1" τότε βρίσκεται και το inode# του d1.

2.c) Το inode για το "d1" ανακτάται απ' το δίσκο. d) Τα disk blocks του dir file "d1" ανακτώνται και

ψάχνονται για την εγγραφή "d2"….

Page 55: Λειτουργικά Συστήματα Ι

55

Μετάφραση Ονόματος Μονοπατιού

a) Τέλος το inode & disk blocks του "dir3" ανακτώνται και ψάχνονται για την εγγραφή "foo".

b) Έτσι βρίσκεται το inode# για το αρχείο «foo» το οποίο ανακτάται και τοποθετείται στη μνήμη (σ' ένα cache ειδικό για inodes που λέγεται inode table).

3. Αφού τοποθετηθεί το inode στο inode table του πυρήνα ο file descriptor πίνακας του process ενημερώνεται.

4. Μια εγγραφή του χρησιμοποιείται για έναν δείκτη ακολουθώντας τον οποίο μπορεί ο kernel να βρει το inode στο inode table.

5. Τέλος επιστρέφεται ο δείκτης της εγγραφής του file descriptor πίνακα...

Page 56: Λειτουργικά Συστήματα Ι

56

5.8.3 Διαμοιραζόμενα Αρχεία [SHARED FILES]

Για να διευκολυνθεί ο διαμοιρασμός αρχείων, συχνά ένα αρχείο εμφανίζεται σε πολλούς διαφορετικούς καταλόγους (π.χ. σ' έναν κατάλογο για κάθε χρήστη που το διαμοιράζεται).

Αυτό επιτυγχάνεται με links που συνδέουν ένα πεδίο καταλόγου μ' ένα αρχείο σε κάποιον άλλον κατάλογο.

Αν τα πεδία καταλόγων εμπεριέχουν τις διευθύνσεις των μπλοκς στο δίσκο, τότε στον κατάλογο που ορίζεται το link σ' ένα αρχείο F1 θα πρέπει να γίνει ένα αντίγραφο των διευθύνσεων στο δίσκο των μπλοκ του F1. Αν αυτά αλλάξουν (π.χ. append()) τότε προκύπτει πρόβλημα διαχείρισης αντιγράφων.

Page 57: Λειτουργικά Συστήματα Ι

57

5.8.3 Διαμοιραζόμενα Αρχεία [SHARED FILES]

Στο UNIX το πρόβλημα λύνεται ως εξής: Τα πεδία καταλόγων δεν περιέχουν διευθύνσεις στο δίσκο

αλλά (ουσιαστικά) δείκτες σε δομές του πυρήνα (δηλ. τα inodes) που τις περιέχουν.

Μια άλλη λύση βασίζεται στην έννοια «συμβολικών συνδέσμων» (symbolic link).

Όταν δημιουργείται ένα link L1 στο αρχείο F1, το L1 είναι ένα ειδικό αρχείο τύπου link.

Τα περιεχόμενα αρχείων τύπου link είναι μόνο το pathname του αρχείου στο οποίο είναι link.

Όπως είναι προφανές, symbolic links προσθέτουν παραπάνω κόστος.

Page 58: Λειτουργικά Συστήματα Ι

58

5.8.4 Ανάθεση Μονάδων Δίσκου σε Αρχεία

Όπως προείπαμε, τα αρχεία συνήθως δεν αποθηκεύονται σε συνεχή μπλοκ του δίσκου. Αυτό συμβαίνει για να αποφευχθούν τα προβλήματα

κατακερματισμού και το κόστος αντιγραφών (disk_to_disk copying).

αρχεία χωρίζονται σ' ένα αριθμό μπλοκ και το κάθε μπλοκ αρχείου αποθηκεύεται σε συνεχόμενους τομείς (disk sectors) στο δίσκο (που λέγονται μπλοκ του δίσκου).

Μέγεθος BLOCK Πόσο μεγάλα πρέπει να είναι τα μπλοκ αρχείων;

Page 59: Λειτουργικά Συστήματα Ι

59

5.8.4 Ανάθεση Μονάδων Δίσκου σε Αρχεία

Σε πολλά περιβάλλοντα τα αρχεία είναι μικρά.

Αν το μπλοκ είναι μεγάλο τότε θα σπαταλείται χώρος στο δίσκο.

Αν, αντιθέτως, τα μπλοκ είναι μικρά, τότε για να ανακτηθεί ένα ολόκληρο αρχείο θα χρειαστούν πολλά «disk seeks» (ένα για κάθε block).

Η απόδοση (throughput) του συστήματος θα είναι κακή γιατί για μεγάλα χρονικά διαστήματα ο δίσκος εκτελεί εντολές seek (και όχι "χρήσιμες" λειτουργίες).

βλέπουμε μια διελκυνστίδα (trade-off) μεταξύ καλής εκμετάλλευσης χώρου (space efficiency) & καλής απόδοσης – έργο ανά μονάδα χρόνου (throughput).

Page 60: Λειτουργικά Συστήματα Ι

60

Διαχείριση Ελεύθερου Χώρου στο Δίσκο

Συνήθως, χρησιμοποιούνται 2 μέθοδοι:

Συνδεδεμένες λίστες (Linked List):

Κάθε κόμβος της λίστας είναι ένα μπλοκ δίσκου. Κάθε κόμβος περιέχει:

και Ν-1 διευθύνσεις ελευθέρων (free) μπλοκ, όπου Ν είναι ο αριθμός των διευθύνσεων που χωρούν σ' ένα μπλοκ δίσκου.

την διεύθυνση του επόμενου κόμβου της λίστας

(π.χ. με μέγεθος μπλοκ = 2K και με διευθύνσεις 4 ψηφίων, N = 2048/4).

Page 61: Λειτουργικά Συστήματα Ι

61

Διαχείριση Ελεύθερου Χώρου στο Δίσκο

Χάρτης ψηφίων (Bit Map): Ένας πίνακας (bit map) με Ν εγγραφές απαιτείται για

ένα δίσκο με N blocks. Τα ελεύθερα μπλοκ αντιπροσωπεύονται με την τιμή 1

στον πίνακα.

για κάθε μπλοκ κρατείται πληροφορία μεγέθους 1 bit και όχι μερικά bytes όπως στη μέθοδο linked list

(εκτός μερικών περιπτώσεων) η μέθοδος bit map είναι προτιμότερη, από πλευράς χώρου.

Page 62: Λειτουργικά Συστήματα Ι

62

Διαχείριση Ελεύθερου Χώρου στο Δίσκο

Επίσης, επειδή το bit map είναι μικρότερο υπάρχει μεγαλύτερη πιθανότητα να χωράει στη

Κ.Μ. Αν ναι, τότε η μέθοδος bit map προτιμάται Αν όχι, τότε μπορεί κάθε block/κόμβος της

λίστας (linked list) περιέχει συνήθως πιο πολλά ελεύθερα blocks απ' ότι ένα μπλοκ του bit map

ίσως να είναι προτιμότερη η μέθοδος linked list.

Page 63: Λειτουργικά Συστήματα Ι

63

5.9 Βελτιώνοντας την Απόδοση του Συστήματος

Όπως έχουμε πει, κάθε πρόσβαση στη Κ.Μ. κοστίζει < 1 μs, ενώ κάθε πρόσβαση στο δίσκο κοστίζει ~ 8 ms.

το FS θα έχει την καλύτερη δυνατή απόδοση όσο πιο λίγες φορές χρειάζεται disk I/O!!!

Προσωρινή (Κρυφή) Μνήμη Η επίτευξη του στόχου αυτού βασίζεται στην έννοια της

F.S. buffer cache. H κρυφή μνήμη είναι ένα τμήμα της Κ.Μ. (στον πυρήνα) το οποίο αποθηκεύει προσωρινά μερικά μπλοκ του δίσκου.

Page 64: Λειτουργικά Συστήματα Ι

64

Προσωρινή (Κρυφή) Μνήμη

Όταν κάποια διεργασία ζητεί πρόσβαση σε κάποιο μπλοκ, ο πυρήνας φορτώνει πρώτα αυτό το μπλοκ στην κρυφή μνήμη και μετά το δίνει στη διεργασία.

οι μεταγενέστερες αιτήσεις (από την ίδια ή άλλες διεργασίες) για το ίδιο μπλοκ θα εξυπηρετηθούν από τη κρυφή μνήμη.

το disk I/O αποφεύγεται!

Έτσι, κάθε φορά που ζητείται κάποιο μπλοκ, ο kernel πρώτα ψάχνει τη κρυφή μνήμη και μόνο αν δεν το βρει απευθύνεται στο δίσκο.

Page 65: Λειτουργικά Συστήματα Ι

65

Προσωρινή (Κρυφή) Μνήμη

Φυσικά, απαιτείται κάποιος αλγόριθμος αντικατάστασης έτσι ώστε να λειτουργεί η πιο πάνω διαδικασία ακόμα και όταν γεμίζει η κρυφή μνήμη.

Αυτός ο αλγόριθμος είναι συνήθως LRU (με μερικές αλλαγές).

Πριν ένα μπλοκ της Buffer Cache "φιλοξενήσει" ένα καινούργιο μπλοκ του δίσκου, θα πρέπει το αρχικό μπλοκ να εγγραφεί στο δίσκο αν έχει ενημερωθεί όσο ήταν στην κρυφή μνήμη (δηλ. αν είναι dirty).

[Αυτή είναι η ανάλογη ενέργεια που συμβαίνει από το paging σύστημα, που γράφει μια σελίδα στο χώρο εναλλαγής πριν το ίδιο πλαίσιο σελίδας φιλοξενήσει κάποια καινούργια σελίδα].

Page 66: Λειτουργικά Συστήματα Ι

66

Προσωρινή (Κρυφή) Μνήμη

Οι αλλαγές στον αλγόριθμο LRU χρειάζονται: για να αποφευχθούν όσο το δυνατόν περισσότερα

disk I/Os... Πρόβλημα κόστους... για να αποφευχθούν προβλήματα ασυνέπειας του F.S.

ή χάσιμο δεδομένων όταν συμβούν βλάβες.

Ζήτημα ασυνέπειας: Όταν ένα μπλοκ ενημερώνεται, αυτό πρώτα γίνεται

στην κρυφή μνήμη. Αν συμβεί κάποια αστοχία/σφάλμα τότε η ενημέρωση ‘χάνεται’.

απαιτείται μια πολιτική εγγραφής (write policy).

Page 67: Λειτουργικά Συστήματα Ι

67

Προσωρινή (Κρυφή) Μνήμη

Όταν κάποιο μπλοκ στην κρυφή μνήμη περιέχει ευαίσθητα δεδομένα, όσον αφορά στη συνέπεια του συστήματος, τότε όταν αυτό το block ενημερωθεί εγγράφεται αμέσως στο δίσκο (σύγχρονα ή ασύγχρονα).

Επίσης συνήθως υπάρχει κάποιο άνω όριο, όσον αφορά το χρόνο κατά τον οποίο ένα ενημερωμένο μπλοκ παραμένει στην κρυφή μνήμη χωρίς να εγγραφεί στο δίσκο.

Για να μη χαθούν δεδομένα όταν συμβούν σφάλματα και βλάβες, πολλά συστήματα παρέχουν ειδικά system calls (π.χ. flush() ή SYNC) τα οποία γράφουν όλα τα ενημερωμένα blocks από την κρυφή μνήμη στο δίσκο.

Σε πολλά «UNIX F.S». (πχ NFS) υπάρχει ένα «πρόγραμμα παρασκηνίου» (background program) το οποίο εκτελείται κάθε 30 secs, το οποίο εκτελεί τη SYNC.

τα χαμένα δεδομένα μπορεί να είναι αυτά που γράφτηκαν μόνο τα τελευταία 30 secs.

Page 68: Λειτουργικά Συστήματα Ι

68

Προσωρινή (Κρυφή) Μνήμη

Ευαίσθητα δεδομένα είναι: inode μπλοκ, directory μπλοκ, και γενικά μπλοκ που δεν έχουν απλά δεδομένα χρηστών.

π.χ. Σκεφθείτε τι θα συμβεί αν το inode μπλοκ ενός αρχείου ενημερωθεί και πριν εγγραφεί στο δίσκο, καταρρεύσει το σύστημα.

Ζήτημα κόστους: Όταν κάποιο μπλοκ στην κρυφή μνήμη είναι μόνο μερικώς

ενημερωμένο τότε τοποθετείται στο τέλος της LRU λίστας (καθυστερημένη εγγραφή) αφού δεν αναπληρώνεται αμέσως υπάρχει πιθανότητα όταν, μετά από χρόνο, αναπληρωθεί, να έχει ενημερωθεί ολόκληρο και έτσι θα απαιτηθεί ένα και μόνο disk I/O για όλες τις ενημερώσεις ενός μπλοκ.

Page 69: Λειτουργικά Συστήματα Ι

Προσωρινή (Κρυφή) Μνήμη Απαιτείται

μηχανισμός γρήγορου εντοπισμού μπλοκ στην Προσωρινή (Κρυφή) Μνήμη

Μηχανισμός διαχείρισης ελεύθερων μπλοκ στην Προσωρινή (Κρυφή) Μνήμη

Σε συνεργασία με μηχανισμούς διαχείρισης σύγχρονων, ασύγχρονων και καθυστερημένων εγγραφών.

69

Page 70: Λειτουργικά Συστήματα Ι

70

Προσωρινή (Κρυφή) Μνήμη στο UNIX

Block#0 mod 4

Block#1 mod 4

Block#2 mod 4

Block#3 mod 4

16

5

10

25

90

37

5115

524464

3

6670

99

45

Hash Q HeadersFree List Header

Page 71: Λειτουργικά Συστήματα Ι

71

Προσωρινή (Κρυφή) Μνήμη στο UNIX

Free list: για ανάθεση Υλοποιεί LRU αλγόριθμο

Αναζήτηση με βάση τον αριθμό μπλοκ ανεξάρτητη από το συγκεκριμένο δίσκο (δηλ. Αριθμός

κυλίνδρου, επιφάνειας, κλπ). Αν βρεθεί, τότε βγαίνει από τη λίστα LRU.

Απελευθέρωση: επιστρέφεται στο τέλος της λίστας LRU

Page 72: Λειτουργικά Συστήματα Ι

72

Ομαδοποίηση (Clustering) Μπλοκ

Μια άλλη τεχνική για να βελτιωθεί η απόδοση ενός Σ.Α. βασίζεται στην έννοια του clustering (ομαδοποίηση μπλοκ σε «γειτονιές»)

το κόστος της εντολής seek (που μετακινεί τις κεφαλές του

δίσκου από ένα κύλινδρο σε άλλον) είναι συνάρτηση του διαστήματος που διανύουν οι κεφαλές του δίσκου

Μπλοκ που ανακτώνται / ζητούνται συνήθως το ένα μετά το άλλο, τοποθετούνται κοντά στο δίσκο (π.χ. στο ίδιο ή κάποιο κοντινό κύλινδρο).

το seek που απαιτείται για ν' ανακτηθεί το επόμενο μπλοκ προσθέτει ελάχιστο επιπλεόν κόστος.

Προσέξτε ότι όταν η διαχείριση των ελευθέρων μπλοκ γίνεται με χάρτες ψηφίων, διευκολύνεται η ανάθεση συνεχόμενων μπλοκ ενός αρχείου σε κοντινά μπλοκ του δίσκου.

Πώς μπορεί να επιτευχθεί κάτι ανάλογο με «free lists» ;

Page 73: Λειτουργικά Συστήματα Ι

73

Τοποθέτηση με βάση την περιστροφή δίσκου

(Rotationally-optimal Placement)

Στρατηγικές ανάθεσης ελεύθερων μπλοκ σε αρχεία προσπαθούν να μειώσουν το χρόνο περιστροφής (rotational delay). Έτσι, όταν συνεχόμενα μπλοκ ενός αρχείου τοποθετούνται στην ίδια τροχιά (track) (ή κύλινδρο) του δίσκου, υπάρχει ένα "κενό" το μέγεθος του οποίου εξαρτάται από το χρόνο που απαιτείται για την ικανοποίηση ενός get-disk-block-request.

π.χ. αν μια ολόκληρη περιστροφή του δίσκου γίνεται σε 10 ms και από την στιγμή που ανακτάται ένα μπλοκ του δίσκου περνούν 3 ms πριν ο δίσκος λάβει την αίτηση για το επόμενο μπλοκ, τότε το μέγεθος του "κενού" είναι 3 ms.

Page 74: Λειτουργικά Συστήματα Ι

74

Σχετική Τοποθέτηση inode και Data

Σε παλιά UNIX F.S. τα μπλοκ των inodes τοποθετούνται στα αρχικά μπλοκ του δίσκου. απαιτείται μεγάλο seek μεταξύ του inode μπλοκ ενός αρχείου και των data μπλοκ του αρχείου.

Μια λύση στο πρόβλημα αυτό βασίζεται στην έννοια των ομάδων κυλίνδρων (cylinder groups). Κάθε ομάδα αποτελείται από Ν συνεχόμενους κυλίνδρους και

περιέχει inodes, μπλοκ για data, και την δική του free list. Οταν δημιουργείται ένα αρχείο επιλέγεται οποιοδήποτε

inode από κάποια ομάδα και το σύστημα προσπαθεί τα data μπλοκ του αρχείου να βρίσκονται στην ίδια ομάδα με το inode μπλοκ.