Виртуелна меморија
У рачунарству, виртуелна меморија је техника управљања меморијом која се имплементира користећи и хардвер и софтвер. Она мапира меморијске адресе које користи програм, називају се виртуелне адресе, у физичке адресе у меморији рачунара. Процеси или таскови главну меморију виде како непрекидни адресни простор или како колекцију непрекидних сегмената. Оперативни систем управља виртуелним адресним просторима и додељује стварну меморију виртуелној меморији. Адреса за превођење хардвера у ЦПУ, обично се помиње као јединица за управљање меморијом или ММУ, аутоматски преводи виртуелне адресе у физичке адресе. Софтвер у оквиру оперативног система може проширити ове могућности да обезбеди виртуелни адресни простор који може да премаши капацитет реалне меморије и тиме референцира више меморије него што је физички присутно у рачунару.
Примарне предности виртуелне меморије укључују ослобађање апликације од потребе да управљају дељеним меморијским простором, повећава безбедност због меморијске изолације, и у стању је да концептуално користи више меморије него што би то можда физички било доступно, користећи технику страничења.
Својства
[уреди | уреди извор]Виртуелна меморија омогућава програмирање апликација лакшим, кријући фрагментацију физичке меморије; препуштајући Кернелу терет управљања меморијском хијерархијом (елиминишући потребу да програм управља преклапањима); и, када је сваки процес покренут у сопственом наменском адресном простору, избегавајући потребу за релокацијом програмског кода или избегавајући потребу да приступи меморији са релативним адресирањем.
Меморијска виртуелизација се може сматрати генерализацијом концепта виртуелне меморије.
Употреба
[уреди | уреди извор]Виртуелна меморија је саставни део модерне архихектуре рачунара; имплементација захтева подршку хардвера, обично, у облику меморијске управљачке јединице која је уграђена у процесор. Док није неопходно, емулатори и виртуелна машина могу користити хардверску подршку за повећање перформанси својих виртуелних меморијских имплементација. Према томе, старији оперативни системи, као што су они за мејнфрејм рачунаре 60-их, и они за персоналне рачунаре од почетка до средине 1980-их (нпр. DOS (оперативни систем)), генерално нису имали функционалност виртуелне меморије, мада значајни изузеци за мејнфрејмове 1960-их обухватају:
- енгл. Atlas Supervisor за Атлас
- МЦП за енгл. Burroughs Corporation Б5000
- МТС, TSS/360 и CP/CMS за IBM System/360 Model 67
- енгл. Multics за GE 645
- енгл. Time Sharing Operating System за RCA Spectra 70/46
енгл. Apple Lisa је пример личног рачунара 1980-их који има виртуелну меморију.
Већина модерних оперативних система који подржавају виртуелну меморију такође покрећу сваки процес у свом наменском адресном простору. Сваки програм изгледа тако да има јединствени приступ виртуелној меморији. Међутим, неки старији оперативни системи (као што су OS/VS1 и OS/VS2 SVS, па чак и неки модернији (као што су IBM i) су оперативни системи који користе једно адресне просторе који покрећу све процесе у једном адресном простору састављеном од виртуелне меморије.
Уграђени системи други рачунарски системи са посебном сврхом који захтевају веома брзо и/или веома конзистентно време одзива могу се определити да не користе виртуелну меморију услед смањеног детерминизма; виртуелни меморијски системи активирају непредвидиве изузетке који могу произвести нежељене енгл. "jitter" током И/У операција. Имплементирајући све ове операције помоћу софтвера (техником која се назива енгл. bit-banging ) пре него са наменским хардвером, обезбеђује се да трошкови уграђеног хардвера буду мали.
Историја
[уреди | уреди извор]У 1940-им и 1950-им, све већи програми су морали да садрже логику за управљање примарном и секундарном меморијом, као што је преклапање. Виртуелна меморија је стога уведена не само да прошири примарну меморију, већ да такво проширење буде направљено што је могуће лакше програмерима да га користе.[1] Да омогући мултипрограмирање и мултитаскинг, многи рани системи деле меморију између вишеструких програма без виртуелне меморије, као што су рани модели PDP-10 преко регистра.
Концепт виртуелне меморије је прво развијен од стране немачког физичара Фриц-Рудолф-a Гунтсцх-а у нем. Technische Universität Berlin 1956. у својој докторској тези „Логички Дизајн Дигиталних Рачунара са Бишеструким Асихроним Ротирајућим Бубнјевима и Аутоматске Меморијске Операције Великих Брзина"; описује машину са 6 блокова од 100 речи примарног језгра меморије и адресни простор од 1000 блокова од 100 речи, са хардвером који аутоматски помера блокове између примарне меморије и секундарне бубањ меморијеенгл. Drum memory. Страничење је прво имплементирано на Универзитету у Манчестеру као начин да се прошири радна меморија Атлас рачунара енгл. Atlas Computer, комбинујући својих 16 хиљада речи примарног језгра меморије са додатних 96 хиљада речи секундарне бубањ меморије. Први Атлас је наручен 1962, али прототипови страничења који су радили развијени су 1959.[1][2][3] Године 1961,енгл. Burroughs Corporationје независно пустила први комерцијални рачунар са виртуелном меморијом, Б5000, са меморијском сегментацијом пре него са страничењем.[4][5]
Пре него што се вуртуелна меморија могла имплементирати у мејнстрим оперативне системе, многи проблеми су морали да се реше. Динамичко адресно превођење је захтевало специјални хардвер који је био скуп и тежак за имплементацију; почетне имплементације су благо успориле приступ меморији[1] Било је забринутости да ће нови системи-широких алгоритма који користе секундарну меморију бити мање ефикасни него раније коришћени алгоритами за специфичне апликације. Расправа око виртуелне меморије за комерцијалне рачунаре је завршена 1969.;[1] IBM истраживачки тим, предвођен Дејвидом Саиром, је показао да је њихов систем преклапачке виртуелне меморије константно ради боље него најбоље ручно контролисани системи.[6] Први мини рачунар који је увео виртуелну меморије је енгл. Norwegian NORD-1; током 1970-их, други мини рачунари имплементирају виртуелну меморију, посебно VAX који покреће VMS.
Виртуелна меморија је уведена у X86 архитектуру са заштићеним режимом Интел 80286 процесора, али његова техника замене сегмента скалира од слабих до већих сегментних величина. Интел 80386 уводи подршку страничења испод постојећег сегментног слоја, омогућавајући изузетке у ланцу грешке странице са другим изузецима без двоструке грешке. Међутим, учитавање сегментних дескриптора је скупа операција, изазивајући дизајнере оперативног система да се ослањају искључиво на страничење пре него на комбинацију страничења и сегментације.
Страничење виртуелне меморије
[уреди | уреди извор]Скоро све имплементације виртуелне меморије деле виртуелни адресни простор у странице, блокове непрекидних виртуелних меморијских адреса. Странице су обично најмање 4 Килобајта; системи са великим опсегом виртуелних адреса или великим количинама реалне меморије углавном користе веће величине страница.
Табеле страница
[уреди | уреди извор]Табеле страница се користе за превођење виртуелне адресе виђене од стране апликације у физичке адресе које користи хардвер на обради инструкције; такав хардвер који управља овим специфичним превођењен је често познат као memory management unit. Сваки унос у табелу страница има заставу која указује да ли је одговарајућа страница у реалној меморији или не. Ако је у реалној меморији, унос странице табела ће садржати стварну меморијску адресу на којој је страница ускладиштена (меморисана, сачувана). Када се говори о станици преко хардвера, ако унос табела станица за странице указује да то није тренутно у реалној меморији, хардвер подиже изузетак грешке странице, позивајући се на страничење надзорне компоненте оперативног система.
Системи могу имати једну страну табеле за цео систем, одвајајући табеле страница за сваку апликацију и сегмент, дрво странице табела за велике сегменте или неком комбинацијом ових. Ако постоји само једна страница табеле, различите апликације раде истовремено, користећи различите делове једног опсега виртуелних адреса. Ако постоји више страница или сегмента табела, постоји више виртуелног адресног простора и истовремених апликација са одвојеним табелама страница преусмереним на различите реалне адресе.
Контролор (супервизор) страничења
[уреди | уреди извор]Овај део оперативног система ствара и управља табелама страница. Ако хардвер поставља грешке изузетака страница, супервизор страничења приступа секундарном складиштењу, враћа страницу која има виртуелну адресу која је резултовала у грешку странице, ажурира табеле страница да би одржао физичку локацију виртуелне адресе и говори механизму за превођење да рестартује захтев.
Када је сва физичка меморија у употреби, супервизор страничења мора ослободити страницу у примарној меморији да би сваповање-у страницу било задржано. Супервизор користи једну од разних алгоритама за замену страница, као што је најмање недавно коришћен, да се одреди која страница треба да се ослободи.
Забодене (pinned) странице
[уреди | уреди извор]Оперативни системи имају меморијске области које су забодена (никад се не замењују на секундарну меморију). Остали термини који се употребљени су закључане, фиксне, или ожичене странице. На пример, прекидачки механизми се ослањају на низ показивача на њихове управљаче, као што су У/И завршеци и грешке страница. Ако странице садрже ове показиваче или је код који позивају слободан за странице, руковање прекидима ће постати далеко сложеније и дуготрајније, нарочито у случају грешке странице прекида. Дакле, неки део структура табеле страница није слободан (дозвољен) за странице.
Неке странице се могу закључати за кратак временски период, друге могу бити забодене за дужи временски период, а остали морају бити трајно забодени (закључани). На пример:
- Код супервизора страничења и драјвери за складиштење секундарних уређаје на које странице бораве морају бити трајно закључани, јер у супротном не би радило страничење, јер неопходни код неће бити на располагању.
- Временски-зависне компоненте могу бити забодене да би се избегло променљиво кашњење страничења.
- Бафери којима се директно приступа преко периферних уређаја који користе Директан приступ меморији или У/И канале, мора се налазити у забоденим страницама док је У/И операција у току, јер су уређаји и магистрала за које су везани очекују да пронађу податке бафера смештене на физичким меморијски адресама, без обзира на то да ли магистрала има меморијску јединицу за управљање У/И, трансфери се не могу зауставити ако дође до квара странице и онда се рестартује када се грешка странице обради.
У IBM-овим оперативним системима за System/370 и наследним системима, термин је „фиксна“, и странице могу бити фиксне дугорочно, или могу бити краткорочно. Контролне структуре су често фиксне дугорочно (мерено по сату, односно, време се мери у секундама, пре него да се мери у интервалима мањим од секунде), док су У/И бафери су обично фиксни краткорочно ( бично је мерење значајно мање него што је на сату, вероватно за неколико милисекунди ). Заиста, оперативни систем има посебан објекат за " брзо фиксирање " ових краткорочних фиксних бафера података (фиксирање које се врши без дуготрајног посезања за контолор позивних инструкција). Поред тога, оперативни систем има још једно постројење за конвертовање апликација од тога да буду дугорочно фиксиране, на то да буду фиксиране на неодређено време, могуће данима, месецима или чак годинама ( међутим, овај објекат имплицитно захтева да апликација прво буде свапована-из (swapped-out), евентуално из пожељне-меморије, или микс жељене и нежељене меморије, и друго да буде свапована-у (swapped-in) непожељну меморију где трајно борави, колико год то може бити, овај објекат користи документован контролор позива инструкција).
Multics користи термин „жичани“. OpenVMS и Microsoft Windows се односе на странице које су привремено напраљене као nonpageable (као за У/И бафере), користе термин „закључано“, или једноставно "nonpageable" за оне које никад нису доступне за странице.
Виртуелне-реалне операције
[уреди | уреди извор]У OS/VS1 и сличним оперативним системима, неки деловима система меморије се управља у виртуелно-реалном режиму“ где свака виртуелна адреса одговара истој реалној адреси, конкретно прекидачки механизми, супервизор страничења и табеле у старијим системима, и апликациони програми који користе нестандардно управљање У/И. На пример, IBM-ов z/OS има 3 мода (Виртуелан-виртуелан, виртуелан-реалан и виртуелан-фиксни).[7]
Thrashing
[уреди | уреди извор]Када се користи страничење и крађа странице, може се појавити проблем који се зове "thrashing", у којем рачунар троши у неодговарајуће велику количину времена преноса странице до и од бекап меморије, па успорава користан рад. Феномен је повезан са концептом радног сета који је минимални скуп страница које би требало да буду у меморији како би се остварио користан напредак у задатку. Thrashing јавља када нема довољно меморије за складиштење радних сетова свих активних програма. Додавање реалне меморије је најједноставније решење, али побољшање дизајна апликација, распоред, и употреба меморије може да помогне. Друго решење је да се смањи број активних задатака у систему. Ово смањује потрошњу реалне меморије сваповањем кроз цео радни скуп једног или више процеса.
Сегментирана виртуелна меморија
[уреди | уреди извор]Неки системи, као што је Burroughs Б5500[8], користе сегментацију уместо страничења, делећи виртуелни адресни простор у сегменте променљиве дужине. Виртуелни адреса овде састоји од низа сегмената и офсета унутар сегмента. Интел 80286 подржава сличну шему сегментације као опцију, али се ретко користи. Сегментација и страничење се може користити заједно тако што се дели сваки сегмент у странице; системи са оваквом меморијском структуром, као што су IBM Систем/38 и Мултикс, обично су странично-доминантни, сегментација пружа заштиту меморије.[9][10][11]
Intel 80386 и касније IA-32 процесори, сегменти се налазе у 32-bit линеарно, странични адресни простор. Сегменти се могу померати у и ван тог простора, странице тамо могу да "page" у и ван главне меморије, пружајући два нивоа виртуелне меморије, неколико уколико оперативни системи учини тако, уместо да користите само страничење. Раније, без хардверске помоћу решење x86 визуелизације комбинује страничење и сегментацију, зато што страничење x86 нуди само два домена заштите док је за VMM / guest OS / guest стек апликације потребно три[12]:22 Разлика између страничења и системске сегментације није само у дељењу меморије; сегментација је видљива корисничким процесима, као део меморије модела семантике. Дакле, уместо меморије која изгледа као један велики простор, она је структуирана у више простора.
Ова разлика има значајне последице, сегмент није страница са променљивом дужином или једноставан начин да се продужи адресни простор. Сегментација која може да обезбеди модел меморије са једним нивоом у којој не постоји разлика између меморије процеса и система датотека састављеног од листе сегмената (files) мапираних у процесе потенцијалног адресног простора.[13]
Ово није исто као механизми који су обезбеђени помоћу позива као mmap и Win32 MapViewOfFile, јер показивачи међу-датотека не раде приликом мапирања фајлова у полу-произвољна места. У Мултиксу, фајл (или сегмент више-сегментног фајла) је мапиран у сегмент у адресном простору, па су фајлови увек мапирани на сегментној граници. Повезивање секција датотека може садржати показиваче који покушавају да учитају показивач у регистар или да направе индиректно референцу кроз изазивање замке. Нерастворени показивач садржи индикацију имена сегмента које показивач показује и офсет у оквиру сегмента; руковалац за замку мапира сегмент у адресном простору, ставља број сегмента у показивач, мења ознаку поља у показивача тако да она више не изазива замку, и враћа код где се замка догодила, поново извршавајући инструкцију која је изазвала замку.[14]
Ово потпуно елиминише потребу за линкером[1] и ради када различити процеси мапирају исти фајл у различита места у својим приватним адресним просторима.[15]
Референце
[уреди | уреди извор]- ^ а б в г д Denning, Peter (1997). „Before Memory Was Virtual” (PDF). In the Beginning: Recollections of Software Pioneers. Архивирано из оригинала (PDF) 24. 2. 2012. г. Приступљено 11. 12. 2013.
- ^ 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.
- ^ „Atlas design includes virtual memory”. Архивирано из оригинала 28. 7. 2012. г. Приступљено 12. 12. 2013.
- ^ Ian Joyner on Burroughs B5000
- ^ Cragon 1996, стр. 113.
- ^ 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.
- ^ „z/OS Basic Skills Information Center: z/OS Concepts” (PDF). Архивирано из оригинала (PDF) 27. 04. 2006. г. Приступљено 12. 12. 2013.
- ^ Burroughs (1964). Burroughs B5500 Information Processing System Reference Manual (PDF). Burroughs Corporation. 1021326. Архивирано из оригинала (PDF) 29. 07. 2020. г. Приступљено 28. 11. 2013.
- ^ GE-645 System Manual (PDF). 1968. стр. 21—30. Архивирано из оригинала (PDF) 28. 11. 2007. г. Приступљено 13. 11. 2007.
- ^ Corbató, F. J.; Vyssotsky, V. A. „Introduction and Overview of the Multics System”. Приступљено 13. 11. 2007.
- ^ Glaser, Edward L.; Couleur, John F.; Oliver, G. A. „System Design of a Computer for Time Sharing Applications”. Непознати параметар
|name-list-style=
игнорисан (помоћ) - ^ J. E. Smith, R. Uhlig (August 14, 2005) Virtual Machines: Architectures, Implementations and Applications, HOTCHIPS 17, Tutorial 1, part 2
- ^ Bensoussan, André; Clingen, CharlesT.; Daley, Robert C. (мај 1972). „The Multics Virtual Memory: Concepts and Design”. Communications of the ACM. 15 (5): 308—318. S2CID 6434322. doi:10.1145/355602.361306.
- ^ „Multics Execution Environment”.
- ^ Organick 1972.
Литература
[уреди | уреди извор]- Cragon, Harvey G. (1996). Memory Systems and Pipelined Processors. Jones and Bartlett Publishers. стр. 113. ISBN 978-0-86720-474-2.
- Organick, Elliott I. (1972). The Multics System: An Examination of Its Structure. MIT Press. ISBN 978-0-262-15012-5.
- Hennessy, John L.; Patterson, David A. (1996). Computer Architecture, A Quantitative Approach. Morgan Kaufmann Publishers. ISBN 978-1-55860-724-8.
Спољашње везе
[уреди | уреди извор]- "Time-Sharing Supervisor Programs"[мртва веза] by Michael T. Alexander in Advanced Topics in Systems Programming, University of Michigan Engineering Summer Conference 1970 (revised May 1971), compares the scheduling and resource allocation approaches, including virtual memory and paging, used in four mainframe operating systems: CP-67, TSS/360, MTS, and Multics.
- LinuxMM: Linux Memory Management.
- Birth of Linux Kernel, mailing list discussion.
- „The Virtual-Memory Manager in Windows NT, Randy Kath, Microsoft Developer Network Technology Group, 12 December 1992”. Архивирано из оригинала 22. 6. 2010. г. Приступљено 12. 12. 2013.