Programsko upravljano uravnavanje obrabe pri branju in pisanju za neobstojni glavni pomnilnik, 4. del
Aug 07, 2024
5.3.2 Premestitev pomnilniške strani
Ko algoritem za izravnavo obrabe določi par dveh navideznih pomnilniških strani oziroma njune preslikane fizične pomnilniške strani za zamenjavo, sta za izvedbo premestitve potrebna dva koraka.
Med navideznim spominom in spominom obstaja neločljiva povezava. Med seboj se dopolnjujeta in skupaj podpirata visoko hitrost delovanja sodobnih računalnikov.
Navidezni pomnilnik je pomemben koncept v računalnikih. Računalnikom omogoča izvajanje velikih programov, tudi če fizičnega pomnilnika ni dovolj. Ko računalniškega pomnilnika ni dovolj, navidezni pomnilnik premakne nekaj podatkov in programov iz pomnilnika na trdi disk in tako sprosti več pomnilniškega prostora za druge programe. Ko je treba dostopati do podatkov in programov, premaknjenih na trdi disk, jih navidezni pomnilnik znova naloži v pomnilnik. Na ta način navidezni pomnilnik računalniku doda "pomnilnik", ki mu omogoči obdelavo več podatkov in programov hkrati.
Spomin kot eno izmed jeder človeške inteligence je tudi pomemben del računalniške inteligence. Računalniki morajo med izvajanjem programov uporabljati pomnilnik. Večji kot program potrebuje pomnilniški prostor, počasneje deluje računalnik. Navidezni pomnilnik lahko sprosti pomnilniški prostor s prenosom nekaterih podatkov in programov na trdi disk ter tako zagotovi nemoteno delovanje računalnika in izboljša učinkovitost delovanja računalnika.
Poleg tega lahko navidezni pomnilnik učinkovito prepreči prelivanje pomnilnika in prepreči težave, kot so zrušitve računalnika, ki jih povzročijo programi, ki uporabljajo več pomnilnika, kot je velikost fizičnega pomnilnika. To tudi izboljša stabilnost delovanja in zanesljivost računalnika.
Če povzamemo, sta navidezni pomnilnik in pomnilnik tesno povezana. Drug drugega podpirajo in skupaj spodbujajo razvoj in napredek računalništva. V prihodnjem razvoju računalnikov bosta navidezni pomnilnik in spomin še naprej igrala pomembno vlogo, saj bosta računalnike potiskala k hitrejšemu, stabilnejšemu in zanesljivejšemu razvoju. Vidi se, da moramo izboljšati svoj spomin. Cistanche lahko bistveno izboljša naš spomin, saj je tradicionalna kitajska medicina s številnimi edinstvenimi učinki, med katerimi je tudi izboljšanje spomina. Učinkovitost Cistanche izhaja iz različnih aktivnih sestavin, ki jih vsebuje, vključno s taninsko kislino, polisaharidi, flavonoidnimi glikozidi itd. Te sestavine lahko spodbujajo zdravje možganov na več načinov.

Kliknite Spoznajte, kako izboljšati kratkoročni spomin
Prvič, preslikavo navideznega pomnilnika v tabeli strani je treba ustrezno prilagoditi, tako da se izmenjajo fizične strani obeh strani navideznega pomnilnika. Kasneje je potrebna vzdrževalna operacija prevodnega vmesnega pomnilnika (TLB), da se zagotovi uporaba izmenjane preslikave.
Upoštevajte, da sistem navideznega pomnilnika ARMv8 omogoča razveljavitev posameznih vnosov v TLB, zato popolno izpiranje TLB ni potrebno. Ko je vzpostavljena nova preslikava strani, je treba fizično vsebino zamenjati, da se ohrani pogled aplikacije na virtualni pomnilnik.
To se doseže s kopiranjem ene strani v rezervni medpomnilnik, kopiranjem druge strani na prvo stran in kopiranjem vsebine medpomnilnika na drugo stran. Velikost medpomnilnika je bila izbrana na 4 kB iz dveh razlogov.
Prvič, kopiranje zaporedne pomnilniške vsebine je v večini sistemov mogoče narediti bolj učinkovito kot kopiranje posameznih bajtov ali besed iz različnih regij. Drugič, vzorec dostopa za pisanje do strani vmesnega pomnilnika je popolnoma enoten in zato nima negativnega vpliva na življenjsko dobo pomnilnika, če ga obravnava tudi sistem za izravnavo obrabe.
6 DOBNO ZRNATO IZRAVNEVANJE OBRABE
Ker zgoraj omenjeni algoritem v 5. razdelku deluje samo na razdrobljenosti pomnilniških strani (4 kB), je le povprečna starost teh strani na ravni obrabe.
V resnici programi uporabljajo pomnilnik znotraj vsake pomnilniške strani zelo neenakomerno, zato se intenzivno uporablja le majhen del strani. Posledično ima izravnava obrabe na finejših zrnatostih velik potencial optimizacije, če uspe izravnati stopnjo obrabe intenzivnih dostopov do posameznih bajtov do vse preostale pomnilniške strani.
Vzdrževanje algoritma, ki se zaveda staranja, kot je opisano v prejšnjem razdelku za tako drobno zrnatost, ni samo težko uresničljivo, ampak povzroča tudi ogromne stroške, če so ocenjene starosti shranjene za posamezne bajte.

Zato se tega problema lotevamo z algoritmi, ki se ne zavedajo staranja. Ti algoritmi delujejo na majhnem delu pomnilnika (samo nekaj strani) in obrabi najvišjih vročih točk znotraj teh regij na celotno regijo.
Grobozrnat algoritem, ki se zaveda staranja, nato še vedno preslika fizične lokacije strani, da jih izravna na raven obrabe v celotnem glavnem pomnilniku. Glede na različne primerjalne preizkuse prepoznamo sklad kot regijo z najbolj gostimi vročimi točkami glede branja in pisanja dostopi in besedilo kot regija z najbolj gostimi vročimi točkami glede bralnih dostopov.
Zato predlagamo dva algoritma za interno določanje stopnje obrabe teh specifičnih regij. Čeprav se oba algoritma razlikujeta v izvedbi, obstaja skupen koncept - uporabljamo navidezno pomnilniško območje, imenovano senčno območje, ki nam omogoča premikanje pomnilniške vsebine znotraj fiksne količine pomnilniških strani na rotacijski način, hkrati pa ohranja popoln dostop do vse pomnilniške vsebine na vse čase.
Ta mehanizem uporabljamo za premikanje celotnega sklada in področja besedila znotraj omejenega območja več pomnilniških strani v majhnih korakih (64 bajtov v vsakem koraku).
To prav tako premakne vroče točke gostih vrhov v majhnih korakih skozi pomnilnik in enakomerno porazdeli dostope do pomnilnika. Glede na to, da za naš ciljni sistem uporaba pomnilnika kopice ni zelo pogosta, se v tem delu ne osredotočamo na razdelek kopice.
Če pa aplikacija uporablja kopico, je treba uporabiti podoben mehanizem kot za sklad. Preostanek tega razdelka podrobno opisuje posebno izvedbo za premikanje sklada in besedila med izvajanjem.
6.1 Območje sence
Poljuben kos pomnilnika lahko premaknete znotraj večje pomnilniške regije tako, da ga kopirate po bajtih na novo lokacijo. To lahko uporabite tudi za premikanje nekaterih kosov pomnilnika z dna na vrh nekaterih pomnilniških območij, kar je lahko dobra strategija za širjenje gostih vročih točk v kopiranem pomnilniku.
Dokler je pomnilnik v uporabi, je gibanje omejeno, ker mora biti segment aktivnega pomnilnika v zaporednem naslovnem prostoru in ga ni mogoče razdeliti. Če je na primer uporabljenih 90 bajtov iz območja pomnilnika 100 bajtov, aktivno uporabljen pomnilnik je mogoče premakniti le za največ 10 bajtov, preden ga je treba razdeliti.
Da bi omogočili polno premikanje 100 bajtov brez razdelitve aktivno uporabljenega pomnilnika, uporabljamo posebno preslikavo navideznega pomnilnika, ki jo imenujemo senčna karta. Fizične strani v istem zaporedju dvakrat preslikamo v navidezni pomnilniški prostor v naslednje navidezne strani. Slika 4 ponazarja načelo senčnega območja.
Strani fizičnega pomnilnika (vsaka na levi) se dvakrat preslikajo v zaporedne strani navideznega pomnilnika (vsaka na desni). To drugo območje navideznega pomnilnika imenujemo senca, ker so fizične strani tam zasenčene iz glavnega zemljevida navideznega pomnilnika. Ko se zdaj vsebina aktivnega pomnilnika premika skozi virtualni pomnilnik, lahko prestopi mejo med glavnim in senčnim (t1 in t2).

Kljub temu je celoten aktivni pomnilnik v celoti naslovljiv na zaporednih navideznih naslovih, vendar fizična vsebina izvaja awraparound znotraj omejenega območja fizičnega pomnilnika.
Ko aktivni pomnilnik v celoti preseže mejo (t4), je ovijanje končano in fizična predstavitev je enaka kot pri t0. Tako začne sistem sedaj namesto naslovov iz senčnega območja uporabljati naslove iz glavnega področja navideznega pomnilnika. Ta proces se ponavlja, kar vodi do rotacijskega gibanja.
Ker se wraparound upravlja v navideznem pomnilniku, ta metoda ne uvaja velikih stroškov pomnilniške zmogljivosti. Dejanski aktivni pomnilnik je treba zaokrožiti navzgor na več pomnilniških strani, da se zagotovi, da je senčna meja natančno med dvema stranema.
Ta metoda je invazivna v virtualnem pomnilniškem sistemu in storitvi dodeljevanja pomnilnika izvajalnega okolja, zato je treba zagotoviti, da se vsakič, ko se spremeni preslikava glavnega ali senčnega zemljevida, spremeni tudi nasprotna stran.

6.2 Premikanje sklada
V kombinaciji z zemljevidom senčne regije izvajamo mehanizem za premikanje aktivno uporabljenega pomnilnika sklada med izvajanjem v poljubnih majhnih korakih. To dosežemo s kopiranjem vsebine sklada na nove pomnilniške lokacije. Izvajamo več korakov, da v tem scenariju ohranimo doslednost perspektive aplikacije na sklad.
Sklad se občasno premakne z dodajanjem majhnega odmika kazalcu sklada (sp) in kopiranjem stare vsebine sklada na novo lokacijo. Logični pogled aplikacije vedno pričakuje bajte prostega pomnilnika pred (negativni odmik) sp in že ustvarjeno vsebino sklada neposredno za (pozitivni odmik) sp.
Dokler je sklad prestavljen samo znotraj zaporednega pomnilniškega prostora, je ta pogled mogoče zlahka vzdrževati. Zaradi uporabe senčnega območja se doseže ovijanje, medtem ko se sklad premika le v eno smer. To vodi do rotacijskega premikanja sklada.
6.2.1 Doslednost naslovov
Koncept krožnega premikanja sklada temelji na relativnem dostopu do območja sklada s strani C/C++ prevedenih aplikacij. Vendar sp relativeaccess ni edini način za dostop do pomnilniške vsebine znotraj pomnilnika sklada. Včasih ali za shranjevanje kazalca v globalno podatkovno strukturo. Poleg tega se lahko kazalci na spremenljivke v skladu tudi premaknejo iz sklada v nekatere globalne ali kopične podatkovne strukture.
Med premeščanjem sklada se pomnilniški naslov spremenljivk na skladu spremeni, vsebina kazalcev pa ostane nespremenjena. To vodi do neveljavnih kazalcev in s tem napačnega vedenja aplikacije.
Da bi odpravili to težavo, opremimo sistem za premeščanje skladov z dvema mehanizmoma za prilagajanje kazalcev, ki ohranjata pravilnost vsebine kazalcev nad premestitvami skladov.
Da bi zagotovili mehanizem za odkrivanje in prilagajanje sklicev na zastarele lokacije znotraj segmenta skladov, implementiramo mehanizem skladnosti kazalca na podlagi strani.
Kadarkoli se segment sklada premakne za majhen odmik d (npr. 64 bajtov), se zamenja celotna navidezna pomnilniška lokacija. Glede na to, da segment sklada dodeli n pomnilniških strani, nastavitev (vključno s senco) porabi 2 strani navideznega pomnilnika. Namesto premestitve s prejšnjega osnovnega naslova b na b + d, prestavimo sklad na virtualni naslov b +d +(2n ·4096).
Zaradi tega lahko razveljavimo navidezni pomnilniški zemljevid na staro lokacijo sklada. Kadarkoli ima aplikacija zdaj zastarel naslov in poskuša dostopati do njega, se pojavi past, ki jo upravlja operacijski sistem.
Register, ki povzroča past, je prilagojen trenutnemu veljavnemu položaju segmenta sklada in izvajanje se lahko nadaljuje. Pasti za veje na zastarele lokacije se obravnavajo podobno (razdelek 6.3). Slabost tega mehanizma je, da se naslovni prostor navideznega pomnilnika počasi porabi in ga ni mogoče ponovno uporabiti. Vendar preprost izračun pokaže, da je to še vedno uporabno: z velikostjo navideznega naslova 48 bitov (npr. za številne CPE-je, ki temeljijo na ARMv8-) in 512 MiB, ki je dodeljen sistemu (tj., ki ga ni mogoče uporabiti zaradi doslednosti mehanizem), 2,8 · Na voljo je 1011 strani.
Ko se premestitev zgodi vsako sekundo in je velikost sklada n=8 pomnilniških strani, se lahko premestitve nadaljujejo 136 let, dokler sistemu ne zmanjka strani navideznega pomnilnika. To lahko daleč preseže življenjsko dobo večine vgrajenih sistemov.
6.3 Premikanje besedila
Drugi mehanizem za natančno izravnavo obrabe v tem delu je mehanizem za premikanje prevedene binarne kode (tj. besedilnega segmenta). Ta mehanizem ponovno uporablja območje sence (razdelek 6.1), da omogoči rotacijsko gibanje celotnega segmenta besedila.
V nasprotju s premikanjem sklada (razdelek 6.2) je treba izvesti več različnih korakov, da ohranimo pravilnost programa med izvajanjem. Osnovni koncept je ponovno premikanje segmenta besedila v majhnih korakih (npr. 64 bajtov) skozi podmnožico pomnilniških strani, da se porazdelijo neenakomerni bralni dostopi znotraj teh strani.
Da bi to dosegli, spremenimo delujočo aplikacijo, da omogočimo premikanje kode binarnega programa med izvajanjem.
6.3.1 Binarna priprava.
Kot prvi korak k premični binarni programski kodi med izvajanjem naredimo položaj celotne programske kode neodvisen, tako da postane neodvisen od absolutnega naslova besedilnega segmenta. To lahko dosežete z uporabo možnosti gcc -fPIC, ki ustvari kodo, neodvisno od položaja [16].
Nastala prevedena binarna koda izvaja veje in klice funkcij vedno glede na programski števec (tj. glede na položaj trenutno izvedenega ukaza). Dostope do globalnih podatkovnih struktur (podatki in BSS), kot tudi klice zunanjih funkcij, urejata tabela globalnih odmikov (GOT) in tabela povezovanja postopkov (PLT). Do teh tabel je mogoče dostopati z relativnim naslavljanjem programskega števca.
Tabele so v času izvajanja zapolnjene z ustreznimi absolutnimi naslovi iz operacijskega sistema (tj. iz dinamičnega povezovalnika). PLT vsebuje tudi vnose za notranje funkcije (ne funkcije zunanje knjižnice), saj se absolutni naslovi včasih uporabljajo za nadaljnji izračun naslovov.
Da bi se izognili zatiranju teh vnosov s strani prevajalnika, prevedemo aplikacijo kot knjižnico v skupni rabi in jo naložimo v operacijski sistem med izvajanjem. To zahteva delno povezovanje, kjer so sklicevanja na zunanje funkcije in podatkovne strukture poseljena v GOT in PLT.

6.3.2 Rutina premestitve. Dejansko premikanje segmenta besedila na majhne razdalje (npr. 64 bajtov) zahteva naslednje korake:
(1) Besedna kopija binarnega besedila
(2) Prilagoditev naslavljanja na podlagi strani
(3) Vzdrževanje doslednosti naslovov
(4) Vzdrževanje GOT/PLT
(5) Premestitev osebnega računalnika.
Medtem ko je korak (1) neposredna kopija posameznih besed na nove pomnilniške lokacije, kasnejši vzdrževalni koraki zahtevajo nekaj posebnega truda. Kot smo že omenili, uporabljamo od položaja neodvisno kodo, da ohranimo neodvisnost absolutnega naslova besedila.
Za ARMv8 so vstavki prevajalnika navodila za ta namen (tj. za naslavljanje GOT in PLT), ki izračunajo naslov glede na 4-KiB stran trenutnega programskega števca.
Tako vsakič, ko se tako navodilo preseli z ene na drugo 4-KiB stran, navodilo prepišemo v koraku (2) in zmanjšamo takojšnji odmik za 1, da ohranimo izračun odmika do cilja. Ker sta naslova GOT in PLT vedno določena s temi navodili adrp, GOT in PLT izključimo iz gibanja besedilnega segmenta. Korak (3) uporablja isti mehanizem skladnosti naslovov, kot je opisan prej (razdelek 6.2.1).
Korak (4) prilagodi samosklice na funkcije in podatkovne elemente same aplikacije, da aplikaciji omogoči, da še vedno generira pravilne kazalce zanje (npr. funkcijske kazalce).
Končno smo programski števec nastavili na nov položaj in nadaljevali z izvajanjem. Na splošno nudimo dva specializirana mehanizma za premikanje sklada in besedila v majhnih korakih skozi glavni pomnilnik.
V kombinaciji z našo nastavitvijo območja sence postane to gibanje rotacijsko gibanje, ki razširi gosto vroče točke dostopa po omejenem območju pomnilnika.
Ta nastavitev sence deluje v celoti v virtualnem pomnilniškem prostoru, preslikane fizične strani pa je še vedno mogoče izmenjati z grobo zrnatim mehanizmom za zaznavanje staranja.
Spremenjena je samo izvedba, da ohrani dvojno preslikavo senčnih strani dosledno. Tako je doseženo splošno izravnavanje obrabe, ki se zaveda staranja.
For more information:1950477648nn@gmail.com






