Συμμετοχή στη μετεγκατάσταση ενός παλιού συστήματος, όπου η κοινόχρηστη μνήμη χρησιμοποιείται για την επικοινωνία μεταξύ των διεργασιών (π.χ. κλήση της υπηρεσίας παραθύρων ASP.NET) και αναγκάζεται να κατανοήσει τη σημασία αυτής της τεχνολογίας. Μη δημοφιλής τεχνολογία προγραμματιστών NET, ειδικές σημειώσεις.
[Τι είναι η κοινόχρηστη μνήμη;] 】 Υπάρχει ένας όρος για την επικοινωνία μεταξύ διεργασιών, Interprocess Communictaion (IPC), ο οποίος έχει τις ακόλουθες επιλογές στην πλατφόρμα των Windows: Αναφορά:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Πρόχειρο Το πρόγραμμα Α επικολλά το περιεχόμενο στο πρόχειρο και το πρόγραμμα Β ανακτά το περιεχόμενο από το πρόχειρο. COM Το OLE Compound Document επιτρέπει την ενσωμάτωση αρχείων Word σε φύλλα εργασίας του Excel και το Excel μπορεί να κληθεί για επεξεργασία με δύο κλικ. Αντιγραφή δεδομένων Το Πρόγραμμα Α στέλνει WM_COPYDATA μηνύματα στο Πρόγραμμα Β με τη συμφωνημένη μορφή ΔΔΕ Το DDE είναι ένα πρωτόκολλο επικοινωνίας που επιτρέπει σε διαφορετικές εφαρμογές να ανταλλάσσουν δεδομένα σε διαφορετικές μορφές, οι οποίες μπορούν να θεωρηθούν ως επέκταση του προχείρου και μπορούν να μεταφερθούν συνεχώς εκτός από τις εφάπαξ μεταφορές. (Σχετικά κακή απόδοση, δεν συνιστάται πλέον) Αντιστοίχιση αρχείων Το File Mapping αναφέρεται στην προσομοίωση ενός αρχείου ως κομμάτι μνήμης σε μια διαδικασία, όταν πολλές εφαρμογές ανταλλάσσουν δεδομένα μέσω κοινόχρηστης αντιστοίχισης αρχείων, που ονομάζεται Named Shared Memory, η οποία είναι η καλύτερη απόδοση μεταξύ των διαφόρων μεθόδων IPC, αλλά πρέπει να αποτρέπεται από μηχανισμούς συγχρονισμού όπως το Mutex. Κουλοχέρηδες αλληλογραφίας Μονόδρομη επικοινωνία, το Mailslot Client στέλνει μηνύματα στον διακομιστή Mailslot και τα μηνύματα διαγράφονται αφού διαβαστούν από τον διακομιστή, υποστηρίζοντας τη μετάδοση μεταξύ μηχανών και μπορούν επίσης να μεταδοθούν ένα προς πολλά. (Η διάρκεια του μηνύματος μετάδοσης περιορίζεται στα 400 byte και η διάρκεια του μηνύματος καθορίζεται από τον διακομιστή Mailslot όταν έχει καθοριστεί για μετάδοση ένας προς έναν) Σωλήνες Η αμφίδρομη μετάδοση χωρίζεται σε Anonymous Pipe και Named Pipe. Το Anonymous Pipe χρησιμοποιείται γενικά για τον τυπικό προσανατολισμό εισόδου/εξόδου μεταξύ του γονικού προγράμματος και του θυγατρικού προγράμματος και θα πρέπει να κατασκευαστούν δύο σωλήνες για αμφίδρομη επικοινωνία, η οποία δεν μπορεί να είναι σε όλο το δίκτυο και περιορίζεται σε διαδικασίες με εξαρτημένες σχέσεις. Το Named Pipe μπορεί να χρησιμοποιηθεί για την ανταλλαγή δεδομένων μεταξύ οποιασδήποτε διαδικασίας και την υποστήριξη μεταφοράς διεργασιών μεταξύ δικτύων. ΡΠΚ Η κλήση απομακρυσμένης διαδικασίας (RPC) επιτρέπει στις εφαρμογές να καλούν λειτουργίες που παρέχονται από άλλες εφαρμογές και μπορούν να κληθούν σε δίκτυα. Το Windows RPC συμμορφώνεται με το πρότυπο ISO DCE και υποστηρίζει ενοποίηση μεταξύ λειτουργικών συστημάτων. Υποδοχές Windows Αφηρημένη διεπαφή επικοινωνίας που βασίζεται σε TCP/IP ή άλλα πρωτόκολλα δικτύου και η ανταλλαγή δεδομένων πραγματοποιείται μέσω συνδέσεων δικτύου στο κάτω επίπεδο. Η κοινόχρηστη μνήμη είναι μια κοινή μέθοδος ανταλλαγής δεδομένων που χρησιμοποιείται από προγραμματιστές C/C++ (η Google μπορεί να βρει πολλά παραδείγματα IPC που υλοποιούνται με την Κοινόχρηστη μνήμη στο Linux), επομένως οι προγραμματιστές C/C++ την επιλέγουν συχνά ως κανάλι επικοινωνίας στην πλατφόρμα των Windows.
【Πρακτική άσκηση κοινής μνήμης】 Αν και υπάρχουν λιγότερα άτομα που το χρησιμοποιούν, το .NET έχει ενσωματωμένο χώρο ονομάτων System.IO.MemoryMappedFiles, δεν είναι δύσκολο να παίξετε το Shared Memory, σχεδόν το ίδιο με τα λειτουργικά αρχεία, εφόσον έχετε εμπειρία σε λειτουργίες που σχετίζονται με το FileStream, μπορείτε να ξεκινήσετε γρήγορα, ανατρέξτε στο παράδειγμα MSDN, έγραψα μια άσκηση μίνι προγράμματος.Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Έγραψα δύο προγράμματα, το ProcessA για να δημιουργήσω ένα χώρο 1024 byte με το MemoryMappedFile.CreateNew() και να εξασκηθώ στο πέρασμα και το πιάσιμο με το άλλο ProcessB. Δεδομένου ότι τα 1024 byte μοιράζονται δύο προγράμματα, σχεδιάζω το πρώτο 512 να είναι ProcessA γραμμένο στο ProcessB και το τελευταίο 512 να είναι ProcessB γραμμένο στο ProcessA read και το πρόγραμμα χρησιμοποιεί το CreateViewStream για να περάσει τη διεύθυνση έναρξης και το μήκος για να δείξει στη δική του περιοχή. Για να αποφύγω διενέξεις ανάγνωσης/εγγραφής όταν το ProcessA και το ProcessB έχουν πρόσβαση στο MemoryMappedFile, χρησιμοποιώ το κλείδωμα Mutex για να ελέγξω ότι μόνο μία διεργασία μπορεί να έχει πρόσβαση στο MemoryMappedFile κάθε φορά. Η διαδικασία δοκιμής δημιουργεί ένα MemoryMappedFile για το ProcessA, γράφει τη συμβολοσειρά μηνύματος – > ProcessB διαβάζει τη συμβολοσειρά μηνύματος και γράφει τη συμβολοσειρά απόκρισης – > ProcessA διαβάζει τη συμβολοσειρά απόκρισης και τελειώνει.
Η διαδικασία ProcessA έχει ως εξής:
Η διαδικασία ProcessB έχει ως εξής:
Η δοκιμή ήταν επιτυχής!
【Συμπληρωματικές συμβουλές】
1. Πώς μπορώ να δω το MemoryMappedFile που είναι ενεργοποιημένο αυτήν τη στιγμή στα Windows;
Το SystemInternals διαθέτει ένα εργαλείο AccessChk που παραθέτει όλα τα αρχεία, τους φακέλους, τα μητρώα, τα αντικείμενα και τις υπηρεσίες των Windows που είναι προσβάσιμα στα Windows. Το MemoryMappedFile είναι ένα αντικείμενο των Windows και μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή για να παραθέσετε όλα τα αντικείμενα και να τα αρχειοθετήσετε accesschk -osv > e:\objList.txt Αναζητήστε το όνομα του MemoryMappedFile σε αυτό και, εάν υπάρχει, μπορείτε να δείτε μια εγγραφή παρόμοια με την ακόλουθη: \Συνεδρίες\1\BaseNamedObjects\DARKTHREAD Τύπος: Τμήμα Μεσαίο υποχρεωτικό επίπεδο (προεπιλογή) [χωρίς εγγραφή] RW NT ΑΡΧΉ\ΣΎΣΤΗΜΑ SECTION_ALL_ACCESS RW DOMAIN\UserName SECTION_ALL_ACCESS RW DOMAIN\Όνομαχρήστη-S-1-5-5-0-954410 SECTION_ALL_ACCESS
Λήψη εργαλείου AccessChk:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
2. Η προκαθορισμένη ρύθμιση MemoryMappedFile είναι ενεργοποιημένη στην περίοδο λειτουργίας του χρήστη και δεν μπορεί να χρησιμοποιηθεί σε όλες τις συνεδρίες. Για παράδειγμα, εάν δύο ASP.NET που ανήκουν σε διαφορετικά AppPool έχουν διαφορετικές ταυτότητες εκτέλεσης, ακόμα κι αν το όνομα MemoryMappedFile είναι το ίδιο, εξακολουθεί να είναι ένα αντίγραφο του καθενός, επομένως είναι απαραίτητο να επιβεβαιώσετε ότι η ταυτότητα εκτέλεσης που χρησιμοποιείται και από τα δύο μέρη είναι η ίδια.
3. Για την επικοινωνία μεταξύ διαφορετικών ταυτοτήτων εκτέλεσης, το MemoryMappedFile μπορεί να ονομαστεί "Global\ Filename" (σημειώστε ότι η περίπτωση του Global είναι διαφορετική, πάτησα τη βροντή που γράφτηκε κατά λάθος καθώς η διαδρομή GLOBAL δεν είναι έγκυρη), έτσι ώστε να είναι δυνατή η πρόσβαση σε όλες τις ταυτότητες εκτέλεσης. Ωστόσο, θα πρέπει να σημειωθεί ότι οι διεργασίες εκτός της περιόδου λειτουργίας 0 (υπηρεσία Windows) πρέπει να έχουν το δικαίωμα SeCreateGlobalPrivilege για τη δημιουργία ενός καθολικού\... MemoryMappedFile。 (Αρχείο MSDN) Για τη συνεδρία 0, μπορείτε να ανατρέξετε σε αυτό το άρθρο του MVP από την άλλη πλευρά - Διεισδυτική συνεδρία 0 Απομόνωση (1) (Η σύνδεση με υπερσύνδεσμο είναι ορατή.Υπάρχει μια πολύ λεπτομερής εισαγωγή σε αυτό.
Ανατύπωση από:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
|