حافظه مجازی٬ محافظت و صفحه بندی

آمار بازدید :400
امتیاز :4.666
مشاهده جزئیات
کد مقاله :720

بسمه تعالی

در سیستم عامل های جدید مانند ویندوز و لینوکس خیلی معمول است که در یک زمان چند برنامه در حافظه بارگزاری شده باشند بنابراین مشکلاتی ممکن است به وجود آید. اول این که چگونه از تداخل میان آنها جلوگیری کنیم. دوم این که اگر مثلا برنامه اول در آدرس ۱۰۰۰ حافظه عملیاتی را انجام دهد و برنامه دیگری نیاز به آن آدرس داشته باشد چه اتفاقی می افتد و چگونه می توانند همزمان از یک آدرس استفاده کنند. سوال آخر این که اگر رایانه ما ۶۴ کیلو بایت حافظه داشته باشد و ما تصمیم به اجرای ۳ برنامه همزمان بگیریم که دو تای آنها به ۳۲ کیلوبایت و یکی به ۱۶ کیلو بایت نیاز داشته باشد(صرفنظر از حافظه ای که سیستم عامل برای عملیات خود نیاز دارد) چه اتفاقی خواهد افتاد؟ جواب همه این سوالات در سیستم حافظه مجازی پردازنده های 80x86 است.

حافظه مجازی 80x86 به هر پروسه ۳۲ بیت ( ۴ گیگا بایت ) فضای آدرس دهی می دهد. این به این معنا است که آدرس ۱۰۰۰ پروسه اول در آدرس فیزیکی متفاوت از آدرس ۱۰۰۰ پروسه دوم است. پردازنده 80x86 با استفاده از صفحه بندی این کار را انجام می دهد بنابراین یک آدرس مجازی به آدرس های فیزیکی متفاوت نگاشت می شوند. آدرس مجازی آدرسی است که در برنامه استفاده می شود. آدرس فیزیکی در واقع الگوی بیتی است که در باس آدرس ظاهر خواهد شد. نیازی نیست که این دو ( آدرس فیزیکی و آدرس مجازی ) با هم برابر باشند( و در اکثر مواقع هم برابر نیستند). برای مثال آدرس مجازی ۱۰۰۰ در برنامه اول ممکن است نماینده آدرس فیزیکی ۲۱۵۰۰۰ باشد در حالی که آدرس مجازی ۱۰۰۰ برنامه دوم نماینده آدرس فیزیکی ۳۰۰۰۰۰ است. پردازنده چگونه این ها را انجام می دهد؟ به سادگی به وسیله صفحه بندی حافظه.
ایده صفحه بنده حافظه ساده است. اول این که حافظه را به بلوک هایی از بایت ها تقسیم می کنیم که به آن صفحه می گوییم. یک صفحه در حافظه اصلی با خطوط مخازن در سیستم caching قابل مقایسه است. هر چند صفحات خیلی بزرگتر از خطوط مخازن هستند. برای مثال پردازنده 80x86 از صفحات با اندازه ۴۰۹۶ بایت استفاده می کند.
پس از تقسیم حافظه به صفحات از یک جدول برای تبدیل بیت های H. O ی یک آدرس مجازی برای انتخاب یک صفحه استفاده می کنیم. همچنین می توان از بیت های L. O آدرس های مجازی برای اندیس گزاری صفحات استفاده کرد. برای مثال در سیستمی با اندازه صفحات ۴۰۹۶ از ۱۲ بیت پایین به عنوان افست در یک صفحه استفاده می شود. از ۲۰ بیت بالا به عنوان اندیس در جدول استفاده می شود.

 

ترجمه آدرس مجازی به آدرس فیزیکیترجمه آدرس مجازی به آدرس فیزیکی

 

البته یک اندیس ۲۰ بیتی در جدول صفحات نیاز به بیش از یک میلیون سطر دارد. اگر هر سطر ۳۲ بیت طول داشته باشد ( ۲۰ بیت برای آدرس و ۱۲ بیت برای اطلاعات دیگر ) آن گاه جدول ۴ گیگا بایت حجم خواهد داشت. این بیشتر از فضایی است که اکثر برنامه ها نیاز دارند. هرچند به کمک جدول صفحات چند سطحه به راحتی می توان این حجم را برای برنامه های کوچک به ۸ کیلو بایت کاهش داد. جزئیات در این مقاله بیان نمی شود اما برنامه ما هیچ گاه به ۴ گیگا بایت نیاز نخواهد داشت مگر این که به تمام ۴ گیگا بایت فضای آدرس دهی نیاز داشته باشد.
با مشاهده دقیق عکس بالا متوجه یک مشکل در استفاده از جدول صفحات خواهیم شد. این روش نیاز به دو دسترسی به حافظه برای دسترسی به یک آدرس دارد: یکی برای استخراج مقدار از جدول صفحات و یکی برای دسترسی خواندن و نوشتن در آن آدرس. برای جلوگیری از در هم ریختگی مخزن داده ها ( یا دستور العمل ها ) با مخزن جدول صفحات ( افزایش حالت miss در مخازن ) جدول صفحات از مخزن خاص خود Translation Lookaside Buffer یا TLB استفاده می کند. این مخزن در خانواده پنتیوم معمولا ۳۲ ورودی دارد. این مقدار قابلیت آدرس دهی ۱۲۸ کیلوبایت حافظه را (بدون حالت miss ) دارد(۳۲ صفحه). چون برنامه ها معمولا به کمتر از این مقدار احتیاج دارند اکثر دسترسی به جدول صفحات از طریق مخازن انجام
می شوند.
همین طور که گفته شد هر ورودی در جدول صفحات ۳۲ بیت طول دارد هر چند که ۲۰ بیت برای تبدیل آدرس کافی است. پردازنده های Intel از تعدادی از ۱۲ بیت باقی مانده برای اعمالی مانند کنترل دسترسی به حافظه استفاده می کند. به عنوان مثال یک بیت حالت دسترسی فقط خواندنی یا خواندنی و نوشتنی را تعیین می کند. بیت دیگر تعیین می کند که آیا قابلیت اجرا دستور از آن صفحه وجود دارد یا خیر؟ یک بیت تعیین می کند که آیا سیستم عامل قادر به دسترسی به این صفحه است یا برنامه های کاربردی؟ بعضی از این بیت ها تعیین می کند که آیا صفحه کثیف است یا خیر( که به این معنی است که پردازنده در آن صفحه نوشته است ) و آیا پردازنده به تازگی به این صفحه دسترسی داشته یا خیر. ( این بیت ها معنی مشابه برای خطوط مخازن دارد ). بیت دیگر تعیین می کند که آیا این صفحه روی حافظه اصلی است یا بر روی حافظه جانبی قرار دارد. برنامه های کاربردی به این بیت ها دسترسی ندارند بنابراین قادر به تغییر آنها نیستند هرچند ویندوز توابعی را برای دستکاری در مقدار این بیت ها فراهم کرده است ( ویندوز به شما اجازه می دهد که تعیین کنید یک صفحه قابلیت نوشتن دارد یا فقط خواندنی است ). کاربران لینوکس نیز هم تعدادی توابع برای تغییر این بیت ها دارند.
با استفاده از نگاشت حافظه چندین برنامه می توانند به صورت همزمان در حافظه مقیم باشند هر چند که از آدرس مجازی مشترک استفاده کنند. صفحه بندی همچنین مکانیزمی را به وجود می آورد که به وسیله آن سیستم عامل می تواند صفحات کم کاربرد را به حافظه جانبی ( مانند دیسک درایو ها ) منتقل کند. دقیقا مانند مکان مرجع ها که بر روی خطوط مخازن اعمال
می شوند بر روی صفحات حافظه نیز به همان صورت اعمال می شود. یک برنامه در هر زمان به درصد کمی از صفحات حافظه که می تواند شامل داده یا دستورالعمل باشد نیاز دارد (به این دسته از صفحات »صفحات کاری« گفته می شود). چون صفحات کاری به کندی تغییر می کنند برای مدت قابل ملاحضه ای این صفحات ثابت می مانند بنابراین نیاز زیادی نیست که باقیمانده صفحات در حافظه اصلی بماند و حافظه با ارزش را تلف کند. اگر سیستم عامل صفحات غیر کاری را در حافظه جانبی ذخیره کند فضای
با ارزشی که در اختیار آنها است برای برنامه های دیگری که به آن نیاز دارند آزاد می شود.
البته مشکل منتقل کردن داده ها به خارج از حافظه اصلی این است که ممکن است دیر یا زود برنامه به آن داده ها نیاز داشته باشد. اگر شما سعی کنید که به یک صفحه داده ها که خارج از حافظه اصلی است دسترسی داشته باشید MMU (واحد کنترل حافظه) از طریق جدول صفحات متوجه عدم حضور آن در حافظه اصلی می شود. در این شرایط است که وقفه ای را به CPU ارسال می کند که باعث توقف اجرای برنامه می شود و انتقال کنترل به سیستم عامل می شود. سیستم عامل در خواست دسترسی به حافظه را آنالیز می کند و داده های مربوطه را از دیسک می خواند و به صفحات موجودی در حافظه اصلی منتقل می کند. کل این فرآیند مشابه اتفاقی است که در سیستم مخازن کاملا شرکت پذیر اتفاق می افتد به جز این که دسترسی به دیسک ها بسیار آهسته تر از دسترسی به حافظه اصلی است. در واقع شما می توانید حافظه اصلی را یک مخزن کاملا شرکت پذیر باز نویس با خطوط مخازن ۴۰۹۶ بایتی فرض کنید که اطلاعات دیسک درایو را نگه داری می کند. قوانین نگه داری – جابجایی و موارد دیگر بسیار شبیه به مخازن است. بحث حافظه مجازی فراتر از حد این متن است. هدف اصلی ما در این جا این است که بدانیم این فرآیند در سیستم عامل مانند لینوکس و ویندوز اتفاق می افتد و دسترسی به دیسک به کندی اتفاق می افتد.
هر برنامه جدول صفحات جداگانه دارد و خود برنامه به جدول صفحات دسترسی ندارد. نکته مهمی که نتیجه می گیریم این است که هر برنامه نمی تواند در برنامه ی دیگر به وسیله رو نویسی داده های آن دخالت کند. (البته با فرض این که سیستم عامل به درستی نوشته شده باشد) و همچنین این که اگر برنامه با رونویسی خودش خراب شود نمی تواند اثری روی بقیه برنامه ها بگذارد. این امکان مهمی است که به وسیله سیستم صفحه بندی حافظه حاصل می شود.

نکته دیگری که قابل توجه است این است که اگر دو برنامه بخواهند صفحات اشتراکی داشته باشند این کار نیز امکان پذیر است. تنها کاری که باید انجام دهیم این است که به سیستم عامل اطلاع دهیم که به بلاک های مشترک حافظه نیاز داریم. سیستم عامل آدرس های مجازی مورد نظر (آدرس صفحات اشتراکی) را به آدرس فیزیکی یکسان نگاشت خواهد کرد. در ویندوز با استفاده از »فایل های نگاشت شده در حافظه« این کار امکان پذیر است. برای اطلاعات بیشتر به مستند سازی سیستم عامل رجوع کنید. لینوکس نیز فایل های نگاشت شده در حافظه و چندین روش دیگر برای استفاده از حافظه اشتراکی را پشتیبانی می کند دوباره به مستند سازی سیستم عامل رجوع کنید


نام نویسنده :محمد رضا روحیان
تاریخ ساخت :1386/08/28تاریخ اخرین ویرایش :1386/08/28
امتیاز شما :
ابتدای صفحه
بازگشت به شاخه های این بخش

تعداد :0

نظرات و پیشنهادات



ارسال نظر و پیشنهاد
موضوع :
نظر و پیشنهاد :
(no HTML tag)