Віртуальная памяць

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі
Перайсьці да: навігацыі, пошуку

Віртуа́льная па́мяць — гэта схема арганізацыі памяці кампутара, пры якой праграмнае забесьпячэньне ўяўляе адраснаю прастору кампутара бесьперапыннай і аднастайнай.

Гісторыя стварэньня[рэдагаваць | рэдагаваць крыніцу]

У першых кампутарах памяць была вельмі малая па аб’ёме і да таго ж каштавала вельмі дорага. Адзін з самых быстрадзейных кампутару таго часу — IBM-650 (канец 50-х гадоў), утрымоўваў усяго 2000 слоў памяці. Адзін з першых кампілятараў ALGOL быў напісаны для кампутара з аб’ёмам памяці ўсяго 1024 словы. Старажытная сыстэма з падзелам часу выдатна працавала на кампутары PDP-1, агульны аб’ём памяці якога складаў усяго 4096 18-разрадных слоў для апэрацыйнай сыстэмы і праграм карыстальніка. У тыя часы праграмісты марнавалі вельмі шмат часу, спрабуючы зьмясьціць свае праграмы ў малюсенькую памяць. Часта прыходзілася выкарыстаць маруднейшыя альгарытмы толькі таму, што хутчэйшыя не атрымоўвалася разьмясьціць у памяці кампутара.

У 1961 годзе група дасьледнікаў з Манчэстэра (Ангельшчына) прапанавала мэтад аўтаматычнага выкананьня працэсу накладаньня розных частак памяці, пры якім праграміст мог наогул не думаць аб гэтым працэсе.[1] Гэты мэтад, у аснове якога, як цяпер кажуць, ляжыць выкарыстаньне віртуальнай памяці, меў відавочную перавагу, паколькі вызваляў праграміста ад масы нуднай працы. Упершыню гэты мэтад быў ужыты ў шэрагу кампутараў, выпушчаных у 60-я гады. Да пачатку 70-х гадоў віртуальная памяць была рэалізаваная ў большасьці кампутараў. У цяперашні час нават кампутары на адной мікрасхеме, у тым ліку Pentium 4 і UltraSPARC III, маюць вельмі складаныя сыстэмы віртуальнай памяці.

Старонкавая арганізацыя памяці[рэдагаваць | рэдагаваць крыніцу]

Згодна з канцэпцыяй віртуальнай памяці, уся фізычная і віртуальная памяць кампутара разьбіваецца на роўныя часткі, якія завуцца старонкі. Дзякуючы наяўнасьці віртуальная памяці, фізычная памяць і яе абмежаваньне перастаюць быць перашкодаю для праграміста.

Праграмы пішуцца так, быццам у апэратыўнай памяці хапае месцы для размяшчэньня ўсёй віртуальнай адраснай прасторы, нават калі гэта не адпавядае рэчаіснасьці. Праграмы могуць загружаць словы з віртуальнай адраснай прасторы або запісваць словы ў віртуальную адрасную прастору, нягледзячы на тое, што на самай справе фізычнай памяці для гэтага можа не хапіць. Праграміст можа пісаць праграмы, нават не ўсьведамляючы, што існуе віртуальная памяць. Проста ствараецца такое ўражаньне, што аб’ём памяці дадзенага кампутара досыць вялікі.

Віртуальнай памяці патрабуецца фізычная памяць для захоўваньня ўсёй праграмы і ўсіх дадзеных. Копію праграмы, якая захоўваецца ў фізычнай памяці, зручней разглядаць як арыгінал, а фрагмэнты, якія запісваюцца ў апэратыўную памяць, — як копіі. Натуральна, арыгінал у такім разе павінен аператыўна абнаўляцца. Калі зьмены ўносяцца ў копію праграмы ў апэратыўнай памяці, яны ў канчатковым выніку павінны быць адлюстраваныя ў арыгінале.

Віртуальная адрасная прастора разьбіваецца на шэраг старонак роўнага памеру, звычайна ад 512 байт да 64 Кбайт, хоць часам сустракаюцца старонкі па 4 Мбайт. Памер старонкі заўсёды павінен быць ступеньню двойкі. Фізычная адрасная прастора таксама разьбіваецца на часткі роўнага памеру такім чынам, каб кожная такая частка апэратыўнай памяці зьмяшчала роўна адну старонку. Гэтыя часткі апэратыўнай памяці завуцца старонкавымі кадрамі[2].

Выклік старонак па патрабаваньні і працоўнае мноства[рэдагаваць | рэдагаваць крыніцу]

Віртуальная старонка, да якой адбываецца зварот, не заўжды знаходзіцца ў апэратыўнай памяці, паколькі ў апэратыўнай памяці нядосыць месца для ўсіх віртуальных старонак. Пры звароце да адрасу старонкі, якой няма ў апэратыўнай памяці, адбываецца памылка адсутнасьці старонкі. У выпадку такой памылкі апэрацыйная сыстэма павінна лічыць патрэбную старонку з дыска, увесьці новы адрас фізычнай памяці ў табліцу старонак, а затым паўтарыць каманду, якая выклікала памылку.

Такі мэтад працы з віртуальнай памяцьцю завецца выклікам старонак па патрабаваньні (demand paging). Такі выклік старонак нагадвае кармленьне немаўля па патрабаваньні (у супрацьлегласьць кармленьню па раскладзе): калі немаўля крычыць, вы яго корміце. Пры выкліку старонак па патрабаваньні старонкі пераносяцца ў апэратыўную памяць толькі ў выпадку неабходнасьці, але не раней.

Альтэрнатыўны падыход заснаваны на назіраньні, што шматлікія праграмы зьвяртаюцца да адраснай прасторы нераўнамерна. Звычайна большасьць зваротаў адносяцца да невялікай колькасьці старонак. Гэта завецца прынцыпам лякальнасьці. Пры звароце да памяці можна выклікаць каманду, выклікаць дадзеныя або захаваць дадзеныя. У кожны момант часу існуе набор старонак, якія выкарыстоўваліся пры апошніх зваротах. Вось гэты набор старонак і завецца працоўным мноствам.

Недахопы[рэдагаваць | рэдагаваць крыніцу]

Фрагмэнтацыя памяці[рэдагаваць | рэдагаваць крыніцу]

У выніку разьбіцьця памяці на старонкі ўзнікае праблема фрагмэнтацыі памяці. Некаторая праграма, якая выкарыстоўвае n старонак, можа не выкарыстаць усю прастору памяці, у выніку чаго на апошняй n-ай старонцы ўзьнікне пустая прастора.

Для зьмяншэньня эфэкту фрагмэнтацыі рапрацаваны шэраг альгарытмаў.

Калі памер старонкі складае n байт, то сярэдняя невыкарыстаная прастора апошняй старонкі праграмы будзе роўна n/2 байт. Такім чынам, каб зьвесьці да мінімуму аб’ем бескарыснай прасторы, старонкі павінны быць невялікімі. Аднак пры маленькіх старонках патрабуецца шмат старонак і вялікая табліца старонак. Калі табліца старонак захоўваецца апаратна, то для захоўваньня вялікай табліцы старонак трэба шмат рэгістраў, што падвышае кошт кампутара. Акрамя таго, пры праграмы на загрузку і захаваньне гэтых рэгістраў спатрэбіцца больш часу.

Бясьпека[рэдагаваць | рэдагаваць крыніцу]

Істотнай праблемай зьяўляецца неабходнасьць вырашыць: якім праграмам можна дазволіць доступ да пэўных старонак, а якім — не. Для гэтага выкарыстоўваюцца розныя падыходы, у тым ліку сыстэма бясьпекі PL ад карпарацыі Intel.

Палітыка замяшчэньня старонак[рэдагаваць | рэдагаваць крыніцу]

У некаторых выпадках віртуальнай памяці можа проста не хапіць. У такім выпадку непатрэбныя старонкі мусяць выдаляцца і замяняцца на неабходныя цякучым задачам. Для вырашэньня гэтай прабелемы існуюць некалькі альгарытмаў:

  1. LRU (Least Recently Used — найбольш даўна не выкарыстоўваўся);
  2. FIFO (First-in First-out — першым увайшоў — першым сыйшоў).


Сэгмэнтацыя[рэдагаваць | рэдагаваць крыніцу]

Сэгмэнтацыя — мноства незалежных адрасных прастораў. Гэта больш глыбокі падыход да выкарыстаньня віртуальнай памяці.

Кожны сэгмэнт складаецца з лінейнай пасьлядоўнасьці адрасоў ад 0 да які-небудзь дапушчальнага максымуму. Розныя сэгмэнты могуць мець розную даўжыню (звычайна так і бывае). Больш таго, даўжыня сэгмэнта можа зьмяняцца падчас выкананьня праграмы. Даўжыня стэкавага сэгмэнта можа павялічвацца кожны раз, калі штосьці зьмяшчаецца ў стэк, і памяншацца, калі штосьці выштурхваецца са стэка.

Рэалізацыя сэгмэнтацыі[рэдагаваць | рэдагаваць крыніцу]

Рэалізаваць разьбіеньне адзінай адраснай прасторы на нейкае мноства можна з дапамогаю старонкавай арганізацыі ці зьнешняй фрагмэнтацыі.

Зьнешняя фрагмэнтацыя дазваляе сьціскаць сэгмэнты, вызваляючы путоты для новых сэгмэнтаў. Таксама можна выкарыстаць альгарытм аптымальнай падгонкі, які шукае найменшыя пустоты ў прасторы адрэсаў і разьмяшчае ў іх найменшыя сэгмэнты.

Старонкавая арганізацыя ўпершыню была распрацаваная для сыстэмы MULTICS (Multiplexed Information and Computing Service) і патрабуе наяўнасьці табліцы дэскрыптараў, каталёга старонак і канкрэтнай старонкі. Дэскрыптар спасылаўся на табліцу старонак, што дазваляла разьбіваць на старонкі кожны сэгмэнт звычайным спосабам.

Падобную схему выкарыстаўвае працэсары Intel пачынаючы з 386, у тым ліку і віртуальная памяць працэсара Pentium IV.

Крыніцы[рэдагаваць | рэдагаваць крыніцу]

  1. ^ Fotheringham, J. «Dynamic Storage Allocation in the Atlas Computer Including an Automatic Use of a Backing Store», Commun. of the ACM, vol. 4, pp. 435—436, Oct. 1961.
  2. ^ Эндру Танэнбаўм. Архітэктура кампутара. 5-е выданьне. Санкт-Пецярбург 2007.