260 likes | 353 Views
Weatherly (2009). MinixVM : An Implementation of Virtual Memory in Minix 3. Σκοπ ός. Η ενσωμ άτωση υποστήριξης για virtual memory στο Minix 3 Βάση τροποποιήσεων η έκδοση 3.1.3α. Προβλ ήματα. Αν άθεση ολόκληρου του process Οδηγεί σε εσωτερικό κατακερματισμό της μνήμης
E N D
Weatherly (2009) MinixVM: An Implementation of Virtual Memory in Minix 3
Σκοπός • Η ενσωμάτωση υποστήριξης για virtual memory στο Minix 3 • Βάση τροποποιήσεων η έκδοση 3.1.3α
Προβλήματα • Ανάθεση ολόκληρου του process • Οδηγεί σε εσωτερικό κατακερματισμό της μνήμης • οι διεργασίες δε χρησιμοποιούν πάντοτε όλη τη μνήμη που ανατίθεται • Και εξωτερικό κατακερματισμό • Σχηματισμός πολλών οπών που είναι δύσκολο να χρησιμοποιηθούν • Στο Minixτουλάχιστον το read-only κομμάτι διαμοιράζεται στα processes • Αλλά τα προβλήματα παραμένουν
Προβλήματα • Η ανάθεση μνήμης γίνεται στατικά • Όλοι οι πόροι πρέπει να δηλωθούν στον πηγαίο κώδικα • Ο κακός υπολογισμός των απαιτούμενων πόρων οδηγεί σε προβλήματα κατά το run-time • Τερματισμός λόγω ανεπαρκούς μνήμης • Σημαντικός εσωτερικός κατακερματισμός • Δύσκολο το porting προγραμμάτων καθώς τα περισσότερα θεωρούν τη μνήμη ως «άπειρη» • Virtual memory!
Swapping • Υπάρχει περιορισμένη υποστήριξη για swapping • Η ανάθεση μνήμης γίνεται σε κομμάτια που αφορούν όλη τη διεργασία • Μπορεί να γίνει swap, αλλά λόγω του τρόπου ανάθεσης μνήμης, πρέπει να γίνει swap όλο το process • Μπορεί να καταλήξει πολύ πιο γρήγορα σε καταστάσεις thrashing
MinixVM • Βασική διαφορά, ο ορισμός εξ΄αρχής του memory object • Στο minix 3, memory object -> η ανάθεση κομματιού μνήμης που χρειάζεται η διεργασία • Στο minixVM, η ανάθεση γίνεται σε διακριτές σελίδες (pages) • Η διαχείριση των σελίδων θα γίνει μέσω ενός νέου server (page server)
Έννοιες • Για τη χρήση VM συνήθως χρειάζονται • Hardware • Page fault handler • Page allocator • Process manager • File system interface • Μπορούν να τροποποιηθούν υπάρχοντα στοιχεία του minix 3 • Page fault handler στο kernel • PM για δρομολόγηση page-fault μηνυμάτων • VFS για την ανάγνωση εκτελέσιμων προγραμμάτων όταν γίνει page fault • Για τον καλύτερο συντονισμό – page server
Page server • Διαχείριση του address space για όλες τις διεργασίες • Καθορισμός αν κάποιο page fault αντιπροσωπεύει έγκυρη απαίτηση πρόσβασης στη μνήμη για κάποια διεργασία • Ο page server γίνεται memory manager, καθώς πρέπει να έχει τη διαχείριση και του physical address space
Page server • Δομές δεδομένων • Process metadata • Process ID, endpoint number • Ακόμα ένας server που πρέπει να γνωρίζει για τη δημιουργία/τερματισμό διεργασιών • Hardware page tables • Δομές που διαβάζει απ’ευθείας το MMU • To kernel δε μπορεί να κάνει απ’ευθείας δυναμική εκχώρηση μνήμης αλλά μπορεί να διαβάσει όλες τις διευθύνσεις φυσικής μνήμης • Υλοποίηση των hardware page tables σε userspace program
Page server • Δομές δεδομένων • Supplemental page tables • Χειρισμός περιπτώσεων όπου η μνήμη έχει εκχωρηθεί αλλά δε βρίσκεται στο κύριο υλικό (η σελίδα έχει γίνει swapped out στο δίσκο) • Ο server πρέπει να γνωρίζει ποιές από τις σελίδες στο δίσκο ανήκουν σε ποιά διεργασία ώστε να μπορεί να ελέγχει την εγκυρότητα της αίτησης πρόσβασης σε αυτές
Υλοποίηση • Στο minix, το kernel και οι κρίσιμοι servers γίνονται compile σε ένα ενιαίο binary το οποίο φορτώνεται από boot monitor κατά τη διαδικασία εκκίνησης • Έτσι δεν έχει νόημα να φορτώσουμε τον page server πριν από άλλες υπηρεσίες καθώς τέτοια διαδικασία δεν υποστηρίζεται. • Κατάληξη: οι servers τρέχουν σε non-paged mode
Περιορισμοί υλοποίησης • Κάποιες διεργασίες δε μπορούν να γίνουν paged • Servers • Περιορισμένο heap space • Καθώς ο page server δεν είναι paged, έχει τον ίδιο περιορισμό του heap με τις παραδοσιακές διεργασίες, καθώς απαιτεί στατική εκχώρηση μνήμης.
Βασικές αρχές Εκκίνηση • Το boot monitor φορτώνει και περνάει τον έλεγχο στο kernel • Το kernel κάνει αρχικοποιήσηκαι μεταφέρει τον έλεγχο στον PM • O PM ζητά το χάρτη της μνήμης από το boot monitor, καθώς αυτό ξέρει ποιά κομμάτια μνήμης χρησιμοποιούνται ήδη • Το boot monitor στέλνει το χάρτη • O PM επιστρέφει τον έλεγχο στο kernel • Αργότερα το kernel μεταφέρει τον έλεγχο στον κώδικα αρχικοποίησης του page server • Ο page server ζητά το χάρτη της μνήμης από τον PM • Ο PM στέλνει το χάρτη • O Page server επιστρέφει τον έλεγχο στο kernel. Αν δεν χρειάζονται αρχικοποίηση άλλοι servers, το kernel εκτελεί την init.
Exec notification • O χρήστης ζητά ένα exec() στέλνοντας μήνυμα στονPM (blocking call οπότε η διεργασία σταματά μέχρι την εκτέλεση του exec) • OPM στέλνει μήνυμα στον pageserver ότι ξεκινά μια νέα διεργασία (blocking call γιατί ο PM χρειάζεται το page directory base address από τον page server για να συνεχίσει) • O page server απαντά στον PM με το page directory base register για το καινούριο process • O PMειδοποιεί το kernel (sys_exec()) για την ολοκλήρωση του exec(blocking call καθώς ο PM πρέπει να απαντήσει συγχρονισμένα στην καλούσα διεργασία) • Το kernel απαντά με το exec status • Ο PM περνά το exec status στην καλούσα διεργασία
Page fault handling • Tohardware εντοπίζει ένα page fault exception και στέλνει τον έλεγχο στον σημείο που ορίζει το kernel (page fault handler) • To kernel στέλνει non-blocking ειδοποίηση στον PM • Ο PM επεξεργάζεται την ειδοποίηση από το kernel και επιστρέφει μήνυμα για να πάρει τις λεπτομέρειες τουpage fault. Μπλοκάρει μέχρι να λάβει απάντηση • To kernel επιστρέφει τις λεπτομέρειες
Page fault handling • Ο PM στέλει μήνυμα στονpage server για να ελέγξει την εγκυρότητα του page fault request • O page server απαντά. Αν δεν είναι έγκυρο, το PM αναφέρει στο kernel • Αλλιώς στέλνει μήνυμα στοVFS για να διαβάσει τη σχετική σελίδα. • O VFS παντά με το σχετικό status • O PM στέλνει μήνυμα στον page server για να ειδοποιήσει για το αποτέλεσμα της επεξεργασίας του page fault • O PM στέλει μήνυμα στο kernel, για να ειδοποιήσει για το αποτέλεσμα της επεξεργασίας του page fault
Χρήση registers • CR0 – το paging είναι διαθέσιμο όταν το 31οbit αυτού του register είναι ενεργοποιημένο • CR2 – με τη λήψη ενός page fault exception, το υλικό βάζει στο register αυτό τη γραμμική διεύθυνση που προκάλεσε το fault • CR3 – περιέχει τη διεύθυνση της βάσης για τα hardware page tables και αλλάζει σε κάθε context switch διεργασίας
Σύνοψη αλλαγών • Kernel • Register access • Για αρχιτεκτονική Intel, φορτώνεται το register CR2 που περιέχει τη γραμμική διεύθυνση που προκάλεσε το page fault • Προστέθηκε μια assembly routine ώστε η τιμή να μπορεί να περάσει τον page fault handler • Page fault exception handler • Η default δράση ήταν να στέλνεται ένα SIGSEGV σήμα στην διεργασία που προκάλεσε το πρόβλημα. Τώρα διαβάζεται η διεύθυνση από το CR2 και ειδοποιείται ο PM. • VM mapping • Προστέθηκαν συναρτήσεις για τη μετάφραση εικονικών σε πραγματικές διευθύνσεις (mapping) • Exec system call • Τροποποιήθηκε το SYS_EXEC ώστε να καταγράφει το page directory base address στο process data structure του kernel, με σκοπό να είναι διαθέσιμο στοregister CR3 κατά τη διάρκεια ενός context switch • Process switch • Το kernel πρέπει να φορτώσει το CR3 με το base address των hardware page tables. Τροποποιήθηκε ο σχετικός κώδικας.
Σύνοψη αλλαγών • PM • Memory management • Μεταφορά της διαχείρισης μνήμης στον page server, ώστε να έχει πλήρη έλεγχο του physical address space • Αλλαγή των συναρτήσεων allocate, free, copy free memory holes σε μηνύματα προς τον page server • Page server initialization • Αφού ο page server τρέχει μετά τον PM, με ανταλλαγή μηνυμάτων παίρνει το χάρτη της μνήμης από τον PM • Page fault processing • Page fault exceptions: από το kernel στον PM με χρήση του HARD_INT προς τον PM (ανορθόδοξο αλλά ο μόνος τρόπος). • Page fault validation: προστέθηκε μηχανισμός επικοινωνίας με τον page server ώστε να γνωρίζει ο PM για την εγκυρότητα της αίτησης • Page reading: προστέθηκε μηχανισμός επικοινωνίας με τονVFS για τα αποτελέματα της ανάγνωσης από το δίσκο.
Σύνοψη αλλαγών • PM • Exec processing • Ελαφρά τροποποίηση ώστε να μη φορτώνεται το executable από το δίσκο, αφήνοντάς το να γίνει paged κατ’απαίτηση αργότερα. • Υποστήριξη ειδοποίησης προς τον page server • VFS • Executable data addition • Πρόσθεση πληροφοριών στο vfs image κάποιου process ώστε να διατηρούνται: • Το inodeτουεκτελέσιμου • Το endpoint του file system driver για το file system στο οποίο βρίσκεται το εκτελέσιμο • Το μήκος του header του εκτελέσιμου για τον υπολογισμό offsets καθώς διαβάζονται τμήματά του προς τη μνήμη • Το μήκος του text section του εκτελέσιμου • Το μήκος της αρχικοποιημένης data section του εκτελέσιμου • Το μήκος της μη-αρχικοποιημένης data section του εκτελέσιμου
Σύνοψη αλλαγών • VFS • Page reading • Κώδικας για την ανάγνωση σελίδων από το file system • Ανάγνωση ενός chunk μήκους μιας σελίδας ή του binary, αν είναι μικρότερο • Αν αποτελείται από initialized data, τότε διαβάζεται όλο το page • Αν αποτελείται από uninitialized data, τότε το page διαβάζεται κενό • Aν αποτελείται από μείγμα, διαβάζεται το αρχικοποιημένο κομμάτι και το υπόλοιπο αφήνεται κενό
Νέα μηνύματα • Kernel: 1 • PM: 7 • VFS: 1 • Page Server: 7 • Σύνολο 16 νέα μηνύματα
Ανάλυση • Σετ κοινών λειτουργιών compression, decompression, archiving, compiling • Χρήση ενός tarball (180mb, 4242 αρχεία) • kbuild– χρόνος compilation για τους system servers & kernel (cc) • Παρατηρείται αρκετό overhead με την paged έκδοση (1.08 φορές πιο αργά κατά ΜΟ).
Ανάλυση • Sequential scan • Δήλωση array τιμών από 2-64 σε δυνάμεις του 2 • Αρχικοποίηση του array • Απομείωση σε scalar • Εκτύπωση του αποτελέσματος • Περίπτωση Α: πρόγραμμα σε c και εκτέλεση • Περίπτωση Β: PERL script (εκτελέσιμο το perl)
Ανάλυση • Έντονες διαφορές που έχουν σχέση με τον τρόπο που εκτελούνται τα προγράμματα (compiled vs. interpreted)
Συμπέρασμα • Το paging προκαλεί σε όλες τις περιπτώσεις overhead και μειώνει την απόδοση • Οφείλεται περισσότερο στα συχνά mode switches (από user σε kernel mode και το αντίστροφο), παρά σε απαιτήσεις επεξεργαστικής ισχύος. • Καθώς είναι αναπόφευκτα αυτά τα mode switches, σε ένα microkernel σύστημα η υλοποίηση paging και virtual memory πάντα θα είναι αργότερη από κάποιο αντίστοιχο μονολιθικό σύστημα