Virtuelna memorija

S Vikipedije, slobodne enciklopedije
Virtuelna memorija kombinuje aktivni RAM i neaktivnu memoriju na DASD-u za formiranje velikog opsega neprekidnih adresa.

U računarstvu, virtuelna memorija je tehnika upravljanja memorijom koja se implementira koristeći i hardver i softver. Ona mapira memorijske adrese koje koristi program, nazivaju se virtuelne adrese, u fizičke adrese u memoriji računara. Procesi ili taskovi glavnu memoriju vide kako neprekidni adresni prostor ili kako kolekciju neprekidnih segmenata. Operativni sistem upravlja virtuelnim adresnim prostorima i dodeljuje stvarnu memoriju virtuelnoj memoriji. Adresa za prevođenje hardvera u CPU, obično se pominje kao jedinica za upravljanje memorijom ili MMU, automatski prevodi virtuelne adrese u fizičke adrese. Softver u okviru operativnog sistema može proširiti ove mogućnosti da obezbedi virtuelni adresni prostor koji može da premaši kapacitet realne memorije i time referencira više memorije nego što je fizički prisutno u računaru.

Primarne prednosti virtuelne memorije uključuju oslobađanje aplikacije od potrebe da upravljaju deljenim memorijskim prostorom, povećava bezbednost zbog memorijske izolacije, i u stanju je da konceptualno koristi više memorije nego što bi to možda fizički bilo dostupno, koristeći tehniku straničenja.

Svojstva[uredi | uredi izvor]

Virtuelna memorija omogućava programiranje aplikacija lakšim, krijući fragmentaciju fizičke memorije; prepuštajući Kernelu teret upravljanja memorijskom hijerarhijom (eliminišući potrebu da program upravlja preklapanjima); i, kada je svaki proces pokrenut u sopstvenom namenskom adresnom prostoru, izbegavajući potrebu za relokacijom programskog koda ili izbegavajući potrebu da pristupi memoriji sa relativnim adresiranjem.

Memorijska virtuelizacija se može smatrati generalizacijom koncepta virtuelne memorije.

Upotreba[uredi | uredi izvor]

Virtuelna memorija je sastavni deo moderne arhihekture računara; implementacija zahteva podršku hardvera, obično, u obliku memorijske upravljačke jedinice koja je ugrađena u procesor. Dok nije neophodno, emulatori i virtuelna mašina mogu koristiti hardversku podršku za povećanje performansi svojih virtuelnih memorijskih implementacija. Prema tome, stariji operativni sistemi, kao što su oni za mejnfrejm računare 60-ih, i oni za personalne računare od početka do sredine 1980-ih (npr. DOS (operativni sistem)), generalno nisu imali funkcionalnost virtuelne memorije, mada značajni izuzeci za mejnfrejmove 1960-ih obuhvataju:

engl. Apple Lisa je primer ličnog računara 1980-ih koji ima virtuelnu memoriju.

Većina modernih operativnih sistema koji podržavaju virtuelnu memoriju takođe pokreću svaki proces u svom namenskom adresnom prostoru. Svaki program izgleda tako da ima jedinstveni pristup virtuelnoj memoriji. Međutim, neki stariji operativni sistemi (kao što su OS/VS1 i OS/VS2 SVS, pa čak i neki moderniji (kao što su IBM i) su operativni sistemi koji koriste jedno adresne prostore koji pokreću sve procese u jednom adresnom prostoru sastavljenom od virtuelne memorije.

Ugrađeni sistemi drugi računarski sistemi sa posebnom svrhom koji zahtevaju veoma brzo i/ili veoma konzistentno vreme odziva mogu se opredeliti da ne koriste virtuelnu memoriju usled smanjenog determinizma; virtuelni memorijski sistemi aktiviraju nepredvidive izuzetke koji mogu proizvesti neželjene engl. "jitter" tokom I/U operacija. Implementirajući sve ove operacije pomoću softvera (tehnikom koja se naziva engl. bit-banging ) pre nego sa namenskim hardverom, obezbeđuje se da troškovi ugrađenog hardvera budu mali.

Istorija[uredi | uredi izvor]

U 1940-im i 1950-im, sve veći programi su morali da sadrže logiku za upravljanje primarnom i sekundarnom memorijom, kao što je preklapanje. Virtuelna memorija je stoga uvedena ne samo da proširi primarnu memoriju, već da takvo proširenje bude napravljeno što je moguće lakše programerima da ga koriste.[1] Da omogući multiprogramiranje i multitasking, mnogi rani sistemi dele memoriju između višestrukih programa bez virtuelne memorije, kao što su rani modeli PDP-10 preko registra.

Koncept virtuelne memorije je prvo razvijen od strane nemačkog fizičara Fric-Rudolf-a Guntsch-a u nem. Technische Universität Berlin 1956. u svojoj doktorskoj tezi „Logički Dizajn Digitalnih Računara sa Bišestrukim Asihronim Rotirajućim Bubnjevima i Automatske Memorijske Operacije Velikih Brzina"; opisuje mašinu sa 6 blokova od 100 reči primarnog jezgra memorije i adresni prostor od 1000 blokova od 100 reči, sa hardverom koji automatski pomera blokove između primarne memorije i sekundarne bubanj memorijeengl. Drum memory. Straničenje je prvo implementirano na Univerzitetu u Mančesteru kao način da se proširi radna memorija Atlas računara engl. Atlas Computer, kombinujući svojih 16 hiljada reči primarnog jezgra memorije sa dodatnih 96 hiljada reči sekundarne bubanj memorije. Prvi Atlas je naručen 1962, ali prototipovi straničenja koji su radili razvijeni su 1959.[1][2][3] Godine 1961,engl. Burroughs Corporationje nezavisno pustila prvi komercijalni računar sa virtuelnom memorijom, B5000, sa memorijskom segmentacijom pre nego sa straničenjem.[4][5]

Pre nego što se vurtuelna memorija mogla implementirati u mejnstrim operativne sisteme, mnogi problemi su morali da se reše. Dinamičko adresno prevođenje je zahtevalo specijalni hardver koji je bio skup i težak za implementaciju; početne implementacije su blago usporile pristup memoriji [1] Bilo je zabrinutosti da će novi sistemi-širokih algoritma koji koriste sekundarnu memoriju biti manje efikasni nego ranije korišćeni algoritami za specifične aplikacije. Rasprava oko virtuelne memorije za komercijalne računare je završena 1969.;[1] IBM istraživački tim, predvođen Dejvidom Sairom, je pokazao da je njihov sistem preklapačke virtuelne memorije konstantno radi bolje nego najbolje ručno kontrolisani sistemi.[6] Prvi mini računar koji je uveo virtuelnu memorije je engl. Norwegian NORD-1; tokom 1970-ih, drugi mini računari implementiraju virtuelnu memoriju, posebno VAX koji pokreće VMS.

Virtuelna memorija je uvedena u X86 arhitekturu sa zaštićenim režimom Intel 80286 procesora, ali njegova tehnika zamene segmenta skalira od slabih do većih segmentnih veličina. Intel 80386 uvodi podršku straničenja ispod postojećeg segmentnog sloja, omogućavajući izuzetke u lancu greške stranice sa drugim izuzecima bez dvostruke greške. Međutim, učitavanje segmentnih deskriptora je skupa operacija, izazivajući dizajnere operativnog sistema da se oslanjaju isključivo na straničenje pre nego na kombinaciju straničenja i segmentacije.

Straničenje virtuelne memorije[uredi | uredi izvor]

Skoro sve implementacije virtuelne memorije dele virtuelni adresni prostor u stranice, blokove neprekidnih virtuelnih memorijskih adresa. Stranice su obično najmanje 4 Kilobajta; sistemi sa velikim opsegom virtuelnih adresa ili velikim količinama realne memorije uglavnom koriste veće veličine stranica.

Tabele stranica[uredi | uredi izvor]

Tabele stranica se koriste za prevođenje virtuelne adrese viđene od strane aplikacije u fizičke adrese koje koristi hardver na obradi instrukcije; takav hardver koji upravlja ovim specifičnim prevođenjen je često poznat kao memory management unit. Svaki unos u tabelu stranica ima zastavu koja ukazuje da li je odgovarajuća stranica u realnoj memoriji ili ne. Ako je u realnoj memoriji, unos stranice tabela će sadržati stvarnu memorijsku adresu na kojoj je stranica uskladištena (memorisana, sačuvana). Kada se govori o stanici preko hardvera, ako unos tabela stanica za stranice ukazuje da to nije trenutno u realnoj memoriji, hardver podiže izuzetak greške stranice, pozivajući se na straničenje nadzorne komponente operativnog sistema.

Sistemi mogu imati jednu stranu tabele za ceo sistem, odvajajući tabele stranica za svaku aplikaciju i segment, drvo stranice tabela za velike segmente ili nekom kombinacijom ovih. Ako postoji samo jedna stranica tabele, različite aplikacije rade istovremeno, koristeći različite delove jednog opsega virtuelnih adresa. Ako postoji više stranica ili segmenta tabela, postoji više virtuelnog adresnog prostora i istovremenih aplikacija sa odvojenim tabelama stranica preusmerenim na različite realne adrese.

Kontrolor (supervizor) straničenja[uredi | uredi izvor]

Ovaj deo operativnog sistema stvara i upravlja tabelama stranica. Ako hardver postavlja greške izuzetaka stranica, supervizor straničenja pristupa sekundarnom skladištenju, vraća stranicu koja ima virtuelnu adresu koja je rezultovala u grešku stranice, ažurira tabele stranica da bi održao fizičku lokaciju virtuelne adrese i govori mehanizmu za prevođenje da restartuje zahtev.

Kada je sva fizička memorija u upotrebi, supervizor straničenja mora osloboditi stranicu u primarnoj memoriji da bi svapovanje-u stranicu bilo zadržano. Supervizor koristi jednu od raznih algoritama za zamenu stranica, kao što je najmanje nedavno korišćen, da se odredi koja stranica treba da se oslobodi.

Zabodene (pinned) stranice[uredi | uredi izvor]

Operativni sistemi imaju memorijske oblasti koje su zabodena (nikad se ne zamenjuju na sekundarnu memoriju). Ostali termini koji se upotrebljeni su zaključane, fiksne, ili ožičene stranice. Na primer, prekidački mehanizmi se oslanjaju na niz pokazivača na njihove upravljače, kao što su U/I završeci i greške stranica. Ako stranice sadrže ove pokazivače ili je kod koji pozivaju slobodan za stranice, rukovanje prekidima će postati daleko složenije i dugotrajnije, naročito u slučaju greške stranice prekida. Dakle, neki deo struktura tabele stranica nije slobodan (dozvoljen) za stranice.

Neke stranice se mogu zaključati za kratak vremenski period, druge mogu biti zabodene za duži vremenski period, a ostali moraju biti trajno zabodeni (zaključani). Na primer:

  • Kod supervizora straničenja i drajveri za skladištenje sekundarnih uređaje na koje stranice borave moraju biti trajno zaključani, jer u suprotnom ne bi radilo straničenje, jer neophodni kod neće biti na raspolaganju.
  • Vremenski-zavisne komponente mogu biti zabodene da bi se izbeglo promenljivo kašnjenje straničenja.
  • Baferi kojima se direktno pristupa preko perifernih uređaja koji koriste Direktan pristup memoriji ili U/I kanale, mora se nalaziti u zabodenim stranicama dok je U/I operacija u toku, jer su uređaji i magistrala za koje su vezani očekuju da pronađu podatke bafera smeštene na fizičkim memorijski adresama, bez obzira na to da li magistrala ima memorijsku jedinicu za upravljanje U/I, transferi se ne mogu zaustaviti ako dođe do kvara stranice i onda se restartuje kada se greška stranice obradi.

U IBM-ovim operativnim sistemima za System/370 i naslednim sistemima, termin je „fiksna“, i stranice mogu biti fiksne dugoročno, ili mogu biti kratkoročno. Kontrolne strukture su često fiksne dugoročno (mereno po satu, odnosno, vreme se meri u sekundama, pre nego da se meri u intervalima manjim od sekunde), dok su U/I baferi su obično fiksni kratkoročno ( bično je merenje značajno manje nego što je na satu, verovatno za nekoliko milisekundi ). Zaista, operativni sistem ima poseban objekat za " brzo fiksiranje " ovih kratkoročnih fiksnih bafera podataka (fiksiranje koje se vrši bez dugotrajnog posezanja za kontolor pozivnih instrukcija). Pored toga, operativni sistem ima još jedno postrojenje za konvertovanje aplikacija od toga da budu dugoročno fiksirane, na to da budu fiksirane na neodređeno vreme, moguće danima, mesecima ili čak godinama ( međutim, ovaj objekat implicitno zahteva da aplikacija prvo bude svapovana-iz (swapped-out), eventualno iz poželjne-memorije, ili miks željene i neželjene memorije, i drugo da bude svapovana-u (swapped-in) nepoželjnu memoriju gde trajno boravi, koliko god to može biti, ovaj objekat koristi dokumentovan kontrolor poziva instrukcija).

Multics koristi termin „žičani“. OpenVMS i Microsoft Windows se odnose na stranice koje su privremeno napraljene kao nonpageable (kao za U/I bafere), koriste termin „zaključano“, ili jednostavno "nonpageable" za one koje nikad nisu dostupne za stranice.

Virtuelne-realne operacije[uredi | uredi izvor]

U OS/VS1 i sličnim operativnim sistemima, neki delovima sistema memorije se upravlja u virtuelno-realnom režimu“ gde svaka virtuelna adresa odgovara istoj realnoj adresi, konkretno prekidački mehanizmi, supervizor straničenja i tabele u starijim sistemima, i aplikacioni programi koji koriste nestandardno upravljanje U/I. Na primer, IBM-ov z/OS ima 3 moda (Virtuelan-virtuelan, virtuelan-realan i virtuelan-fiksni).[7]

Thrashing[uredi | uredi izvor]

Kada se koristi straničenje i krađa stranice, može se pojaviti problem koji se zove "thrashing", u kojem računar troši u neodgovarajuće veliku količinu vremena prenosa stranice do i od bekap memorije, pa usporava koristan rad. Fenomen je povezan sa konceptom radnog seta koji je minimalni skup stranica koje bi trebalo da budu u memoriji kako bi se ostvario koristan napredak u zadatku. Thrashing javlja kada nema dovoljno memorije za skladištenje radnih setova svih aktivnih programa. Dodavanje realne memorije je najjednostavnije rešenje, ali poboljšanje dizajna aplikacija, raspored, i upotreba memorije može da pomogne. Drugo rešenje je da se smanji broj aktivnih zadataka u sistemu. Ovo smanjuje potrošnju realne memorije svapovanjem kroz ceo radni skup jednog ili više procesa.

Segmentirana virtuelna memorija[uredi | uredi izvor]

Neki sistemi, kao što je Burroughs B5500[8], koriste segmentaciju umesto straničenja, deleći virtuelni adresni prostor u segmente promenljive dužine. Virtuelni adresa ovde sastoji od niza segmenata i ofseta unutar segmenta. Intel 80286 podržava sličnu šemu segmentacije kao opciju, ali se retko koristi. Segmentacija i straničenje se može koristiti zajedno tako što se deli svaki segment u stranice; sistemi sa ovakvom memorijskom strukturom, kao što su IBM Sistem/38 i Multiks, obično su stranično-dominantni, segmentacija pruža zaštitu memorije.[9][10][11]

Intel 80386 i kasnije IA-32 procesori, segmenti se nalaze u 32-bit linearno, stranični adresni prostor. Segmenti se mogu pomerati u i van tog prostora, stranice tamo mogu da "page" u i van glavne memorije, pružajući dva nivoa virtuelne memorije, nekoliko ukoliko operativni sistemi učini tako, umesto da koristite samo straničenje. Ranije, bez hardverske pomoću rešenje x86 vizuelizacije kombinuje straničenje i segmentaciju, zato što straničenje x86 nudi samo dva domena zaštite dok je za VMM / guest OS / guest stek aplikacije potrebno tri [12]:22 Razlika između straničenja i sistemske segmentacije nije samo u deljenju memorije; segmentacija je vidljiva korisničkim procesima, kao deo memorije modela semantike. Dakle, umesto memorije koja izgleda kao jedan veliki prostor, ona je struktuirana u više prostora.

Ova razlika ima značajne posledice, segment nije stranica sa promenljivom dužinom ili jednostavan način da se produži adresni prostor. Segmentacija koja može da obezbedi model memorije sa jednim nivoom u kojoj ne postoji razlika između memorije procesa i sistema datoteka sastavljenog od liste segmenata (files) mapiranih u procese potencijalnog adresnog prostora.[13]

Ovo nije isto kao mehanizmi koji su obezbeđeni pomoću poziva kao mmap i Win32 MapViewOfFile, jer pokazivači među-datoteka ne rade prilikom mapiranja fajlova u polu-proizvoljna mesta. U Multiksu, fajl (ili segment više-segmentnog fajla) je mapiran u segment u adresnom prostoru, pa su fajlovi uvek mapirani na segmentnoj granici. Povezivanje sekcija datoteka može sadržati pokazivače koji pokušavaju da učitaju pokazivač u registar ili da naprave indirektno referencu kroz izazivanje zamke. Nerastvoreni pokazivač sadrži indikaciju imena segmenta koje pokazivač pokazuje i ofset u okviru segmenta; rukovalac za zamku mapira segment u adresnom prostoru, stavlja broj segmenta u pokazivač, menja oznaku polja u pokazivača tako da ona više ne izaziva zamku, i vraća kod gde se zamka dogodila, ponovo izvršavajući instrukciju koja je izazvala zamku.[14]

Ovo potpuno eliminiše potrebu za linkerom[1] i radi kada različiti procesi mapiraju isti fajl u različita mesta u svojim privatnim adresnim prostorima.[15]

Reference[uredi | uredi izvor]

  1. ^ a b v g d Denning, Peter (1997). „Before Memory Was Virtual” (PDF). In the Beginning: Recollections of Software Pioneers. Arhivirano iz originala (PDF) 24. 2. 2012. g. Pristupljeno 11. 12. 2013. 
  2. ^ Creasy, R. J. (1981). „The Origin of the VM/370 Time-Sharing System” (PDF). IBM Journal of Research and Development. 25 (5): 483—490. doi:10.1147/rd.255.0483. 
  3. ^ „Atlas design includes virtual memory”. Arhivirano iz originala 28. 7. 2012. g. Pristupljeno 12. 12. 2013. 
  4. ^ Ian Joyner on Burroughs B5000
  5. ^ Cragon 1996, str. 113.
  6. ^ Sayre, D. (1969). „Is automatic "folding" of programs efficient enough to displace manual?”. Communications of the ACM. 12 (12): 656—660. S2CID 15655353. doi:10.1145/363626.363629. 
  7. ^ „z/OS Basic Skills Information Center: z/OS Concepts” (PDF). Arhivirano iz originala (PDF) 27. 04. 2006. g. Pristupljeno 12. 12. 2013. 
  8. ^ Burroughs (1964). Burroughs B5500 Information Processing System Reference Manual (PDF). Burroughs Corporation. 1021326. Arhivirano iz originala (PDF) 29. 07. 2020. g. Pristupljeno 28. 11. 2013. 
  9. ^ GE-645 System Manual (PDF). 1968. str. 21—30. Arhivirano iz originala (PDF) 28. 11. 2007. g. Pristupljeno 13. 11. 2007. 
  10. ^ Corbató, F. J.; Vyssotsky, V. A. „Introduction and Overview of the Multics System”. Pristupljeno 13. 11. 2007. 
  11. ^ Glaser, Edward L.; Couleur, John F.; Oliver, G. A. „System Design of a Computer for Time Sharing Applications”.  Nepoznati parametar |name-list-style= ignorisan (pomoć)
  12. ^ J. E. Smith, R. Uhlig (August 14, 2005) Virtual Machines: Architectures, Implementations and Applications, HOTCHIPS 17, Tutorial 1, part 2
  13. ^ Bensoussan, André; Clingen, CharlesT.; Daley, Robert C. (maj 1972). „The Multics Virtual Memory: Concepts and Design”. Communications of the ACM. 15 (5): 308—318. S2CID 6434322. doi:10.1145/355602.361306. 
  14. ^ „Multics Execution Environment”. 
  15. ^ Organick 1972.

Literatura[uredi | uredi izvor]

Spoljašnje veze[uredi | uredi izvor]