c - windows - almindelig delt hukommelse mellem 2 processer (ingen fil kortlægning, ingen rør, ingen ekstra ekstra)

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan har man en isoleret del af hukommelsen, der slet ikke understøttes til nogen fil eller ekstra styringslag som rørledninger, og som kan deles mellem to dedikerede processer på samme Windows-maskine?


Størstedelen af ​​artikler peger mig i retning af CreateFileMapping. Lad os starte derfra:


Hvordan virker CreateFileMapping med hFile=INVALID\_HANDLE\_VALUE faktisk?
Ifølge


https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx[3]


det
'... skaber et filmappeobjekt af en bestemt størrelse, der understøttes af systemets personsøgningsfil i stedet for af en fil i filsystemet ...'


Antag, at jeg skriver noget i hukommelsen, som er kortlagt af CreateFileMapping med hFile=INVALID\_HANDLE\_VALUE. Under hvilke forhold vil dette indhold blive skrevet til sidefilen på disken?


Også min forståelse af, hvad der motiverer brugen af ​​delt hukommelse, er at holde ydeevnen op og optimeret. Hvorfor er artiklen 'Oprettelse af navngivet delt hukommelse'
(https://msdn.microsoft.com/de-de/library/windows/desktop/aa366551(v=vs.85).aspx) henviser til
CreateFileMapping, hvis der ikke er en enkelt attributkombination, ville det forhindre at skrive til filer, f.eks. siden filen? [4]


Gå tilbage til det oprindelige spørgsmål: Jeg er bange for, at CreateFileMapping ikke er godt nok ... Så hvad ville det virke?

Bedste reference


Du misforstår hvad det betyder for hukommelsen at blive 'backet' af systemets personsøgningsfil. (Du må ikke føle dig dårlig, Raymond Chen har beskrevet teksten du citerede fra MSDN som 'en af ​​de mest misforståede sætninger i Win32-dokumentationen.') Næsten hele computerens hukommelse er 'backet' af noget på disken; kun 'ikke-paged pool', der udelukkende anvendes af kernen og så lidt som muligt, er ikke. Hvis en side ikke understøttes af en almindelig navngivet fil, understøttes den af ​​systemets personsøgerfil. systemet vil ikke skrive sider ud til systemets personsøgningsfil, medmindre det er nødvendigt, men det kan, hvis det behøver. [5]


Denne arkitektur er beregnet til at sikre, at processer kan helt 'paged out' af RAM, når de ikke har noget at gøre. Dette var meget vigtigere end det er i dag, men det er stadig værdifuldt; et typisk Windows-skrivebord vil have snesevis af processer 'inaktiv' venter på begivenheder (fx at skulle spole et udskriftsjob), som måske aldrig sker . Disse processer kan slås ud, og hukommelsen kan lægges til mere konstruktiv brug.


CreateFileMapping med hfile=INVALID\_HANDLE\_VALUE er faktisk det, du vil have. Så længe de processer, der deler hukommelsen, aktivt gør ting med det, forbliver det residente i RAM, og der vil ikke være noget ydeevne problem. Hvis de går i tomgang, ja, det kan blive slået ud, men det er fint fordi de ikke gør noget med det.


Du kan rette systemet til ikke at udklare en del af hukommelsen; det er det, som VirtualLock er til. Men det er beregnet til at blive brugt til små biter af hukommelse, der indeholder hemmelige informationer, hvor det kan tænkes at lække hemmeligheden, hvor man skriver det til sidefilen. MSDN-siden advarer dig om, at 'Hver version af Windows har en grænse for det maksimale antal sider, en proces kan låse. Denne grænse er bevidst lille for at undgå alvorlig ydelsesforringelse.' [6]