Ας βρούμε κάποιες διαφορές μεταξύ των πιρουνιών () και του vfork () με τη βοήθεια του πίνακα σύγκρισης που φαίνεται παρακάτω.
Συγκριτικό διάγραμμα
Βάση σύγκρισης | πιρούνι() | vfork () |
---|---|---|
Βασικός | Η διεργασία παιδιού και η γονική διαδικασία έχουν ξεχωριστούς χώρους διεύθυνσης. | Η διαδικασία παιδιού και η γονική διαδικασία μοιράζονται τον ίδιο χώρο διευθύνσεων. |
Εκτέλεση | Η διαδικασία γονέων και παιδιού εκτελείται ταυτόχρονα. | Η γονική διαδικασία παραμένει αναρτημένη έως ότου ολοκληρωθεί η εκτέλεση του παιδιού. |
Τροποποίηση | Εάν η διαδικασία παιδιού αλλάξει οποιαδήποτε σελίδα στο χώρο διεύθυνσης, είναι αόρατη στη γονική διεργασία καθώς ο χώρος διευθύνσεων είναι ξεχωριστός. | Εάν η διαδικασία παιδιού αλλάξει οποιαδήποτε σελίδα στο χώρο διευθύνσεων, είναι ορατή στη γονική διαδικασία καθώς μοιράζεται τον ίδιο χώρο διευθύνσεων. |
Αντιγραφή-εγγραφή | το fork () χρησιμοποιεί την αντιγραφή στο γράψιμο ως εναλλακτική λύση όπου ο γονέας και το παιδί μοιράζονται τις ίδιες σελίδες μέχρι να τροποποιήσει οποιαδήποτε από αυτές την κοινόχρηστη σελίδα. | Το vfork () δεν χρησιμοποιεί copy-on-write. |
Ορισμός του πιρουνιού ()
Το πηρούνι () είναι μια χρήση κλήσης συστήματος για τη δημιουργία μιας νέας διαδικασίας . Η νέα διαδικασία που δημιουργείται από την κλήση fork () είναι η διαδικασία του παιδιού, της διαδικασίας που επικαλείται την κλήση συστήματος fork (). Ο κώδικας της διαδικασίας παιδιού είναι πανομοιότυπος με τον κώδικα της γονικής διαδικασίας. Μετά τη δημιουργία της διαδικασίας του παιδιού, τόσο η διαδικασία επεξεργασίας, δηλαδή η γονική και η παιδική διαδικασία, αρχίζουν την εκτέλεση τους από την επόμενη δήλωση μετά από το διχάλα () και οι δύο διαδικασίες εκτελούνται ταυτόχρονα .
Η γονική διαδικασία και η διαδικασία παιδιού έχουν ξεχωριστό χώρο διεύθυνσης . Επομένως, όταν οποιαδήποτε από τις διαδικασίες τροποποιεί οποιαδήποτε δήλωση ή μεταβλητή στον κώδικα. Δεν θα αντικατοπτρίζεται σε άλλους κώδικες διεργασιών. Ας υποθέσουμε ότι αν η διαδικασία παιδιού τροποποιεί τον κώδικα, δεν θα επηρεάσει τη γονική διαδικασία.
Κάποια διαδικασία παιδιού μετά τη δημιουργία τους καλεί αμέσως exec () . Η κλήση συστήματος exec () αντικαθιστά τη διαδικασία με το πρόγραμμα που καθορίζεται στην παράμετρο της. Στη συνέχεια, ο χωριστός χώρος διευθύνσεων της διαδικασίας παιδιού δεν είναι χρήσιμος. Η μία εναλλακτική λύση είναι η αντιγραφή στο γράψιμο.
Το copy-on-write επιτρέπει στη γονική και την παιδική διαδικασία να μοιράζεται τον ίδιο χώρο διευθύνσεων. Αν οποιαδήποτε από τις διαδικασίες γράψει στις σελίδες του χώρου διευθύνσεων, το αντίγραφο του χώρου διευθύνσεων δημιουργείται για να επιτρέψει και στη διαδικασία να λειτουργεί ανεξάρτητα.
Ορισμός του vfork ()
Η τροποποιημένη έκδοση του πιρουνιού () είναι vfork (). Η κλήση συστήματος vfork () χρησιμοποιείται επίσης για τη δημιουργία μιας νέας διαδικασίας. Παρόμοια με το πηρούνι (), εδώ επίσης η νέα διαδικασία που δημιουργείται είναι η παιδική διαδικασία, της διαδικασίας που επικαλείται vfork (). Ο κώδικας διαδικασίας παιδιού είναι ταυτόσημος με τον γονικό κώδικα διεργασίας. Εδώ, η διαδικασία του παιδιού αναστέλλει την εκτέλεση της γονικής διαδικασίας μέχρι να ολοκληρώσει την εκτέλεσή της, καθώς η διαδικασία μοιράζεται τον ίδιο χώρο διευθύνσεων για χρήση.
Καθώς η διαδικασία παιδιού και γονέα μοιράζεται τον ίδιο χώρο διεύθυνσης . Αν οποιαδήποτε από τις διαδικασίες τροποποιήσει τον κώδικα, είναι ορατή στην άλλη διαδικασία που μοιράζεται τις ίδιες σελίδες. Ας υποθέσουμε αν η γονική διαδικασία μεταβάλλει τον κώδικα. θα αντικατοπτρίζεται στον κώδικα της παιδικής διαδικασίας.
Καθώς η χρήση του vfork () δεν δημιουργεί ξεχωριστούς χώρους διεύθυνσης για διαδικασίες παιδιού και γονέα. Επομένως, πρέπει να εφαρμοστεί όπου η διαδικασία του παιδιού καλεί exec () αμέσως μετά τη δημιουργία του. Έτσι, δεν θα υπάρξει σπατάλη χώρου διευθύνσεων, και είναι ο αποτελεσματικός τρόπος δημιουργίας μιας διαδικασίας. Το vfork δεν χρησιμοποιεί copy-on-write .
Βασικές διαφορές μεταξύ του πιρουνιού () και του vfork ()
- Η κύρια διαφορά μεταξύ του πιρουνιού και του vfork είναι ότι η διαδικασία παιδιού που δημιουργείται από το πιρούνι έχει ξεχωριστό χώρο μνήμης από τη γονική διαδικασία. Ωστόσο, η διαδικασία παιδιού που δημιουργείται από την κλήση συστήματος vfork μοιράζεται το ίδιο χώρο διευθύνσεων της γονικής διαδικασίας.
- Η διαδικασία παιδιού που δημιουργείται χρησιμοποιώντας το πιρούνι εκτελείται ταυτόχρονα με τη γονική διαδικασία. Από την άλλη πλευρά, η διαδικασία παιδιού που δημιουργήθηκε χρησιμοποιώντας το vfork αναστέλλει την εκτέλεση της γονικής διαδικασίας μέχρι να ολοκληρωθεί η εκτέλεση.
- Καθώς ο χώρος μνήμης της γονικής και της παιδικής διαδικασίας είναι ξεχωριστή τροποποίηση που γίνεται από οποιαδήποτε από τις διαδικασίες δεν επηρεάζει τις σελίδες άλλων. Ωστόσο, καθώς η γονική και η παιδική διαδικασία μοιράζονται την ίδια τροποποίηση της διεύθυνσης μνήμης που πραγματοποιείται από οποιαδήποτε διαδικασία αντανακλά στον χώρο διευθύνσεων.
- Η φόρμα κλήσης συστήματος () χρησιμοποιεί αντίγραφο σε εγγραφή ως εναλλακτική λύση, η οποία αφήνει τη διαδικασία παιδιού και γονέα να μοιράζονται τον ίδιο χώρο διευθύνσεων μέχρι να τροποποιήσει οποιαδήποτε από αυτές τις σελίδες. Από την άλλη πλευρά, το vfork δεν χρησιμοποιεί copy-on-write.
Συμπέρασμα:
Η κλήση συστήματος vfork () πρέπει να υλοποιηθεί όταν η διαδικασία κλήσης παιδιού exec () αμέσως μετά τη δημιουργία της χρησιμοποιεί το πιρούνι (). Ως χωριστός χώρος διευθύνσεων για παιδική και γονική διαδικασία δεν θα έχει καμία χρησιμότητα εδώ.