Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 2494|Yanıt: 1

[İpucu] Paylaşılan Hafıza hakkında iki ya da üç şey

[Bağlantıyı kopyala]
Yayınlandı 23.07.2024 14:50:48 | | | |
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.





Önceki:Angular 18 görüntü statik kaynak yükleme sorunu
Önümüzdeki:Bootstrap 5 dosya içerik yapısına hızlı bir bakış atın
 Ev sahibi| Yayınlandı 10.08.2024 21:36:57 |
.NET/C#, Mutex ve MemoryMappedFile tabanlı programı uygular
https://www.itsvse.com/thread-10808-1-1.html
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com