Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 2494|Atsakyti: 1

[Patarimai] Du ar trys dalykai apie bendrą atmintį

[Kopijuoti nuorodą]
Paskelbta 2024-07-23 14:50:48 | | | |
Dalyvauja perkeliant seną sistemą, kur bendra atmintis naudojama bendrauti tarp procesų (pvz., skambinant "Window Service" ASP.NET), ir yra priverstas suprasti šios technologijos svarbą. NET kūrėjų nepopuliari technologija, specialios pastabos.

[Kas yra bendra atmintis?] 】
Yra terminas, apibūdinantis tarpprocesinį bendravimą (IPC), kuris "Windows" platformoje turi šias parinktis: Nuoroda:Hipersaito prisijungimas matomas.

Mainų sritį
Programa A įklijuoja turinį į mainų sritį, o programa B nuskaito turinį iš mainų srities.
COM
OLE sudėtinis dokumentas leidžia "Word" failus įterpti į "Excel" darbalapius, o "Excel" galima iškviesti redaguoti dviem paspaudimais.
Duomenų kopijavimas
Programa A siunčia WM_COPYDATA pranešimus programai B sutartu formatu
DDE
DDE yra ryšio protokolas, leidžiantis skirtingoms programoms keistis duomenimis skirtingais formatais, kurie gali būti laikomi mainų srities plėtiniu ir gali būti nuolat perduodami be vienkartinių perdavimų. (Santykinai prastas našumas, neberekomenduojama)
Failų susiejimas
Failų atvaizdavimas reiškia failo kaip atminties dalies modeliavimą procese, kai kelios programos keičiasi duomenimis per bendrą failų susiejimą, vadinamą pavadinta bendra atmintimi, kuri yra geriausias našumas tarp įvairių IPC metodų, tačiau turi būti užkirstas kelias sinchronizavimo mechanizmams, tokiems kaip Mutex.
Pašto lizdai
Vienpusis ryšys, "Mailslot Client" siunčia pranešimus į "Mailslot Server", o pranešimai ištrinami po to, kai juos perskaito serveris, palaiko perdavimą tarp įrenginių, taip pat gali būti transliuojami vienas su daugeliu. (Transliacijos pranešimo ilgis ribojamas iki 400 baitų, o pranešimo ilgį nustato "Mailslot" serveris, kai jis nustatomas perdavimui vienas su vienu)
Vamzdžiai
Dvikryptis perdavimas yra padalintas į anoniminį vamzdį ir pavadintą vamzdį. Anoniminis vamzdis paprastai naudojamas standartinei įvesties / išvesties orientacijai tarp pirminės programos ir antrinės programos, ir du vamzdžiai turėtų būti sukurti dvipusiam ryšiui, kuris negali būti visame tinkle ir apsiriboja procesais su priklausomais ryšiais. Pavadintas vamzdis gali būti naudojamas keistis duomenimis tarp bet kurio proceso ir palaikyti procesų perdavimą tarp tinklų.
RPC
Nuotolinis procedūrų iškvietimas (RPC) leidžia programoms iškviesti kitų programų teikiamas funkcijas ir gali būti iškviečiamos įvairiuose tinkluose. "Windows RPC" atitinka ISO DCE standartą ir palaiko kelių operacinių sistemų integraciją.
Langų lizdai
Abstrakti ryšio sąsaja, pagrįsta TCP/IP ar kitais tinklo protokolais, o duomenų mainai vykdomi per tinklo jungtis apatiniame sluoksnyje.
Bendra atmintis yra įprastas duomenų mainų būdas, kurį naudoja C/C++ kūrėjai ("Google" gali rasti daug IPC, įdiegto naudojant "Shared Memory" sistemoje "Linux"), pavyzdžių, todėl C/C++ kūrėjai dažnai pasirenka ją kaip ryšio kanalą "Windows" platformoje.

【Bendros atminties praktinė užduotis】
Nors juo naudojasi mažiau žmonių, .NET turi įmontuotą System.IO.MemoryMappedFiles vardų sritį, nėra sunku žaisti bendrą atmintį, beveik tą patį, kaip ir operacinius failus, jei turite su "FileStream" susijusių operacijų patirties, galite greitai pradėti, žiūrėkite MSDN pavyzdį, parašiau mini programos pratimą.Hipersaito prisijungimas matomas.

Aš parašiau dvi programas, ProcessA sukurti 1024 baitų erdvę su MemoryMappedFile.CreateNew() ir praktikos perdavimo ir gaudymo su kitu ProcessB. Kadangi 1024 baitus dalijasi dvi programos, aš planuoju pirmuosius 512 būti ProcessA parašyta į ProcessB ir paskutinius 512 būti ProcessB parašyta į ProcessA skaityti, ir programa naudoja CreateViewStream perduoti pradžios adresą ir ilgį nukreipti į savo sritį. Siekiant išvengti skaitymo / rašymo konfliktų, kai ProcessA ir ProcessB prieiga prie MemoryMappedFile, aš naudoju Mutex užraktą, kad kontroliuočiau, kad tik vienas procesas gali pasiekti MemoryMappedFile vienu metu. Bandymo procesas sukuria MemoryMappedFile ProcessA, parašo pranešimo eilutę – > ProcessB nuskaito pranešimo eilutę ir rašo atsakymo eilutę – > ProcessA nuskaito atsakymo eilutę ir baigiasi.

ProcessA procedūra yra tokia:

Proceso B procedūra yra tokia:

Testas buvo sėkmingas!



【Papildomi patarimai】

1. Kaip peržiūrėti "MemoryMappedFile", kuris šiuo metu įjungtas sistemoje "Windows"?

"SystemInternals" turi "AccessChk" įrankį, kuriame pateikiami visi failai, aplankai, registrai, objektai ir "Windows" paslaugos, pasiekiamos "Windows". MemoryMappedFile yra "Windows" objektas, todėl galite naudoti šią komandą, kad išvardintumėte visus objektus ir juos archyvuotumėte
accesschk -osv > e:\objList.txt
Jame ieškokite "MemoryMappedFile" pavadinimo ir, jei jis yra, galite pamatyti įrašą, panašų į šį:
\Seansai\1\BaseNamedObjects\DARKTHREAD
  Tipas: Sekcija
  Vidutinis privalomas lygis (numatytasis) [be įrašymo]
  RW NT INSTITUCIJA\SISTEMA
    SECTION_ALL_ACCESS
  RW DOMENAS\Vartotojo vardas
    SECTION_ALL_ACCESS
  RW DOMENAS\Vartotojo vardas-S-1-5-5-0-954410
    SECTION_ALL_ACCESS

AccessChk įrankio atsisiuntimas:Hipersaito prisijungimas matomas.

2. Išankstinis "MemoryMappedFile" nustatymas įjungtas vartotojo seanse ir jo negalima naudoti visuose seansuose. Pavyzdžiui, jei du ASP.NET, priklausantys skirtingiems "AppPools", turi skirtingas vykdymo tapatybes, net jei "MemoryMappedFile" pavadinimas yra tas pats, tai vis tiek yra viena kiekvieno kopija, todėl būtina patvirtinti, kad abiejų šalių naudojama vykdymo tapatybė yra vienoda.

3. Norint bendrauti tarp skirtingų vykdymo tapatybių, MemoryMappedFile gali būti pavadintas "Global\ Filename" (atkreipkite dėmesį, kad "Global" atvejis yra kitoks, aš užlipau ant griaustinio, kuris buvo klaidingai parašytas, nes GLOBAL kelias yra netinkamas), kad jį būtų galima pasiekti visose vykdymo tapatybėse.
Tačiau reikia pažymėti, kad kiti procesai, išskyrus 0 seansą ("Windows" paslauga), turi turėti SeCreateGlobalPrivilege leidimą, kad būtų galima sukurti visuotinį\... MemoryMappedFile。 (MSDN failas)
Dėl sesijos 0, galite remtis šiuo straipsniu MVP iš kitos pusės - Skverbtis sesija 0 izoliacija (1) (Hipersaito prisijungimas matomas.Jame yra labai išsamus įvadas.

Perspausdinta iš:Hipersaito prisijungimas matomas.





Ankstesnis:"Angular 18" vaizdo statinių išteklių įkėlimo problema
Kitą:Greitai apžvelkite "Bootstrap 5" failų turinio struktūrą
 Savininkas| Paskelbta 2024-08-10 21:36:57 |
.NET/C# įgyvendina programą singleton, pagrįstą Mutex ir MemoryMappedFile
https://www.itsvse.com/thread-10808-1-1.html
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com