Кіріспе

Жад жеткіліксіздігі (OOM) – бағдарламаларға немесе операциялық жүйеге пайдалану үшін қосымша жад бөлу мүмкін болмайтын компьютердің жұмыс істеу жағдайы. Мұндай жүйе қосымша бағдарламаларды жүктеуге және орындалу кезінде жадқа деректерді жүктеуге қабілетсіз болады, нәтижесінде олар қалыпты жұмыс істемейді. Бұл әдетте барлық қолданылатын жад, соның ішінде дискідегі ауыстыру кеңістігі толып кеткенде болады.

Тарих

Тарихи тұрғыдан алғанда, жадтан тыс (out of memory) жағдай қазіргіге қарағанда жиі кездесетін, себебі алғашқы компьютерлер мен операциялық жүйелер физикалық жедел жадтың (RAM) шектеулі көлеміне ие болды. Бұл алғашқы процессорлардың үлкен көлемдегі жадыны мекендеуге қабілетсіздігімен және сонымен қатар құнымен байланысты болды. Виртуалды жадтың пайда болуы алмасу кеңістігін (swap space) пайдалануға мүмкіндік бергендіктен, бұл жағдай азайып кетті. Көптеген қазіргі бағдарламалар жұмыс істеу кезінде жадыны еркін бөліп, босатуға күтеді және бұл күту орындалмаған жағдайда, бақылаусыз (қақтығыс) тоқтауға бейім. Ал ескі бағдарламалар көбінесе жадыны бір рет бөліп, барлық жұмысты орындауға жеткілікті екенін тексергеннен кейін, одан арғы жады қажет болмайды деп есептеді. Сондықтан, олар дереу "жадтан тыс" (OOME) қате хабарламасымен тоқтатылған немесе күтілгендей жұмыс істеген. MS-DOS сияқты алғашқы операциялық жүйелерде көп тапсырмалылықты қолдау болмады. Бағдарламаларға қажеттіліктеріне қарай пайдалана алатын физикалық жад бөлінді. Физикалық жад көбінесе тапшы ресурс болды, және оны тоқтату және жүйеде тұру функциялары бар бағдарламалар толықтырғанда, басқа бағдарламаларды іске қосу мүмкін болмайтын, жұмыс істеп тұрған бағдарламалар жабылғанға дейін күтілуі керек еді. Қазіргі операциялық жүйелер виртуалды жадыны ұсынады, онда процестерге жадтың белгілі бір диапазоны беріледі, бірақ бұл жад тікелей физикалық RAM-ге сәйкес келмейді. Виртуалды жад физикалық RAM, mmap (Unix жүйелерінде) немесе MapViewOfFile (Windows-та) арқылы дискідегі файл немесе алмасу кеңістігімен қамтамасыз етілуі мүмкін, ал операциялық жүйе қажеттілікке қарай виртуалды жад беттерін жылжыта алады. Виртуалды жад физикалық жадпен қамтамасыз етілмегендіктен, оның толуы сирек кездеседі және әдетте операциялық жүйе ресурстарды тұтынуға қосымша шектеулер қояды. Мур заңы болжағандай, барлық компьютерлердегі физикалық жад көлемі экспоненциалды түрде өсті, бірақ бұл бағдарламалар мен файлдардың өзі үлкенейгендіктен белгілі бір дәрежеде теңдестіріледі. Кейбір жағдайларда, жүктелген деректердің көп бөлігі қатты дискіде сақталатын виртуалды жады қолдауы бар компьютер физикалық жадтан, бірақ виртуалды жадтан тыс қалуы мүмкін, бұл шамадан тыс айырбастауға (paging) әкелуі мүмкін. Бұл жағдай "тербету" (thrashing) деп аталады және компьютерді бағдарламаларды жапқанға дейін немесе қайта жүктегенге дейін пайдалануға жарамсыз етеді. Осы себептерге байланысты, қазіргі компьютерлерде "жадтан тыс" хабарламалары сирек кездеседі. Дегенмен, қазіргі компьютерде де жадтан тыс (OOM) жағдайға тап болу мүмкін. Қазіргі компьютерлерде OOM жағдайы операциялық жүйе виртуалды жадыны жасай алмағанда туындайды, себебі оның барлық мүмкін қосалқы құрылғылары толтырылған немесе соңғы пайдаланушы оларды өшірген. Бұл жағдай бұрылыстан кейін жазуға көшірмелеуден (copy-on-write) туындауы мүмкін.

Процеске арналған жад шектері

Жүйелік физикалық жад шектерінен басқа, кейбір жүйелер әрбір процесс пайдалана алатын жад мөлшерін шектейді. Әдетте, бұл саясат мәселесі болып табылады, сонымен қатар операциялық жүйеде процестер деңгейінде қолжетімді жадтан артық адрестік кеңістік болған жағдайда да мұндай шектеулер туындауы мүмкін. Мысалы, физикалық адрестеме кеңейтімі қосылған жоғары деңгейдегі 32 биттік жүйелер 8 гигабайт немесе одан да көп жүйелік жадпен келеді, бірақ 32 биттік тегіс жад моделінде әрбір процесс оның тек 4 ГБ-на ғана қол жеткізе алады. Егер процесс өзіне белгіленген лимиттен асып, одан әрі жадты бөлуге тырысса, қателік пайда болады. Мысалы, жадты бөлуге арналған C стандартының malloc функциясы NULL мәнін қайтарады, ал дұрыс жұмыс істейтін бағдарлама мұндай жағдайды өңдеуі тиіс.