Paging

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 19 octombrie 2021; verificările necesită 4 modificări .

Paging ( în engleză  paginare ; termenul swapping din swap , /swɔp/ este uneori folosit ) este unul dintre mecanismele memoriei virtuale , în care fragmente individuale de memorie (de obicei inactive) sunt mutate din RAM în stocarea secundară (un hard disk sau alt unitate externă, cum ar fi memoria flash ), eliberând RAM pentru a încărca alte fragmente de memorie active. Astfel de fragmente din computerele moderne sunt pagini de memorie.

Paginile descărcate temporar din memorie pot fi stocate pe dispozitive de stocare externe atât într-un fișier, cât și într-o partiție specială de pe un hard disk (partiție), numită fișier swap și, respectiv, partiție swap. Dacă este necesar să descărcați pagini din RAM care corespund conținutului unui fișier de pe hard disk (de exemplu, fișiere mapate în memorie), acestea nu pot fi descărcate, ci pur și simplu șterse. Când se solicită o astfel de pagină, aceasta poate fi citită din fișierul original.

Când o aplicație accesează o pagină care nu este în RAM, va apărea o excepție PageFault. Managerul pentru acest eveniment ar trebui să verifice dacă pagina solicitată a fost schimbată anterior și, dacă se află în fișierul de schimb, să o încarce înapoi în memorie.

Istorie

Inițial, schimbarea a fost înțeleasă ca descărcarea unui proces din RAM în ansamblu, drept urmare procesele inactive ar putea lipsi complet din RAM. Când au fost îndeplinite condițiile de activare pentru proces , managerul de memorie a încărcat imaginea procesului înapoi.

Sensul termenului s-a schimbat în anii 60 , când a apărut suportul pentru memoria virtuală în sistemele de operare : schimbarea a început să însemne încărcarea și descărcarea paginilor individuale. Paginarea a fost implementată pentru prima dată în computerul Atlas , lansat în 1962.

Eșecuri de pagină

Principalele funcții ale mecanismului de paginare sunt îndeplinite atunci când un program încearcă să acceseze pagini care nu sunt mapate în prezent pe memoria fizică (RAM). Această situație se numește eșec de pagină . În acest moment, sistemul de operare ar trebui să preia controlul și să gestioneze eroarea paginii într-un mod transparent pentru program. Astfel, sistemul de operare are nevoie de:

  1. Determinați locația paginii necesare în stocarea secundară.
  2. Obțineți un cadru de pagină gol în memoria fizică pentru a-l utiliza ca container de date.
  3. Încărcați datele solicitate în cadrul paginii primite.
  4. Actualizați tabelul de pagini pentru a indica noul cadru de pagină.
  5. Într-o formă transparentă, returnați controlul programului prin reexecutarea instrucțiunii care a cauzat eroarea paginii.

Dacă, atunci când se primește un cadru de pagină gol, nu există suficientă RAM liberă, se execută algoritmul de înlocuire a paginii, care selectează unul dintre cadrele de pagină utilizate pentru descărcare. Dacă cadrul de pagină care urmează să fie paginat a fost alocat dinamic în timpul execuției programului sau dacă face parte din segmentul de date al programului și s-a modificat de când a fost citit în memorie (cu alte cuvinte, dacă a devenit „murdar”), trebuie să fie salvate în spațiul de stocare secundar înainte de a fi dealocate. În caz contrar, conținutul cadrului paginii din RAM este același cu conținutul paginii din stocarea secundară, deci nu trebuie să fie paginat. Dacă o pagină descărcată este accesată mai târziu în timpul rulării, va apărea o altă eroare a paginii și cadrul paginii va trebui realocat, astfel încât conținutul paginii din stocarea secundară să poată fi reîncărcat în RAM.

Pentru a asigura o funcționare eficientă, sistemul de paginare trebuie să selecteze pentru paginare acele cadre de pagină care sunt cel mai puțin probabil să fie accesate în viitorul apropiat. Există diverși algoritmi de înlocuire a paginii . Sistemele de operare folosesc algoritmi LRU ( Ultimul utilizat recent ) , FIFO ( First In First Out ) sau algoritmi luând în considerare setul de lucru al procesului [1] .  

Pentru a îmbunătăți și mai mult timpul de răspuns, sistemele de paginare pot utiliza diferite strategii pentru a prezice accesările următoarelor pagini. Astfel de sisteme încearcă să încarce pagini în memoria principală cu mult înainte ca programul să le acceseze.

Algoritmi pentru determinarea paginilor învechite

Când alocați spațiu pentru o pagină nouă, poate fi necesar să ștergeți orice pagină aflată în prezent în memorie. Regulile de înlocuire a paginii sunt folosite pentru a decide ce pagină ar trebui să fie eliminată din memorie. Candidatul ideal este o pagină „moartă” de care nimeni nu mai are nevoie (de exemplu, se referă la un proces încheiat). Dacă nu există astfel de pagini în memorie (sau nu sunt suficiente), se utilizează regula înlocuirii paginilor locale sau globale:

Cele mai frecvent utilizate criterii de căutare:

Alunecare

Majoritatea programelor nu folosesc toată memoria alocată lor simultan, ci doar o parte din aceasta, determinată de instrucțiunile care se execută în prezent și de datele de care au nevoie. Dacă programul respectă principiul localității , atunci partea din memorie utilizată poate fi semnificativ mai mică decât întreaga memorie alocată programului. Dimensiunea acestei porțiuni utilizabile reflectă atingerea programului într-o anumită stare de echilibru a consumului de memorie și este adesea denumită set de lucru .

Sistemele de memorie virtuală funcționează eficient atunci când suma seturilor de lucru ale tuturor proceselor nu depășește dimensiunea memoriei RAM fizice. În acest caz, timpul necesar pentru gestionarea erorilor de pagină nu are un impact prea mare asupra performanței. Cu toate acestea, un program care funcționează cu structuri mari de date poate avea un set de lucru care este prea mare pentru ca sistemul de swap să poată fi servit eficient. Acest lucru va duce la un flux continuu de erori de pagină și o scădere drastică a performanței computerului. Această situație se numește thrashing : paginile sunt descărcate în mod continuu și apoi accesate, provocând eșecuri frecvente ale paginii.

O caracteristică interesantă a thrashing-ului este că, până la un anumit punct critic, numărul de erori ale paginii crește lent pe măsură ce setul de lucru crește. După atingerea acestui punct critic, numărul de erori de pagină crește dramatic și cea mai mare parte a puterii de procesare este cheltuită pentru procesarea acestora.

Pentru a evita alunecarea, utilizatorul poate lua următoarele acțiuni:

Dezavantaje și posibilitatea de a le depăși

În cazul datelor de memorie virtuală situate pe dispozitive de stocare externe (de exemplu, hard disk), așa cum se întâmplă cel mai adesea, accesul la memorie încetinește (comparativ cu dispozitivele de stocare cu acces aleatoriu).

Cu o probabilitate mare, utilizarea schimbului pe unități SSD (care au un număr limitat de cicluri de scriere) reduce durata de viață a acestora. Dar crește foarte mult viteza de schimb. Dacă SSD-ul nu este planificat să fie moștenit, atunci acest lucru este benefic.

Pe Windows XP, Vista, 7 pe 32 de biți, fișierul de schimb poate folosi RAM mai mult de 3 gigaocteți utilizând un software terț de creare a discurilor ram în memorie .

Linux acceptă un mecanism similar, zswap , care plasează schimbul în memorie sub formă comprimată.

Schimbați fișiere și partiții

Implementarea stocării virtuale a datelor în diferite sisteme de operare diferă datorită caracteristicilor arhitecturale ale nucleelor ​​și sistemelor de fișiere ale acestora.

Fragmentarea fișierului de pagină

În timpul funcționării, fișierul de schimb (partiția de disc sau fișierul pe partiție) poate deveni fragmentat, adică zonele de memorie virtuală contigue vor consta din numeroase regiuni separate (discontinue) în fișierul de schimb. Când citiți și scrieți date de pagină, situate liniar în memoria virtuală, dar împrăștiate peste fișierul de paginare, va dura mult timp pentru a repoziționa capetele hard disk-ului la începutul zonei următoare. Acest lucru poate duce la o scădere a performanței întregului sistem din cauza abundenței cererilor I/O lente.


Instrucțiuni privind locația fișierului de schimb

Securitate atunci când lucrați cu un fișier swap

Din fișierul de swap (partiție) este adesea posibilă extragerea informațiilor confidențiale utilizate în funcționarea sistemului de calcul. Prin urmare, atunci când lucrați cu date secrete, schimbul este de obicei șters - de exemplu, folosind utilitarul sswap din pachetul de ștergere securizat .

De asemenea, multe programe care funcționează cu informații valoroase sau cu criptare pot dezactiva selectiv capacitatea de a extrage fragmente de memorie.

Pe Linux, puteți cripta fișierul sau partiția de swap (de exemplu, pe distribuția Ubuntu, acest lucru se face automat atunci când selectați opțiunea de a cripta directorul principal al utilizatorului în timpul instalării sistemului de operare). Această soluție mărește oarecum sarcina procesorului, dar garantează siguranța informațiilor confidențiale chiar și în cazul unei întreruperi bruște de curent.

Utilizarea fișierului de paginare poate duce la infectarea unor sisteme de operare cu viruși informatici , deoarece există o vulnerabilitate , care vă permite să împingeți programele care rulează în memoria virtuală și să schimbați codul de rulare folosind acces direct la hard disk.

Unix

În Unix și sisteme de operare similare, schimbul este de obicei plasat pe o partiție separată de hard disk, care anterior făcea accesul la date mai rapid decât locația de schimb pe o partiție obișnuită. Pe nucleele Linux 2.6 și mai noi, performanța unui fișier de swap este la fel de bună ca cea a unei partiții de swap [2] [3] .

Un exemplu de creare a unui fișier de schimb pentru GNU/Linux:

# dd if=/dev/zero of=/swap bs=1024 count=128K # mkswap /swap # sincronizare # swapon /swap

Oracle Solaris poate folosi volumele ZFS ca partiții swap:

# zfs creează -V 2G pool/swap # swap -a /dev/zvol/dsk/pool/swap

Pe lângă faptul că sunt folosite în timp ce sistemul rulează, unele distribuții GNU/Linux folosesc o partiție de swap pentru a organiza modul de repaus („hibernare”, hibernare sau „suspendare pe disc” - modul S4 ACPI ). Pentru a sprijini acest mod, dimensiunea swap-ului ar trebui să fie setată egală cu dimensiunea RAM, mărită cu 10-15%.

Microsoft Windows și Windows NT

Zona hard disk-ului destinată schimbului se află într-un fișier separat numit fișier swap , fișier swap (din engleză  fișier swap ). Se numește pagefile.sys și este creat implicit de sistem în directorul rădăcină al unității C :. În viitor, utilizatorul poate controla dimensiunea și plasarea fișierului de paginare, de exemplu, folosind panoul de control , elementul System .

În Windows 9x, fișierul de schimb se numește win386.swp și se află în directorul Windows. Totuși, prin editarea fișierului system.ini, acesta poate fi mutat în directorul rădăcină pentru partajare ulterioară cu Windows NT.

De asemenea, începând cu Windows Vista, a devenit posibilă crearea unei partiții swap dedicate, similare ca scop cu cele utilizate în sistemele UNIX.

Note

  1. Peter J. Denning. Thrashing: Cauzele sale și prevenirea  // Proceedings AFIPS, Fall Joint Computer Conference. - 1968. - T. 33 . — S. 915–922 .
  2. „Jesper Juhl”: Re: Cum se trimite o pauză? - dump de pe Linux pe 64 de biți înghețat . LKML (29 mai 2006). Consultat la 28 octombrie 2010. Arhivat din original pe 19 iunie 2012.
  3. Andrew Morton: Re: Schimbați partiția vs fișierul de schimb . LKML. Consultat la 28 octombrie 2010. Arhivat din original pe 19 iunie 2012.