Sobes.tech
Middle

Τι συμβαίνει με τη μνήμη της διαδικασίας όταν δημιουργούμε ένα αντίγραφό της χρησιμοποιώντας την κλήση συστήματος fork στο λειτουργικό σύστημα Linux;

sobes.tech AI

Απάντηση από AI

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

Όσον αφορά τη μνήμη, συμβαίνουν τα εξής:

  1. Εικονικός χώρος διευθύνσεων: Η θυγατρική διαδικασία λαμβάνει τον δικό της εικονικό χώρο διευθύνσεων, ο οποίος είναι πανομοιότυπος με αυτόν της μητρικής κατά τη στιγμή της κλήσης fork(). Αυτό σημαίνει ότι η θυγατρική "βλέπει" τα ίδια εύρη διευθύνσεων και έχει την ίδια δομή τμημάτων (κώδικα, δεδομένα, στοίβα, σωρός) με τη μητρική.

  2. Φυσική μνήμη και Copy-on-Write (CoW): Αρχικά, οι διαδικασίες μητρική και θυγατρική μοιράζονται τις ίδιες σελίδες φυσικής μνήμης. Αυτή είναι μια βελτιστοποίηση γνωστή ως "Copy-on-Write" (CoW). Η φυσική μνήμη αντιγράφεται μόνο όταν μία από τις διαδικασίες προσπαθεί να αλλάξει το περιεχόμενο της σελίδας.

    • Αν η μητρική ή η θυγατρική γράψει δεδομένα σε μια σελίδα που ήταν κοινή, ο πυρήνας δημιουργεί ένα νέο αντίγραφο αυτής της σελίδας φυσικής μνήμης για τη διαδικασία που γράφει. Η άλλη διαδικασία συνεχίζει να χρησιμοποιεί την παλιά έκδοση της σελίδας.
    • Αν οι διαδικασίες διαβάζουν μόνο δεδομένα, συνεχίζουν να χρησιμοποιούν την κοινή σελίδα φυσικής μνήμης.
  3. Διαχειριστές αρχείων: Οι ανοιχτοί διαχειριστές αρχείων κληρονομούνται από τη θυγατρική διαδικασία. Και οι δύο διαδικασίες μοιράζονται δείκτες σε μετατόπιση αρχείου.

  4. Άλλοι πόροι: Άλλοι πόροι, όπως χειριστές σημάτων, τρέχον κατάλογος εργασίας κ.λπ., επίσης αντιγράφονται ή κληρονομούνται.

Ακολουθεί μια απλοποιημένη εικόνα:

Πριν το fork():

+-------------------+
| Μητρική διαδικασία |
| +-----------------+ |
| | Εικονική Μνήμη |
| | (Στοίβα, Heap, ...) |
| +-----------------+ |
|      |              |
|      V              |
| +-----------------+ |
| | Φυσική Μνήμη |
| +-----------------+ |
+-------------------+

Άμεσα μετά το fork() (CoW):

+-----------------------+   +-----------------------+
| Μητρική διαδικασία    |   |  Θυγατρική διαδικασία |
| +-------------------+ |   | +-------------------+ |
| | Εικονική Μνήμη    | |   | | Εικονική Μνήμη    | |
| | (Η ίδια δομή)      | |   | | (Η ίδια δομή)      | |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Φυσική Μνήμη        | | | Φυσική Μνήμη        | |
| | (Μερικές κοινές σελίδες)| | | (Μερικές κοινές σελίδες)| |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+
          |                            |
          +----------------------------+
                Αρχικές κοινές σελίδες φυσικής μνήμης

Με την εγγραφή σε μια σελίδα (ενεργοποίηση CoW):

+-----------------------+   +-----------------------+
| Μητρική διαδικασία    |   |  Θυγατρική διαδικασία |
| +-------------------+ |   | +-------------------+ |
| | Εικονική Μνήμη    | |   | | Εικονική Μνήμη    | |
| |                   | |   | |                   | |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Φυσική Μνήμη        | | | Φυσική Μνήμη        | |
| | (Απομονωμένες σελίδες) | | | (Απομονωμένες σελίδες) | |
| +-----------------------+   | +-----------------------+

Είναι σημαντικό να κατανοήσουμε ότι, παρά το ίδιο εικονικό χώρο διευθύνσεων αμέσως μετά το fork(), οποιαδήποτε αλλαγή στη μνήμη ενός διαδικασίας (εγγραφή σε μεταβλητές, κατανομή/απελευθέρωση μνήμης στο heap) δεν επηρεάζει τη μνήμη της άλλης διαδικασίας χάρη στον μηχανισμό CoW. Αυτές είναι πλήρως ανεξάρτητες διαδικασίες.