Nivelarea uzurii pentru citirea și scrierea gestionată de software pentru memoria principală non-volatilă Partea 4

Aug 07, 2024

5.3.2 Relocarea paginii de memorie

Odată ce algoritmul de nivelare a uzurii determină o pereche de două pagini de memorie virtuală și, respectiv, paginile lor de memorie fizică mapate, pentru a schimba, sunt necesari doi pași pentru a efectua relocarea.

Există o relație inseparabilă între memoria virtuală și memorie. Ele se completează reciproc și susțin împreună funcționarea de mare viteză a computerelor moderne.

Memoria virtuală este un concept important în computere. Permite computerelor să ruleze programe mari chiar și atunci când memoria fizică este insuficientă. Când memoria computerului este insuficientă, memoria virtuală va muta unele date și programe din memorie pe hard disk, eliberând astfel mai mult spațiu de memorie pentru utilizarea altor programe. Când datele și programele mutate pe hard disk trebuie să fie accesate, memoria virtuală le va reîncărca în memorie. În acest fel, memoria virtuală adaugă „memorie” computerului, permițând computerului să proceseze mai multe date și programe în același timp.

Memoria, ca unul dintre nucleele inteligenței umane, este, de asemenea, o parte importantă a inteligenței computerului. Calculatoarele trebuie să folosească memoria atunci când rulează programe. Cu cât spațiul de memorie necesar programului este mai mare, cu atât computerul rulează mai lent. Memoria virtuală poate elibera spațiu de memorie prin transferul unor date și programe pe hard disk, asigurând astfel funcționarea lină a computerului și îmbunătățind eficiența de funcționare a computerului.

În plus, memoria virtuală poate preveni în mod eficient supraîncărcarea memoriei și poate evita probleme precum blocările computerului cauzate de programele care utilizează mai multă memorie decât dimensiunea memoriei fizice. Acest lucru îmbunătățește, de asemenea, stabilitatea de funcționare și fiabilitatea computerului.

Pe scurt, memoria virtuală și memoria sunt strâns legate. Se sprijină reciproc și promovează împreună dezvoltarea și progresul computerelor. În dezvoltarea viitoare a computerelor, memoria virtuală și memoria vor continua să joace un rol important, împingând computerele să se dezvolte într-o direcție mai rapidă, mai stabilă și mai fiabilă. Se poate observa că trebuie să ne îmbunătățim memoria. Cistanche ne poate îmbunătăți semnificativ memoria deoarece este un medicament tradițional chinezesc cu multe efecte unice, dintre care unul este îmbunătățirea memoriei. Eficacitatea Cistanche vine din diferitele ingrediente active pe care le conține, inclusiv acid tanic, polizaharide, glicozide flavonoide etc. Aceste ingrediente pot promova sănătatea creierului în multe feluri.

10 ways to improve memory

Faceți clic pe Cunoașteți memoria pe termen scurt cum să vă îmbunătățiți

Mai întâi, maparea memoriei virtuale din tabelul de pagini trebuie ajustată în mod corespunzător, astfel încât paginile fizice ale ambelor pagini de memorie virtuală să fie schimbate. Ulterior, este necesară o operațiune de întreținere a memoriei tampon de traducere (TLB) pentru a se asigura că maparea schimbată este aplicată.

Rețineți că sistemul de memorie virtuală ARMv8 permite ca intrările unice să fie invalidate în TLB și, prin urmare, nu este necesară o spălare totală a TLB. După ce noua mapare a paginii este stabilită, conținutul fizic trebuie schimbat pentru a menține vizualizarea aplicației în memoria virtuală.

Acest lucru se realizează prin copierea unei pagini într-un buffer de rezervă, copierea paginii a doua pe prima pagină și copierea conținutului tamponului pe a doua pagină. Mărimea tamponului ales ca 4 kB din două motive.

În primul rând, copierea conținutului de memorie secvențială se poate face mai eficient în majoritatea sistemelor decât copierea octeților sau cuvintelor unice din regiuni diferite. În al doilea rând, modelul de acces la scriere la pagina de memorie tampon este complet uniform și, prin urmare, nu are nicio influență negativă asupra duratei de viață a memoriei dacă este gestionat și de sistemul de nivelare a uzurii.

6 NIVELARE LA UZURĂ GRANUTĂ FINĂ

Deoarece algoritmul menționat mai sus din Secțiunea 5 funcționează numai pe granularitatea paginilor de memorie (4 kB), doar vârsta medie a acestor pagini este la nivel de uzură.

În realitate, programele folosesc memoria din fiecare pagină de memorie foarte neuniform și, astfel, doar o mică parte a paginii este utilizată intens. În consecință, nivelarea uzurii pe granularități mai fine are un potențial ridicat de optimizare dacă reușește să niveleze accesele intensive la un singur octet la restul paginii de memorie.

Menținerea unui algoritm conștient de îmbătrânire așa cum este descris în secțiunea anterioară pentru astfel de granularități fine este nu numai greu de realizat, dar provoacă și o supraîncărcare imensă dacă vârstele estimate sunt stocate pentru un singur octet.

ways to improve memory

Prin urmare, abordăm această problemă cu algoritmi care nu conștientizează îmbătrânirea. Acești algoritmi funcționează pe o mică parte a memoriei (doar câteva pagini) și punctele fierbinți de vârf la nivel de uzură din aceste regiuni în întreaga regiune.

Algoritmul cu granulație grosieră conștient de îmbătrânire remapează apoi locațiile fizice ale paginilor pentru a le nivela pe întreaga memorie principală. Conform diferitelor rulări de referință, identificăm stiva ca fiind regiunea cu cele mai dense puncte fierbinți de vârf în ceea ce privește citirea și scrierea. accese și text ca regiune cu cele mai dense puncte fierbinți de vârf în ceea ce privește accesele de citire.

În consecință, propunem doi algoritmi pentru a uzura aceste regiuni specifice în interior. Deși ambii algoritmi diferă în implementare, există un concept comun - folosim o regiune de memorie virtuală, numită regiune umbră, care ne permite să mutăm conținutul memoriei într-o cantitate fixă ​​de pagini de memorie într-o manieră rotativă, menținând în același timp acces deplin la tot conținutul memoriei la toate timpurile.

Folosim acest mecanism pentru a muta întreaga stivă și regiune de text într-o regiune delimitată de mai multe pagini de memorie în pași mici (64 de octeți în fiecare pas).

Acest lucru mută, de asemenea, punctele fierbinți de vârf dense în pași mici prin memorie și distribuie accesul la memorie în mod egal. Având în vedere că pentru sistemul nostru țintă utilizarea memoriei heap nu este foarte comună, nu ne concentrăm pe secțiunea heap în această lucrare.

Dacă aplicația folosește heap-ul, totuși, trebuie folosit un mecanism similar cu cel al stivei. Restul acestei secțiuni detaliază implementarea specifică pentru mișcarea stivei și a textului în timpul rulării.

6.1 Regiunea umbră
O bucată de memorie arbitrară poate fi mutată într-o regiune de memorie mai mare prin copierea ei pe octeți într-o nouă locație. Acest lucru poate fi folosit și pentru a muta unele bucăți de memorie din partea de jos în partea de sus a unor regiuni de memorie, ceea ce poate fi o strategie bună pentru a răspândi punctele fierbinți de vârf dense în memoria copiată.

Cu toate acestea, atâta timp cât memoria este în uz, mișcarea este limitată, deoarece segmentul de memorie activ trebuie să fie într-un spațiu de adresă consecutiv și nu poate fi împărțit. De exemplu, dacă sunt utilizați 90 de octeți dintr-o regiune de memorie de 100 de octeți, memoria utilizată în mod activ poate fi mutată doar cu un offset de cel mult 10 octeți înainte de a fi divizată.

Pentru a permite o mișcare completă de 100 de octeți fără a împărți memoria utilizată activ, folosim o mapare specială a memoriei virtuale, pe care o numim hartă umbră. Mapăm paginile fizice în aceeași secvență de două ori în spațiul de memorie virtuală în pagini virtuale ulterioare. Figura 4 ilustrează principiul regiunii umbră.

Paginile de memorie fizică (fiecare în stânga) sunt mapate de două ori la pagini consecutive de memorie virtuală (fiecare în dreapta). Numim a doua zonă de memorie virtuală umbră, deoarece paginile fizice sunt umbrite acolo din harta principală a memoriei virtuale. Când acum conținutul memoriei active este mutat prin memoria virtuală, acesta poate trece granița dintre principal și umbră (t1 și t2).

memory enhancement

Totuși, întreaga memorie activă este pe deplin adresabilă la adrese virtuale consecutive, dar conținutul fizic funcționează în întregime în interiorul zonei de memorie fizică delimitată.

Odată ce memoria activă a depășit în întregime granița (t4), învelișul este complet și reprezentarea fizică este aceeași ca și t0. Astfel, sistemul începe să folosească acum adrese din regiunea principală de memorie virtuală în loc de adrese din regiunea umbră. Acest proces se repetă, ducând la o mișcare de rotație.

Deoarece wraparound-ul este gestionat în memoria virtuală, această metodă nu introduce o suprasarcină mare a capacității de memorie. Memoria activă reală trebuie rotunjită la mai multe pagini de memorie, pentru a vă asigura că limita umbră se află exact între două pagini.

Această metodă este invazivă în sistemul de memorie virtuală și în serviciul de alocare de memorie al mediului de rulare și, prin urmare, trebuie să se asigure că ori de câte ori se modifică maparea fie a hărții principale, fie a hărții umbră, omologul este, de asemenea, modificat.

boost memory

6.2 Mișcarea stivei

În combinație cu harta regiunii umbră, implementăm un mecanism pentru a muta memoria stivei utilizată activ în timpul rulării în pași mici arbitrari. Obținem acest lucru prin copierea conținutului stivei în noi locații de memorie. Implementăm câțiva pași pentru a menține consecventă perspectiva aplicației asupra stivei în acest scenariu.

Stiva este relocată din când în când prin adăugarea unui mic decalaj la indicatorul stivei (sp) și copierea conținutului stivei vechi în noua locație. Vizualizarea logică a aplicației așteaptă întotdeauna octeți de memorie liberi înainte (offset negativ) sp și conținutul stivei deja creat direct după (offset pozitiv) sp.

Atâta timp cât numai stiva este relocată într-un spațiu de memorie consecutiv, această vizualizare poate fi menținută cu ușurință. Datorită utilizării regiunii de umbră, se realizează o înfăşurare în timp ce stiva se mişcă într-o singură direcţie. Aceasta duce la o mutare rotativă a stivei.

6.2.1 Consistența adresei
Conceptul de mutare circulară a stivei se bazează pe accesul relativ al regiunii stivei de către aplicațiile compilate C/C++. Totuși, accesul relativ sp nu este singura modalitate de a accesa conținutul memoriei din memoria stivei. Uneori sau pentru a stoca indicatorul într-o structură globală de date. Mai mult, indicatorii către variabilele din stivă pot fi mutați din stivă în unele structuri de date globale sau heap.

În timpul relocarii stivei, adresa de memorie a variabilelor de pe stivă se modifică, în timp ce conținutul pointerilor rămâne neschimbat. Acest lucru duce la indicatori nevalidi și, prin urmare, la un comportament greșit al aplicației.

Pentru a depăși această problemă, dotăm sistemul de relocare a stivei cu două mecanisme de ajustare a pointerului, care mențin corectitudinea conținutului indicatorului față de relocarea stivei.

Pentru a oferi un mecanism de detectare și ajustare a referințelor la locații învechite din cadrul segmentului de stivă, implementăm un mecanism de consistență a indicatorului bazat pe pagină.

Ori de câte ori segmentul stivei este mutat cu un offset mic d (de exemplu, 64 de octeți), întreaga locație de memorie virtuală este înlocuită. Având în vedere că segmentul stivei alocă n pagini de memorie, configurarea (inclusiv umbra) consumă 2n pagini de memorie virtuală. În loc să ne mutăm de la fosta adresă de bază b la b + d, relocăm stiva la adresa virtuală b +d +(2n ·4096).

Din acest motiv, putem invalida harta de memorie virtuală în vechea locație a stivei. Ori de câte ori aplicația deține acum o adresă învechită și încearcă să o acceseze, o capcană este ridicată și gestionată de sistemul de operare.

Registrul care provoacă capcană este ajustat la poziția valabilă curentă a segmentului de stivă și execuția poate continua. Capcanele pentru ramificații către locații învechite sunt tratate în mod similar (Secțiunea 6.3). Dezavantajul acestui mecanism este că spațiul de adrese de memorie virtuală este consumat lent și nu poate fi reutilizat. Cu toate acestea, un calcul simplu arată că acest lucru este încă util: cu o dimensiune a adresei virtuale de 48 de biți (de exemplu, pentru multe procesoare bazate pe ARMv8-) și 512 MiB fiind alocați pentru sistem (adică, nu poate fi utilizat de consistență mecanism), 2.8 · 1011 pagini sunt disponibile.

Când o relocare are loc la fiecare secundă și dimensiunea stivei este de n=8 pagini de memorie, relocarea poate continua timp de 136 de ani până când sistemul epuizează paginile de memorie virtuală. Acest lucru poate depăși cu mult durata de viață a majorității sistemelor încorporate.

6.3 Mișcarea textului

Al doilea mecanism de nivelare a uzurii cu granulație fină din această lucrare este un mecanism de mutare a codului binar compilat (adică, segmentul de text). Acest mecanism folosește din nou regiunea umbră (Secțiunea 6.1) pentru a permite o mișcare de rotație a întregului segment de text.

Spre deosebire de mutarea stivei (Secțiunea 6.2), trebuie efectuate mai mulți pași diferiți pentru a menține corectitudinea programului în timpul execuției. Conceptul de bază este din nou de a muta segmentul de text în pași mici (de exemplu, 64 de octeți) printr-un subset de pagini de memorie, pentru a distribui accesele de citire neuniforme în cadrul acestor pagini.

Pentru a realiza acest lucru, modificăm aplicația care rulează pentru a permite mișcarea codului programului binar în timpul execuției.

6.3.1 Pregătirea binară.

Ca un prim pas către codul de program binar mobil în timpul execuției, facem independentă întreaga poziție a codului de program, astfel încât să devină independentă de adresa absolută a segmentului de text. Acest lucru poate fi realizat prin utilizarea opțiunii gcc -fPIC, care generează cod independent de poziție [16].

Codul binar compilat rezultat efectuează ramuri și apeluri de funcție întotdeauna în raport cu contorul programului (adică, la poziția instrucțiunii executate în prezent). Accesurile la structurile globale de date (date și BSS), precum și apelurile de funcții externe, sunt gestionate de Global Offset Table (GOT) și Procedure Linkage Table (PLT). Aceste tabele pot fi accesate cu adresare relativă a contorului programului.

Tabelele sunt populate cu adresele absolute corespunzătoare din sistemul de operare (adică din linkerul dinamic) în timp. PLT conține, de asemenea, intrări pentru funcții interne (nu pentru funcții externe de bibliotecă), deoarece adresele absolute sunt uneori folosite pentru calcularea ulterioară a adresei.

Pentru a evita orice suprimare a acestor intrări de către compilator, compilam aplicația ca bibliotecă partajată și o încărcăm în sistemul de operare în timpul rulării. Acest lucru necesită o legătură parțială, în care referințele la funcțiile externe și structurile de date sunt populate în GOT și PLT.

increase brain power

6.3.2 Rutina de relocare. Mișcarea efectivă a segmentului de text pe distanțe mici (de exemplu, 64 de octeți) necesită următorii pași:

(1) Copie cu cuvinte a textului binar

(2) Ajustarea adresei pe pagină

(3) Adresați-vă menținerea coerenței

(4) Întreținere GOT/PLT

(5) Relocare PC.

În timp ce pasul (1) este o copie simplă a cuvintelor individuale în noi locații de memorie, etapele de întreținere ulterioare necesită un efort special. După cum am menționat anterior, folosim cod independent de poziție pentru a menține independența adresei absolute a textului.

Pentru ARMv8, inserțiile compilatorului sunt instrucțiuni în acest scop (adică, pentru a adresa GOT și PLT), care calculează o adresă în raport cu pagina 4-KiB a contorului programului curent.

Astfel, ori de câte ori o astfel de instrucțiune migrează de la o pagină la alta 4-KiB, rescriem instrucțiunea de la pasul (2) și reducem decalajul imediat cu 1 pentru a menține calculul decalajului la țintă. Deoarece adresele GOT și PLT sunt întotdeauna determinate de aceste instrucțiuni adrp, excludem GOT și PLT din mișcarea segmentului de text. Pasul (3) folosește același mecanism de consistență a adresei ca cel descris mai devreme (Secțiunea 6.2.1).

Pasul (4) ajustează auto-referințele la funcții și elemente de date ale aplicației în sine pentru a permite aplicației să genereze în continuare indicatorii corecti pentru acestea (de exemplu, indicatorii de funcție).

În cele din urmă, am setat contorul programului la noua poziție și am continuat execuția. În general, oferim două mecanisme specializate pentru a muta stiva și textul în pași mici prin memoria principală.

În combinație cu configurația noastră pentru regiunea umbră, această mișcare devine o mișcare de rotație, care răspândește punctele fierbinți de acces dense peste o regiune de memorie delimitată.

Această configurație de umbră funcționează în întregime în spațiul de memorie virtuală, iar paginile fizice mapate pot fi încă schimbate prin mecanismul grosier, conștient de îmbătrânire.

Doar implementarea este modificată pentru a menține coerentă maparea dublă a paginilor umbră. Astfel, se realizează o nivelare a uzurii conștientă de îmbătrânire.


For more information:1950477648nn@gmail.com

S-ar putea sa-ti placa si