Paylaşılan Belleğin süreçler arasında iletişim kurmak için kullanıldığı eski bir sistemin taşınmasına katılmak (örneğin Pencere Servisi ASP.NET'i çağırmak) ve bu teknolojinin önemini anlamaya zorlanmak. NET geliştiricilerinin popüler olmayan teknolojisi, özel notlar.
[Paylaşılan Hafıza nedir?] 】 Süreçlerarası iletişim için bir terim vardır: Süreçlerarası İletişim (IPC) ve Windows platformunda aşağıdaki seçeneklere sahiptir: Referans:Bağlantı girişi görünür.
Pano Program A içeriği panoya yapıştırır, Program B ise içeriği panodan alır. COM OLE Bileşik Belge, Word dosyalarının Excel çalışma sayfalarına gömülmesine izin verir ve Excel'i iki tıklamayla düzenlemek için çağırabilir. Veri Kopyası Program A, üzerinde anlaşılan formatta Program B'ye WM_COPYDATA mesaj gönderir DDE DDE, farklı uygulamaların farklı formatlarda veri alışverişine olanak tanıyan bir iletişim protokolüdür; bu, panonun bir uzantısı olarak kabul edilebilir ve tek seferlik transferlerin yanı sıra sürekli aktarılabilir. (Görece düşük performans, artık tavsiye edilmiyor) Dosya Eşleme Dosya Eşleme, bir dosyanın bir süreçte bir bellek parçası olarak simüle edilmesini ifade eder; birden fazla uygulama, Adlandırılmış Paylaşılan Bellek olarak adlandırılan paylaşımlı dosya eşlemesi yoluyla veri alışverişinde bulunur; bu, çeşitli IPC yöntemleri arasında en iyi performanstır ancak Mutex gibi senkronizasyon mekanizmalarıyla önlenmesi gerekir. Posta Slotları Tek yönlü iletişimde, Mailslot Client mesajları Mailslot Sunucusu'na gönderir ve mesajlar sunucu tarafından okunduktan sonra silinir, bu da makineler arası iletimi destekler ve ayrıca bire birden fazla yayın yapılabilir. (Yayın mesajının uzunluğu 400 bayt ile sınırlıdır ve mesajın uzunluğu, bire bir iletim için kurulduğunda Mailslot Sunucusu tarafından belirlenir) Boru İki yönlü iletim, Anonim Boru ve İsimli Boru olarak ikiye ayrılır. Anonim Boru genellikle ana program ile alt program arasındaki standart giriş/çıkış yönü için kullanılır ve iki boru iki yönlü iletişim için oluşturulmalıdır; bu iletişim ağ üzerinden olamayacak ve bağımlı ilişkileri olan süreçlerle sınırlıdır. Named Pipe, herhangi bir süreç arasında veri alışverişi yapmak ve ağlar arası süreç transferini desteklemek için kullanılabilir. RPC Uzaktan Prosedür Çağrısı (RPC), uygulamaların diğer uygulamalar tarafından sağlanan fonksiyonları çağırmasına olanak tanır ve ağlar arasında çağrılanabilir. Windows RPC, ISO DCE standardına uygundur ve çapraz işletim sistemi entegrasyonunu destekler. Windows Soketleri TCP/IP veya diğer ağ protokollerine dayalı soyut iletişim arayüzü ve veri alışverişi alt katmandaki ağ bağlantıları üzerinden gerçekleştirilir. Paylaşılan Bellek, C/C++ geliştiricileri tarafından yaygın bir veri alışverişi yöntemidir (Google, Linux'ta Paylaşılan Bellek ile uygulanan IPC'ye birçok örnek bulabilir), bu nedenle C/C++ geliştiricileri genellikle Windows platformunda iletişim kanalı olarak bunu seçerler.
【Paylaşılan Hafıza Pratik Egzersizi】 Daha az kişi kullansa da, .NET yerleşik bir System.IO.MemoryMappedFiles isim alanına sahip, Paylaşılan Belleği oynamak zor değil, neredeyse işletim dosyalarıyla aynı, FileStream ile ilgili işlemlerde deneyiminiz varsa, hızlı başlayabilirsiniz, MSDN örneğine bakın, ben mini bir program egzersizi yazdım.Bağlantı girişi görünür.
İki program yazdım: ProcessA ile MemoryMappedFile.CreateNew() ile 1024 baytlık bir alan oluşturdum ve diğer ProcessB ile geçiş ve yakalama pratiği yaptım. 1024 bayt iki program tarafından paylaşıldığı için, ilk 512'yi ProcessB'ye yazan ProcessA, son 512'yi ise ProcessA okumasına yazan ProcessB olarak planlıyorum ve program, başlangıç adresi ve uzunluğunu kendi alanına yönlendirmek için CreateViewStream kullanıyor. ProcessA ve ProcessB MemoryMappedFile'e eriştiğinde okuma/yazma çatışmalarını önlemek için, Mutex lock kullanarak aynı anda yalnızca bir Sürecin MemoryMappedFile'e erişebilmesini kontrol ediyorum. Test süreci, ProcessA için bir MemoryMappedFile oluşturur, mesaj dizesini yazar – > ProcessB mesaj dizesini okuyor ve yanıt dizesini yazar – > ProcessA yanıt dizesini okuyor ve sona erer.
ProcessA prosedürü şöyledir:
ProcessB prosedürü şöyledir:
Test başarılı oldu!
【Ek İpuçları】
1. Windows'ta şu anda etkin olan MemoryMappedFile'i nasıl görebilirim?
SystemInternals, Windows için erişilebilen tüm dosyaları, klasörleri, kayıtları, nesneleri ve Windows servislerini listeleyen bir AccessChk aracına sahiptir. MemoryMappedFile bir Windows nesnesidir ve aşağıdaki komutu kullanarak tüm nesneleri listeleyebilir ve arşivleyebilirsiniz accesschk -osv > e:\objList.txt Orada MemoryMappedFile adını arayın ve varsa, aşağıdaki gibi bir kayıt görebilirsiniz: \Sessions\1\BaseNamedObjects\DARKTHREAD Tür: Bölüm Orta Zorunlu Seviye (Varsayılan) [Yazmama] RW NT AUTHORITY\SYSTEM SECTION_ALL_ACCESS RW DOMAIN\UserName SECTION_ALL_ACCESS RW DOMAIN\UserName-S-1-5-5-0-954410 SECTION_ALL_ACCESS
AccessChk aracı indir:Bağlantı girişi görünür.
2. MemoryMappedFile ön ayarı kullanıcının oturumunda etkinleştirilmiş durumdadır ve ön ayar oturumlar arasında kullanılamaz. Örneğin, farklı AppPool'lara ait iki ASP.NET farklı uygulama kimliklerine sahipse, MemoryMappedFile adı aynı olsa bile, her birinin bir kopyasıdır, bu yüzden her iki tarafın kullandığı yürütme kimliğinin aynı olduğunu doğrulamak gerekir.
3. Farklı yürütme kimlikleri arasında iletişim kurmak için MemoryMappedFile "Global\ Filename" olarak adlandırılabilir (Global durumu farklıdır, yanlışlıkla GLOBAL yol geçersiz olarak yazılmış gürültüye bastım), böylece yürütme kimlikleri arasında erişilebiliyor. Ancak, Oturum 0 (Windows Servisi) dışındaki süreçlerin Global\... oluşturmak için SeCreateGlobalPrivilege iznine sahip olması gerektiği belirtilmelidir. MemoryMappedFile。 (MSDN dosyası) Oturum 0 için, diğer taraftaki MVP'nin şu makalesine başvurabilirsiniz - Penetrating Session 0 İzolasyonu (1) (Bağlantı girişi görünür.Kitapta çok ayrıntılı bir giriş var.
Yeniden basılmıştır:Bağlantı girişi görünür.
|