Τι συμβαίνει με τη μνήμη της διαδικασίας όταν δημιουργούμε ένα αντίγραφό της χρησιμοποιώντας την κλήση συστήματος fork στο λειτουργικό σύστημα Linux;
sobes.tech AI
Απάντηση από AI
Κατά την κλήση του fork(), ο πυρήνας του λειτουργικού συστήματος δημιουργεί μια νέα διαδικασία, μια θυγατρική διαδικασία, η οποία είναι σχεδόν ακριβές αντίγραφο της μητρικής διαδικασίας.
Όσον αφορά τη μνήμη, συμβαίνουν τα εξής:
-
Εικονικός χώρος διευθύνσεων: Η θυγατρική διαδικασία λαμβάνει τον δικό της εικονικό χώρο διευθύνσεων, ο οποίος είναι πανομοιότυπος με αυτόν της μητρικής κατά τη στιγμή της κλήσης
fork(). Αυτό σημαίνει ότι η θυγατρική "βλέπει" τα ίδια εύρη διευθύνσεων και έχει την ίδια δομή τμημάτων (κώδικα, δεδομένα, στοίβα, σωρός) με τη μητρική. -
Φυσική μνήμη και Copy-on-Write (CoW): Αρχικά, οι διαδικασίες μητρική και θυγατρική μοιράζονται τις ίδιες σελίδες φυσικής μνήμης. Αυτή είναι μια βελτιστοποίηση γνωστή ως "Copy-on-Write" (CoW). Η φυσική μνήμη αντιγράφεται μόνο όταν μία από τις διαδικασίες προσπαθεί να αλλάξει το περιεχόμενο της σελίδας.
- Αν η μητρική ή η θυγατρική γράψει δεδομένα σε μια σελίδα που ήταν κοινή, ο πυρήνας δημιουργεί ένα νέο αντίγραφο αυτής της σελίδας φυσικής μνήμης για τη διαδικασία που γράφει. Η άλλη διαδικασία συνεχίζει να χρησιμοποιεί την παλιά έκδοση της σελίδας.
- Αν οι διαδικασίες διαβάζουν μόνο δεδομένα, συνεχίζουν να χρησιμοποιούν την κοινή σελίδα φυσικής μνήμης.
-
Διαχειριστές αρχείων: Οι ανοιχτοί διαχειριστές αρχείων κληρονομούνται από τη θυγατρική διαδικασία. Και οι δύο διαδικασίες μοιράζονται δείκτες σε μετατόπιση αρχείου.
-
Άλλοι πόροι: Άλλοι πόροι, όπως χειριστές σημάτων, τρέχον κατάλογος εργασίας κ.λπ., επίσης αντιγράφονται ή κληρονομούνται.
Ακολουθεί μια απλοποιημένη εικόνα:
Πριν το fork():
+-------------------+
| Μητρική διαδικασία |
| +-----------------+ |
| | Εικονική Μνήμη |
| | (Στοίβα, Heap, ...) |
| +-----------------+ |
| | |
| V |
| +-----------------+ |
| | Φυσική Μνήμη |
| +-----------------+ |
+-------------------+
Άμεσα μετά το fork() (CoW):
+-----------------------+ +-----------------------+
| Μητρική διαδικασία | | Θυγατρική διαδικασία |
| +-------------------+ | | +-------------------+ |
| | Εικονική Μνήμη | | | | Εικονική Μνήμη | |
| | (Η ίδια δομή) | | | | (Η ίδια δομή) | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Φυσική Μνήμη | | | Φυσική Μνήμη | |
| | (Μερικές κοινές σελίδες)| | | (Μερικές κοινές σελίδες)| |
| +-----------------------+ | +-----------------------+
+-----------------------+ +-----------------------+
| |
+----------------------------+
Αρχικές κοινές σελίδες φυσικής μνήμης
Με την εγγραφή σε μια σελίδα (ενεργοποίηση CoW):
+-----------------------+ +-----------------------+
| Μητρική διαδικασία | | Θυγατρική διαδικασία |
| +-------------------+ | | +-------------------+ |
| | Εικονική Μνήμη | | | | Εικονική Μνήμη | |
| | | | | | | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Φυσική Μνήμη | | | Φυσική Μνήμη | |
| | (Απομονωμένες σελίδες) | | | (Απομονωμένες σελίδες) | |
| +-----------------------+ | +-----------------------+
Είναι σημαντικό να κατανοήσουμε ότι, παρά το ίδιο εικονικό χώρο διευθύνσεων αμέσως μετά το fork(), οποιαδήποτε αλλαγή στη μνήμη ενός διαδικασίας (εγγραφή σε μεταβλητές, κατανομή/απελευθέρωση μνήμης στο heap) δεν επηρεάζει τη μνήμη της άλλης διαδικασίας χάρη στον μηχανισμό CoW. Αυτές είναι πλήρως ανεξάρτητες διαδικασίες.