windows - Hvad forårsager sidefejl?

Indlæg af Hanne Mølgaard Plasc

Problem



Ifølge Wikipedia: [1]



  En sidefejl er en fælde til softwaren, der er hævet af hardwaren, når et program får adgang til en side, der er kortlagt i det virtuelle adresserum, men ikke indlæst i den fysiske hukommelse . (vægt min)



Okay det giver mening.


Men hvis det er tilfældet, hvorfor er det, at når procesoplysningerne i Process Hacker opdateres, ser jeg ca. 15 siders fejl?


Screenshot


Eller med andre ord, hvorfor bliver en hukommelse slået ud? (Jeg har ingen anelse om, at det er brugerens eller kernehukommelsen.) Jeg har ingen sidefil, og RAM-forbruget er omkring 1,2 GB ud af 4 GB, som er efter en ren genstart. Der ' s mangel på nogen ressource; hvorfor skulle noget blive slået ud?

Bedste reference


(Jeg er forfatter til Process Hacker.)


For det første:



  En sidefejl er en fælde til softwaren
  hævet af hardwaren når et program
  Adgang til en side, der er kortlagt i
  virtuelt adresserum, men ikke indlæst
  i fysisk hukommelse.



Det er ikke helt korrekt, som forklaret senere i den samme artikel ( Mindre sidefejl ). Der er bløde sidefejl, hvor hele kernen skal gøre, er at tilføje en side til arbejdssættet i proces. Her er en tabel fra Windows Internals-bogen (jeg har udelukket dem, der resulterer i en adgangsfejl):



  • Årsag til fejl - Resultat

  • Adgang til en side, der ikke er beboet i hukommelsen, men som er på disk i en sidefil eller en kortfil - Alloker en fysisk side og læs den ønskede side fra disken og til det relevante arbejdssæt

  • Adgang til en side, der er på standby eller ændret liste - Overfør siden til den relevante proces, session eller systemværktøj

  • Adgang til en forespørgselsfri side - Tilføj en nulfyldt side til det relevante arbejdssæt

  • Skriv til en kopi-på-skriv-side - Lav proces-privat (eller sessions-privat) kopi af side, og erstat original i proces eller systemværktøjssæt



Sidefejl kan forekomme af forskellige årsager, som du kan se ovenfor. Kun en af ​​dem har at gøre med at læse fra disken. Hvis du forsøger at allokere en blok fra bunken, og heap manager tildeler nye sider, så får du adgang til de pågældende sider, så får du en forespørgsels-nul sidefejl. Hvis du forsøger at hente en funktion i kernel32 ved at skrive til kernel32s sider , får du en kopi-på-skrivefejl, fordi disse sider er lydløst kopieret, så dine ændringer ikke påvirker andre processer.


Nu for at besvare dit spørgsmål mere specifikt: Process Hacker synes kun at have sidefejl, når du opdaterer dens serviceoplysninger - det vil sige når det kalder EnumServicesStatusEx, hvilke RPC'er til SCM (services.exe). Mit gæt er, at der i processen er meget hukommelse tildelt, hvilket fører til manglende sidefejl (serviceoplysningerne kræver flere sider at lagre, IIRC). [2]

Andre referencer 1


En langsom men stabil kilde til sidefejl er OS-sonderen for sjældent tilgængelige sider. I dette tilfælde markerer operativsystemet nogle sider, der ikke er til stede, men lader dem ligge i hukommelsen. Hvis en applikation får adgang til siden, forekommer #PF-fælden, og operativsystemet markerer blot siden til stede igen uden yderligere ado. Hvis en 'lang tid' passerer og en side aldrig rejser en fejl, så ved OS'et, at siden er en god kandidat til bytte, hvis behovet skulle opstå. Denne mekanisme kan køre proaktivt, selv i tider uden ressourcetryk.

Andre referencer 2


'side, der er kortlagt i det virtuelle adresserum, men ikke indlæst i den fysiske hukommelse' betyder ikke, at det tidligere var i fysisk hukommelse. Antag at du kortlægger en fil? Det er stadig på disk, ikke i hukommelsen endnu.


Antag at du kortlægger en logfil og fortsætter med at tilføje det. Hver gang du overskrider slutningen af ​​den indgitte hukommelse, opstår der en sidefel, vil OS'et give dig en ny tom side og justere fillængden.





Det kan også være adgangsforbrydelser, der fanges og håndteres af programmet.





Det kan også være, at programmet bruger flere hukommelsessegmenter end passer i TLB (som er en cache for sidetabellerne). Når siderne er sammenhængende, kan de alle håndteres af en enkelt sidetabellindtastning. Men hvis hukommelsen er fragmenteret i det fysiske adresserum, er der brug for mange sidebordopførsler, og de passer muligvis ikke i TLB. Når en TLB-fejl opstår, kaldes OS-sidefejlhåndteringen og ser op på kortlægningen i procesens sidetabell.


På nogle måder er dette en variant af dekanens svar: siderne er allerede i fysisk RAM, og operativsystemet skal indlæse disse mappings i TLB, men ikke på grund af IPC.



Brian påpegede, at x86 (og derfor alle Win32-systemer) håndterer dette uden en sidefel.





Endnu en anden årsag til sidefejl udløser vagt sider, der anvendes til stakvækst og kopi-på-skriv, men normalt ville de ikke forekomme uden bundet. Jeg er ikke 100\% sikker på, om de ville vise sig som adgangsbrud eller ej, fordi de vil blive markeret som en adgangsfejl ved adgang til MMU-fælden, men håndteres sandsynligvis af OS-sidefejlhåndtereren og ikke omdannes til brugeren modus (SEH) adgangsbrud.

Andre referencer 3


Hver gang en mmap 'd-sektion læses, genereres en sidefel, som omfatter, når du lægger en DLL. Så læser en DLL faktisk ikke hele DLL'en i hukommelsen, det forårsager kun, at den bliver afbrudt som koden udføres.

Andre referencer 4


Du kan se bløde sidefejl , når hukommelsen deles mellem processer. Hvis du har en hukommelseskortet fil delt mellem to processer, når den anden proces indlæser den hukommelsesmappede fil, blød side fejl genereres - hukommelsen er allerede i fysisk RAM, men operativsystemet skal rette op på hukommelseslederens tabeller, så den virtuelle hukommelsesadresse i din proces peger på den rigtige fysiske side.


Især for noget som Process Hacker, som sandsynligvis injicerer kode i hver løbende proces (for at indsamle oplysninger), vil det sandsynligvis gøre ganske stor brug af delt hukommelse til at gøre IPC.

Andre referencer 5


Operativsystemer bruger personsøgning til at gruppere elementer, heks skal placeres i fysisk hukommelse og flytte dem mellem fysisk hukommelse og delt hukommelse. det meste af tiden er dataposter hekseplads på en enkelt side relateret til hinanden.
Når dataelementer på en side ikke bruges i lang tid, bevæger operativsystemet det til virtuel hukommelse for at frigøre noget plads i den fysiske hukommelse. og så når en side er påkrævet, heks er i virtuel hukommelse, flytter operativsystemet det fra virtuel hukommelse (harddisk) til fysisk hukommelse. dette er sidefejl!


og husk, at forskellige operativsystemer er forskellige i personsøgningsalgoritmer.


Grundlæggende om sidefejl [4]

Andre referencer 6


Ressourceallokering er en delikat balance mellem at holde primærlager til rådighed og at forhindre, at man skal gå til sekundær så meget som muligt. Hvis en proces forsøger at allokere hukommelse og kan 'det er normalt en undtagelse og nogle gange en fatal undtagelse.


I det væsentlige kan du ikke holde alt i RAM uden gratis tilgængelige ressourcer, fordi når et program starter eller beder om mere, vil det gå ned.