Кіріспе

Компьютерлік жадыны басқару әдісі
Компьютерлік жадыны басқару әдісі

Компьютерлік есептемелерде, виртуалды жад немесе виртуалды сақтау – бұл жадыны басқару әдісі, ол "берілген машинада нақты қолжетімді сақтау ресурстарының идеалданған абстракциясын" ұсынады, бұл "пайдаланушыларға өте үлкен (негізгі) жадтың иллюзиясын тудырады". Компьютердің операциялық жүйесі, аппараттық және бағдарламалық қамтамасыз етудің үйлесімі арқылы, бағдарлама қолданатын жад мекенжайларын, яғни виртуалды мекенжайларды, компьютер жадындағы нақты мекенжайларға түрлендіреді. Процесс немесе тапсырма көзқарасынан, негізгі сақтау үзділіссіз адрестік кеңістік немесе үзділіссіз сегменттер жиынтығы ретінде көрінеді. Операциялық жүйе виртуалды адрестік кеңістіктерді және виртуалды жадқа нақты жадты тағайындауды басқарады. Процессордағы (CPU) адресті аудару аппараттық құрылғысы, көбінесе жад басқару блогы (MMU) деп аталады, виртуалды мекенжайларды автоматты түрде физикалық мекенжайларға түрлендіреді. Операциялық жүйедегі бағдарламалық қамтамасыз ету осы мүмкіндіктерді кеңейте алады, мысалы, дискідегі сақтауды пайдаланып, нақты жадтың сыйымдылығынан асып түсетін виртуалды адрестік кеңістікті қамтамасыз ету үшін, соның арқасында компьютерде физикалық түрде бар жадтан көбірек жадқа сілтеме жасауға болады. Виртуалды жадтың негізгі артықшылықтарына ортақ жад кеңістігін басқарудан босатылу, процестер арасында кітапханалар пайдаланатын жадты бөлісу мүмкіндігі, жад оқшаулауының арқасында қауіпсіздікті арттыру және беттеу немесе сегменттеу әдісін қолдана отырып, физикалық түрде қолжетімді жадтан артық жадыны тұжырымдамалық түрде пайдалану мүмкіндігі кіреді.

Қасиеттері

Виртуалды жад физикалық жадтың фрагментациясын жасырып, қолданбалы бағдарламалауды жеңілдетеді; жад иерархиясын басқару міндетін ядроға жүктеу арқылы (бағдарламаның қабаттастыруды тікелей басқару қажеттілігін жою); және әрбір процесс өз жеке адрестік кеңістігінде іске қосылғанда, бағдарламалық кодты жылжытуға немесе жадқа салыстырмалы адрестеу арқылы қол жеткізуге қажеттілікті жояды. Жадты виртуализациялау виртуалды жад тұжырымдамасының кеңейтілген түрі деп қарастырылуы мүмкін.

Тарих

1950 жылдары барлық үлкен бағдарламаларда негізгі және қосымша жадты басқару логикасы болуы қажет болды, мысалы, жабысқақтау. Сондықтан виртуалды жад тек негізгі жадты кеңейту үшін ғана емес, сонымен қатар мұндай кеңейтуді бағдарламашылар үшін мүмкіндігінше оңай пайдалану үшін енгізілді. Көп бағдарламалау және көп тапсырмалы жұмыс істеу үшін көптеген алғашқы жүйелер жадты виртуалды жадсыз бірнеше бағдарламалар арасында бөлді, мысалы, PDP 10-ның алғашқы үлгілері тіркелімдер арқылы. Виртуалды жад тұжырымдамасын алғаш рет неміс физигі Фриц Рудольф Гюнтч 1956 жылы Берлин техникалық университетіндегі докторлық диссертациясында, «Көптеген асинхронды айналмалы барабандары бар цифрлық компьютердің логикалық дизайны және автоматты жоғары жылдамдықты жад операциясы» деген тақырыпта жазған еңбегі мұқият тексеруге төтеп бере алмайды. Гюнтч ұсынған (бірақ ешқашан құрылмаған) компьютерде 105 сөзден тұратын адрестік кеңістік болды, ол барабандардың 105 сөзіне дәл сәйкес келді, яғни адрестер нақты адрестер болды және жанама бейнелеудің ешқандай түрі болмады, бұл виртуалды жадтың маңызды ерекшелігі. Гюнтч кеш жадтың бір түрін ойлап тапты, өйткені оның жоғары жылдамдықты жады барабандардан алынған код блоктарының немесе деректердің көшірмесін сақтауға арналған еді. Ол былай деп жазды (аудармада келтірілгендей): «Бағдарламашы негізгі жадтың бар екендігін ескеруге міндетті емес (оны бар екенін білуге де қажеті жоқ), өйткені бағдарламалауға болатын бір ғана мекенжай бар, бір ғана сақтау орны бар сияқты». Бұл дәл кеш жады бар компьютерлердегі жағдай, оның ең алғашқы коммерциялық мысалы IBM System/360 Model 85 болды. 85-үлгідегі барлық мекенжайлар негізгі жадқа сілтеме жасайтын нақты мекенжайлар болды. Пайдаланушы үшін көрінбейтін жартылай өткізгіш кеш-жад, қазіргі уақытта орындалып жатқан бағдарлама қолданатын негізгі жадтың бөліктерінің мазмұнын сақтады. Бұл Гюнтчтың жүйесіне ұқсас, ол көп бағдарламалаумен байланысты проблемаларды шешуге емес, өнімділікті арттыру құралы ретінде жасалған. Алғашқы нағыз виртуалды жад жүйесі Манчестер университетінде Atlas компьютерінің бір бөлігі ретінде бір деңгейлі жад жүйесін құру үшін іске асырылды. Ол бағдарламалаушыға қол жетімді виртуалды мекенжайларды нақты жадқа бейнелеу үшін беттеу механизмін қолданды, ол негізгі жадтың 16 384 сөзінен және қосымша барабан жадының 98 304 сөзінен тұрады. Atlas-қа виртуалды жадты қосу бағдарламалау мәселесін де жойды: негізгі және қосымша жад арасындағы деректерді жоспарлау және жоспарлау және негізгі жадтың көлемі әр өзгеретін сайын бағдарламаларды қайта құрастыру. Алғашқы Atlas 1962 жылы іске қосылды, бірақ 1959 жылға қарай беттеудің жұмыс прототиптері жасалды. 1961 жылы Burroughs Corporation виртуалды жады бар алғашқы коммерциялық компьютерді, B5000-ді, беттеу емес, сегментациямен шығарды. IBM CP 40 және CP 67 бағдарламаларында гипервизорлар тұжырымдамасын әзірледі, ал 1972 жылы оны S/370 үшін Virtual Machine Facility/370 ретінде ұсынды. IBM 3081 және VM/XA нұсқаларында 370 XA-ның бір бөлігі ретінде Start Interpretive Execution (SIE) нұсқаулығын енгізді. Виртуалды жадты негізгі операциялық жүйелерге енгізуге дейін көптеген мәселелерді шешу қажет болды. Динамикалық мекенжай аудармасы қымбат және құруға қиын арнайы аппаратты талап етті; бастапқы іске асырулар жадқа кіруді сәл баяулатты. 1970 жылдар бойы виртуалды жадты негіздеген операциялық жүйелерді іске асыратын IBM 370 сериясы бизнес пайдаланушыларға бірнеше ескі жүйелерді бағасы/өнімділігі жақсартылған, аз, қуатты мейнфреймдерге көшіру құралын ұсынды. Виртуалды жадты енгізген алғашқы мини-компьютер норвегиялық NORD 1 болды; 1970 жылдары басқа мини-компьютерлер де виртуалды жадты енгізді, әсіресе VMS жүретін VAX модельдері. Виртуалды жад x86 архитектурасына Intel 80286 процессорының қорғалған режимімен енгізілді, бірақ оның сегменттерді ауыстыру техникасы үлкен сегмент өлшемдеріне нашар бейімделді. Intel 80386 қолданыстағы сегментация қабатының астында беттеу қолдауын енгізді, бұл бет қатесі ерекшелігін қосарлы қатесіз басқа ерекшеліктермен тізбектеуге мүмкіндік берді. Алайда сегмент сипаттамаларын жүктеу қымбат операция болды, сондықтан операциялық жүйелерді жасаушылар беттеу мен сегментацияның үйлесімін емес, беттеуге ғана сүйенді.

Беттелген виртуалды жады

Қазіргі кездегі виртуалды жадты іске асырудың көбі виртуалды адрестік кеңістікті беттерге – үзіліссіз виртуалды жад адрестерінің блоктарына – бөледі. Заманауи жүйелерде беттердің көлемі әдетте кем дегенде 4 килобайтты құрайды; үлкен виртуалды адрестік диапазоны немесе көп мөлшердегі нақты жады бар жүйелер көбінесе үлкен бет өлшемдерін қолданады.

Бет кестелері

Бет кестелері қолданба көретін виртуалды мекенжайларды аппараттық құрылғының нұсқауларды өңдеу үшін пайдаланатын физикалық мекенжайларға аударуға қолданылады; мұндай арнайы аударманы жүзеге асыратын аппараттық құрылғы көбінесе жад басқару блогы деп аталады. Бет кестесінің әрбір жазбасы сәйкес беттің нақты жадта бар-жоғын көрсететін белгіні қамтиды. Егер ол нақты жадта болса, бет кестесі бет сақталатын нақты жад мекенжайын қамтиды. Аппараттық құрылғы бетке сілтеме жасағанда, егер бет кестесіндегі жазба оның нақты жадта жоқ екенін көрсетсе, аппараттық құрылғы операциялық жүйенің бет ауыстыру қадағалау бөлігін шақырып, бет қатесін тудырады. Жүйелерде, мысалы, бүкіл жүйе үшін бір бет кестесі, әрбір мекенжай кеңістігі немесе процесс үшін жеке бет кестелері, әрбір сегмент үшін жеке бет кестелері болуы мүмкін; сондай-ақ, жүйелерде, мысалы, сегмент кестесі болмауы мүмкін, бүкіл жүйе үшін бір сегмент кестесі, әрбір мекенжай кеңістігі немесе процесс үшін жеке сегмент кестелері, әрбір мекенжай кеңістігі немесе процесс үшін аймақ кестелерінің ағашындағы әрбір аймақ үшін жеке сегмент кестелері болуы мүмкін. Егер тек бір бет кестесі болса, бір уақытта жұмыс істейтін әртүрлі қолданбалар бір виртуалды мекенжайлар диапазонының әртүрлі бөліктерін пайдаланады. Егер бірнеше беттік немесе сегменттік кестелер болса, онда бірнеше виртуалды мекенжай кеңістіктері болады және бөлек беттік кестелері бар бір мезгілдегі қолданбалар әртүрлі нақты мекенжайларға қайта бағытталады. Кейбір ертерек жүйелер, мысалы SDS 940 сияқты, мекенжайды аудару үшін жадтағы бет кестелерінің орнына бет тізілімдерін қолданды.

Пайджерді басқарушы

Операциялық жүйенің бұл бөлігі беттер кестелерін және бос беттік жақтаулар тізімін жасайды және басқарады. Беттік қателерді жылдам шешу үшін жеткілікті бос беттік жақтаулардың болуын қамтамасыз ету үшін жүйе, мысалы, ең соңғы пайдаланылған (LRU) алгоритмін қолдана отырып, беттік жақтауларды ауыстыру алгоритмін пайдаланып, үкілеген беттік жақтауларды мерзімді түрде алып жатуы мүмкін. Өзгертілген алып жатқан беттік жақтаулар бос кезекке қосылмас бұрын, қосымша сақтау құрылғысына жазылады. Кейбір жүйелерде беттік басқарушы, беттер кестесінен автоматты түрде жүктелмейтін аударма тізілімдерін басқаруға жауапты. Әдетте, шешілмейтін беттік қате қосымшаның қалыптан тыс тоқтауына әкеледі. Дегенмен, кейбір жүйелер мұндай қателер үшін қосымшаға ерекшеліктерді өңдеуге мүмкіндік береді. Беттік басқарушы беттік қате ерекшелігін егжей-тегжейлі жағдайларға байланысты бірнеше түрлі жолмен өңдей алады: Егер виртуалды мекенжай жарамсыз болса, беттік басқарушы оны қате ретінде қарастырады. Егер бет жарамды болса және бет туралы ақпарат MMU-ға жүктелмесе, бет туралы ақпарат беттік тізілімдердің біріне сақталады. Егер бет инициализацияланбаса, жаңа беттік жақтау тағайындалып, тазартылуы мүмкін. Егер ізделіп отырған беттің ішінде алып жатқан жақтау болса, ол қайта пайдаланылады. Егер қате оқуға рұқсат етілмеген бетке жазу әрекетінен туындаса, егер ол жазу кезінде көшірме жасалатын бет болса, бос беттік жақтау тағайындалып, ескі беттің мазмұны көшіріледі; әйтпесе, ол қате ретінде қарастырылады. Егер виртуалды мекенжай жадқа бейімделген файлдағы немесе беттік файлдағы жарамды бет болса, бос беттік жақтау тағайындалып, бет оқылады. Көп жағдайларда беттік кесте жаңартылады, содан кейін аудармалық кеш буфері (TLB) тазартылуы мүмкін, және жүйе ерекшелікті тудырған нұсқауды қайта іске қосады. Егер бос беттік жақтау кезегі бос болса, беттік басқарушы беттік жақтауды босатуы керек, беттік жақтауларды алып жату үшін сол беттік жақтауларды ауыстыру алгоритмін пайдалана отырып.

Тіркелген беттер

Операциялық жүйелерде жад аймақтары тігіліп қойылады (екінші жадқа ауыстырылмайды). Басқа терминдер – құлыпталған, бекітілген немесе сыммен байланыстырылған беттер. Мысалы, үзіліс механизмдері I/O аяқталуы және бет қатесі сияқты олардың өңдеушілеріне сілтемелер массивіне сүйенеді. Егер осы сілтемелерді немесе олар шақыратын кодты қамтитын беттер ауыстырылатын болса, үзіліс өңдеуі әлдеқайда күрделі және уақытты көп қажет ететін болады, әсіресе бет қатесі кезінде. Сондықтан беттер кестелерінің кейбір бөліктері ауыстырылмайды. Кейбір беттер қысқа мерзімге, ал кейбіреулері ұзақ мерзімге тігілуі мүмкін, ал кейбіреулерін тұрақты түрде тігу қажет болуы мүмкін. Мысалы: беттік басқару коды және беттер орналасқан екінші жад құрылғыларының драйверлері тұрақты түрде тігілуі керек, әйтпесе беттік ауыстыру жұмыс істемейді, себебі қажетті код қолжетімді болмайды. Уақытқа тәуелді компоненттер өзгермелі беттік ауыстыру кешігуін болдырмау үшін тігілуі мүмкін. Тікелей жадқа қол жеткізуді немесе I/O арналарын пайдаланатын сыртқы құрылғылар тікелей қол жеткізетін деректер буферлері I/O операциясы жүріп жатқанда тігілген беттерде болуы керек, өйткені мұндай құрылғылар мен олар қосылған шиналар деректер буферлерін физикалық жад мекенжайларында табуды күтеді; шинаның I/O үшін жад басқару бірлігі болған-болмағандығына қарамастан, бет қатесі пайда болған жағдайда беру тоқтатылмайды және қатесі түзетілгеннен кейін қайта бастаылмайды. Мысалы, деректер өлшеу сенсорынан келуі мүмкін және бет қатесінен жоғалған нақты уақыт деректерін қалпына келтіру мүмкін емес. IBM-нің System/370 және одан кейінгі жүйелері үшін операциялық жүйелерінде термин "бекітілген" деп аталады, және мұндай беттер ұзақ мерзімді немесе қысқа мерзімді бекітілген болуы мүмкін, немесе бекітілмеген болуы мүмкін (яғни ауыстырылатын). Жүйелік басқару құрылымдары көбінесе ұзақ мерзімді бекітіледі (қабырғалық уақытпен өлшенеді, яғни секундтармен өлшенеді, секундтың үлесімен емес), ал I/O буферлері әдетте қысқа мерзімді бекітіледі (әдетте қабырғалық уақыттан әлдеқайда аз уақытпен өлшенеді, мүмкін ондаған миллисекундтармен). Шындығында, ОС-та осы қысқа мерзімді деректер буферлерін "жылдам бекіту" үшін арнайы мүмкіндік бар (уақытты қажет ететін қадағалаушы шақыру нұсқаулығына жүгінбей орындалады). Multics "сымдалған" терминін қолданды. OpenVMS және Windows I/O буферлері сияқты уақытша ауыстырылмайтын беттерді "құлыпталған" деп атайды, ал ешқашан ауыстырылмайтын беттер үшін "ауыстырылмайтын" деп атайды. Single UNIX Specification сонымен қатар "құлыпталған" терминін қолданады, сондай-ақ көптеген Unix-ке ұқсас жүйелердегі man беттерінде де қолданылады.

Виртуалды-нақты операция

OS/VS1 және оған ұқсас операциялық жүйелерде жүйелік жадтың кейбір бөліктері "виртуалды нақты" режимінде, "V=R" деп аталады. Бұл режимде әрбір виртуалды мекен-жай бірдей нақты мекен-жайға сәйкес келеді. Бұл режим үзіліс механизмдері үшін, ескі жүйелердегі беттеуді басқарушы және беттеу кестелері үшін, сондай-ақ стандартты емес кіріс-шығыс басқаруын пайдаланатын қолданбалық бағдарламалар үшін қолданылады. Мысалы, IBM-нің z/OS операциялық жүйесінде 3 режим бар: (виртуалды-виртуалды, виртуалды-нақты және виртуалды-тұрақты).

Қиып-соғу

Беттеу және беттерді ұрлау қолданылғанда "тершинг" деп аталатын мәселе туындауы мүмкін, онда компьютер беттерді қосымша жадтан (backing store) және одан ауыстыруға тым көп уақыт жұмсайды, соның салдарынан пайдалы жұмыс баяулайды. Тапсырманың жұмыс жиынтығы (working set) – бұл пайдалы прогреске жету үшін жадыда болуы қажет беттердің ең төменгі жиынтығы. Тершинг барлық белсенді бағдарламалардың жұмыс жиынтықтарын сақтауға жеткіліксіз жад болғанда пайда болады. Жадты кеңейту ең оңай шешім, бірақ бағдарлама дизайнын, жоспарлауды және жадты пайдалануды жақсарту да көмектеседі. Тағы бір шешім – жүйедегі белсенді тапсырмалардың санын азайту. Бұл бір немесе бірнеше процестің жұмыс жиынтығын ауыстыру арқылы жадқа деген талапты төмендетеді. Жүйенің тершингке түсуі көбінесе бірнеше іске қосылған бағдарламалардан беттерді сұраудың күрт өсуінен туындайды. Суап-токен (Swap token) – жеңіл және динамикалық тершингке қарсы қорғау механизмі. Негізгі идеясы – жүйедегі белгіні орнату, ол тершинг пайда болған кезде беттік қателерге тап болған процеске кездейсоқ түрде беріледі. Белгісі бар процесс өзінің жұмыс жиынтығын құру үшін физикалық жад беттерін бөлуге қосымша мүмкіндік алады, оның орындалуы жылдам аяқталып, жад беттерін басқа процестерге босатуы күтіледі. Белгіні бір-бірлеп беру үшін уақыт белгісі қолданылады. Суап-токеннің алғашқы нұсқасы Linux 2.6 жүйесінде іске асырылды. Екінші нұсқасы – преемптивтік суап-токен (preempt swap token), ол да Linux 2.6 жүйесінде бар. Беттеудің орнына сегменттеуді қолдануға болады, виртуалды адрестік кеңістіктерді өзгермелі ұзындығы бар сегменттерге бөлуге болады. Мұндағы виртуалды мекенжай сегмент нөмірінен және сегмент ішіндегі смещениеден тұрады. Intel 80286 процессоры да сегменттеу схемасын опция ретінде қолдайды, бірақ ол сирек қолданылады. Сегменттеу мен беттеуді әр сегментті беттерге бөлу арқылы бірге қолдануға болады; Multics және IBM System/38 сияқты осы жад құрылымы бар жүйелер көбінесе беттеуге басымдық береді, ал сегменттеу жадты қорғауды қамтамасыз етеді. Intel 80386 және одан кейінгі IA 32 процессорларында сегменттер 32 биттік сызықтық, беттелген адрестік кеңістікте орналасқан. Сегменттерді сол кеңістікке кіргізіп, одан шығаруға болады; беттер негізгі жадтан кіріп-шығуға болады, екі деңгейлі виртуалды жадты қамтамасыз етеді; көптеген операциялық жүйелер мұны жасамайды, тек беттеуді ғана қолданады. Ертедегі аппараттық қолдаусыз x86 виртуализациялық шешімдері беттеу мен сегменттеуді біріктірді, өйткені x86 беттеуі тек екі қорғау доменін ұсынады, ал VMM, қонақ опералық жүйесі немесе қонақ қолданбалар стегіне үш домен қажет. Беттеу және сегменттеу жүйелерінің айырмашылығы тек жадты бөлуде ғана емес; сегменттеу жад моделінің семантикасының бір бөлігі ретінде пайдаланушы процестеріне көрінеді. Сондықтан, бір үлкен кеңістік сияқты көрінетін жадтың орнына, ол бірнеше кеңістікке бөлінеді. Бұл айырмашылықтың маңызды салдары бар; сегмент – өзгермелі ұзындығы бар немесе адрестік кеңістікті ұзартудың қарапайым тәсілі бар бет емес. Процесс жады мен файл жүйесі арасында ешқандай айырмашылық жоқ бір деңгейлі жад моделін қамтамасыз ететін сегменттеу, тек процесс адрестік кеңістігіне карталанған сегменттердің (файлдардың) тізімінен тұрады. Бұл mmap және Win32 MapViewOfFile сияқты шақырулармен қамтамасыз етілген механизмдерден өзгеше, өйткені файлдар аралық сілтемелер файлдарды жартылай кездейсоқ орындарға карталау кезінде жұмыс істемейді. Multics жүйесінде файл (немесе көп сегментті файлдың сегменті) адрестік кеңістіктегі сегментке картаға түсіріледі, сондықтан файлдар әрқашан сегмент шекарасында картаға түсіріледі. Файлдың сілтеме бөліміндегі сілтемелерді тіркемеге жүктеу немесе олар арқылы жанама сілтеме жасау тұзаққа түсіруі мүмкін. Шешілмеген сілтемеде сілтеме жасалған сегменттің атауы және сегмент ішіндегі смещение болады; тұзақтың басқарушысы сегментті адрестік кеңістікке картаға түсіреді, сегмент нөмірін сілтемеге қояды, сілтемедегі таңбалауыш өрісін өзгертеді, соның салдарынан ол енді тұзақ тудырмайды және тұзақ тудырған нұсқауды қайта орындап, тұзақ болған кодқа қайта оралады. Бұл сілтеме жасаушының қажеттілігін толығымен жояды.

Адрес кеңістігін ауыстыру

Кейбір операциялық жүйелер бетбелгілеу және сегменттеу мүмкіндіктерімен қатар, барлық адрес кеңістіктерін алмастыруды қамтамасыз етеді. Мұндай жағдайда, ОЖ нақты жадтағы беттер мен сегменттерді алмастыру файлдарына жазады. Алмастыру кезінде ОЖ деректерді алмастыру файлдарынан қайта оқиды, бірақ алмастыру операциясы кезінде бетке шығарылған беттерді автоматты түрде оқымайды. IBM MVS, OS/VS2 Release 2 нұсқасынан бастап z/OS-ке дейін, адрес кеңістігін алмастырылмайтын деп белгілеуге мүмкіндік береді; мұндай жағдайда адрес кеңістігіндегі ешқандай беттер бекітілмейді. Бұл, бағдарламалық қасиеттер кестесіне алмастырылмайтын белгімен жарамды негізгі бағдарламаның атын енгізу арқылы жұмыстың барысында жасалуы мүмкін. Сонымен қатар, артықшылықты код SYSEVENT Supervisor Call (SVC) нұсқауын қолдану арқылы адрес кеңістігін уақытша алмастырылмайтын етіп жасай алады; адрес кеңістігінің қасиеттеріндегі кейбір өзгерістер ОЖ-ның оны SYSEVENT TRANSWAP арқылы алмастырып, содан кейін қайта алмастыруын қажет етеді. Егер, мысалы, бірнеше жұмыс бір сақтау аймағына кіріп-шығып тұрса, алмастыру үшін міндетті түрде жад басқару аппараттық құралдары қажет емес.