Segmentatsiya chegaralari
Segmentatsiya ishlatilmagan virtual xotira muammosini hal qilishini ko'rdik. Agar jarayon ma'lum hajmdagi xotiradan foydalanmayotgan bo'lsa, tanlangan xotiraga mos keladigan segmentlar tufayli bu jarayon jismoniy xotiraga ko'rsatilmaydi. Biroq, bu mutlaqo to'g'ri emas. Agar jarayon 16 Kb yig'ishni talab qilsa nima bo'ladi? OT katta ehtimol bilan 16 KB jismoniy xotira segmentini yaratadi. Ammo foydalanuvchi 2k xotirani bo'shatib qo'ysa nima bo'ladi? Keyin OS 16Kb segmentni 14Kbgacha kamaytirishi kerak. Agar hozir dasturchi 30Kb to'plarni so'rasa nima qilish kerak? Eski 14Kb segment endi 30Kb gacha o'sishi kerak, lekin buni qila oladimi? Boshqa segmentlar endi bizning 14 kb segmentimizni o'rab olishi mumkin va bu uning o'sishiga to'sqinlik qiladi. Keyin OT 30K bo'sh joyni izlashi va keyin segmentni ko'chirishi kerak edi.
Segmentlar bilan bog'liq katta muammo shundaki, ular juda bo'laklangan jismoniy xotiraga olib keladi, chunki ular foydalanuvchi topshiriqlari so'rovi bo'yicha o'sishda davom etadi va xotirani ajratadi. Operatsion tizim bo'sh xotira qismlari ro'yxatini saqlab turishi va ularni boshqarishi kerak.
Ba'zan, OS, barcha bo'sh segmentlarni jamlab, bir oz bo'sh joy oladi, lekin tegmagani uchun u bu bo'sh joydan foydalana olmaydi va jismoniy xotirada bo'sh joy bo'lsa ham, jarayonlardan xotira so'rovlarini rad etishi kerak. Bu juda yomon stsenariy. Operatsion tizim barcha bo'sh joylarni kelajakda xotira talabini qondirish uchun ishlatilishi mumkin bo'lgan katta bo'lakka birlashtirib, xotirani qisqartirishga harakat qilishi mumkin.
Ammo bunday siqilish algoritmi protsessor uchun qiyin va bu vaqtda hech qanday foydalanuvchi jarayoni protsessorni ololmaydi: operatsion tizim o'zining jismoniy xotirasini qayta tashkil etish bilan to'liq yuklangan, shuning uchun tizim yaroqsiz holga keladi. Xotirani segmentatsiyalash xotirani boshqarish va ko'p vazifali muammolarni hal qiladi, lekin u haqiqiy kamchiliklarni ham ko'rsatadi. Shunday qilib, segmentatsiya imkoniyatlarini kengaytirish va bu kamchiliklarni tuzatish zarurati tug'iladi. Shundan yana bir kontseptsiya shakllandi - "xotira sahifalari".
Xulosa
Endi biz "Segmentatsiya xatosi" xabari ostida nima ekanligini bilasiz. Operatsion tizim virtual xotirani jismoniy xotiraga solishtirish uchun segmentlardan foydalanadi. Yadro jarayoni ba'zi xotiraga kirishni xohlasa, MMU xotiraning jismoniy manziliga tarjima qilish so'rovini beradi. Ammo agar bu manzil to'g'ri bo'lmasa, jismoniy segmentda chegaradan tashqarida yoki segmentning xavfsizlik huquqlari mos kelmasa, standart OT muvaffaqiyatsizlikka sabab bo'lgan jarayonga signal yuboradi: standart ishlov beruvchiga ega SIGSEGV . Bu jarayonni o'ldiradi va xabarni ko'rsatadi: "Segmentatsiya xatosi". Boshqa operatsion tizimlarda (menimcha) ko'pincha xabar "Umumiy xavfsizlik xatosi" kabi ko'rinadi. Linux bilan biz omadlimiz, biz manba kodiga kirish imkoniga egamiz, xotiraga kirish xatolarini boshqaradigan X86 / 64 platformalari uchun manba kodi joyi mavjud va SIGSEGV ham shu erda. Agar siz X86/64 platformalari uchun segmentlarni ishlab chiqishga qiziqsangiz, ularning ta'rifini Linux yadrosida ko'rishingiz mumkin. Klassik segmentlarni ishlatishdan ko'ra uzoqroq xotira segmentatsiyasini qo'llab-quvvatlaydigan peyjing xotirasida qiziqarli materiallarni ham topasiz. Men ushbu maqolani yozishni yoqtirardim, u meni birinchi protsessorimni: C, VHDL va to'g'ridan-to'g'ri tahrirlashdan foydalangan holda Motorola 68HC11-ni dasturlashda to'qsoninchi yillarning oxirlariga olib keldi. Men operatsion tizimning virtual xotirasini boshqarishni dasturlashtirmadim, lekin to'g'ridan-to'g'ri jismoniy manzillardan foydalandim (mening protsessorimga bunday murakkab mexanizmlar kerak emas). Keyin men Internetga kirdim; lekin mening birinchi bilimim elektronikadan, biz har kuni foydalanadigan tizimlardan keldi ...
Do'stlaringiz bilan baham: |