linux - Sådan serviceres sidefejl for delte filer/regioner

Indlæg af Hanne Mølgaard Plasc

Problem




  • 2 processer P1, P2, i et efterspørgselsindstillet miljø

  • Både kortlægge en filregion, F, til en region i deres virtuelle adresseområde (Bemærk: området for virtuelt adresserum kan være anderledes), som skrivebeskyttet (for eksempel kan P1 og P2 begge udføre det samme eksekverbar fil eller kortlægning i samme DLL, og F kan svare til .text sektionen)

  • P1 kræver først en belastning fra denne hukommelse, hvilket forårsager en sidefel. OS kigger op fejladresse i regionskortet, ser F er kortlagt til denne region, finder en ramme at bruge og læser i de nødvendige blokke af F i rammen, før opdatering af P1s sidetabellstrukturer.



Hvad sker der nu, når P2 anmoder om en belastning fra den samme hukommelse (for eksempel, udfører den samme rutine i en delt DLL)? P2 vil sikkert sidefejl ved første adgang; men hvordan ved operativsystemet, at dataene allerede er til stede i hukommelsen, og at P2s sidetabellstrukturer skal opdateres for at pege på den allerede bosiddende sideramme?


Min eneste konklusion er, at operativsystemet skal opretholde en global struktur, der sporer hver aktiv filkartede region: Hvilke dele er hjemmehørende i hukommelsen, og hvilke rammer de bor i.


Som et konkret referencepunkt ville det være godt at vide, hvordan det fungerer under Linux eller Windows.

Bedste reference


I betragtning af Linux implementering:


Det, du spørger om, opretholdes via siden cache. Hvis det er simpelt: Hver filside under IO-adgang læses først i side cache (cached file data in memory) - smart hash-tabel. Hver yderligere adgang til filen udføres via siden cache. Nærmere bestemt anvendes følgende fremgangsmåde:


page = find\_get\_page(mapping, index);


kortlægningen her - er en pointer til typen struct address\_space


struct address\_space { 
struct inode            *host;              /* owning inode */ 


index - er en blokforskydning i filen.


Således vil P2 ved at kende filen (se inode og adresserum) og forskydning af den aflæsede side forespørge sidens cache på sidefejl. Fordi P1 allerede har placeret siden i side cache tidligere, finder P2 den og returnerer blot markøren til passende struct page, som har data læst fra filen.