کامپیوتر، مهندسی 4924 بازدید

مدیریت حافظه یکی از کارکردهای سیستم عامل است که به مدیریت حافظه اصلی و جابجایی پردازش‌ها بین حافظه اصلی و دیسک در طی اجرا می‌پردازد. مدیریت حافظه صرف نظر از این که موقعیت‌های مختلف حافظه به پردازشی تخصیص یافته‌اند یا نه، همه آن‌ها را مدیریت می‌کند. این فرایند میزان حافظه‌ای که باید به پردازش‌ها تخصیص یابد را تعیین می‌کند. مدیریت حافظه تصمیم می‌گیرد که در هر زمان کدام پردازش به حافظه دسترسی داشته باشد. مدیریت حافظه به ردگیری مقدار حافظه تخصیص یافته یا آزاد شده پرداخته و وضعیت‌های متناظر با آن‌ها را به‌روزرسانی می‌کند.

در این بخش از راهنمای جامع سیستم عامل، مفاهیم مقدماتی مرتبط با مدیریت حافظه را بررسی می‌کنیم.

فضای آدرس پردازش

فضای آدرس پردازش به مجموعه‌ای از آدرس‌های منطقی گفته می‌شود که یک پردازش در کد خود مورد ارجاع قرار می‌دهد. برای نمونه وقتی آدرسی 32 بیتی مورد استفاده قرار می‌گیرد، آدرس‌ها می‌توانند از 0 تا 0x7fffffff باشند که $$2^{31}$$ عدد را شامل می‌شود و اندازه تئوریکی کلی برای آدرس‌دهی دو گیگابایت است.

سیستم عامل وظیفه نگاشت آدرس‌های منطقی به آدرس‌های فیزیکی را در زمان تخصیص حافظه به برنامه بر عهده دارد. سه نوع از آدرس پیش و پس از تخصیص حافظه در برنامه مورد استفاده قرار می‌گیرند:

نوع آدرس حافظه توضیح آن
آدرس‌‌های نمادین [Symbolic addresses] آدرس‌های مورد استفاده در کد سورس. نام‌های متغیرها، ثابت‌ها و برچسب‌های دستورالعمل اجزای اصلی فضای آدرس‌دهی نمادین هستند.
آدرس‌های نسبی کامپایلر در زمان کامپایل، آدرس‌های نمادین را به آدرس‌های نسبی تبدیل می‌کند.
آدرس‌های فیزیکی بخش بارگذار (loader) این آدرس‌ها را در زمان بارگذاری برنامه در حافظه اصلی تولید می‌کند.

آدرس‌های مجازی و فیزیکی در زمان کامپایل یکسان هستند و در زمان بارگذاری طرح‌های متصل به آدرس ایجاد را تشکیل می‌دهند. آدرس‌های مجازی و فیزیکی در زمان اجرا طرح‌های اتصال آدرس متفاوتی دارند.

مجموعه همه آدرس‌های منطقی تولید شده از سوی یک برنامه به نام فضای آدرس منطقی (logical address space) نامیده می‌شود. مجموعه همه آدرس‌های فیزیکی متناظر با این آدرس‌های منطقی به نام فضای آدرس فیزیکی (physical address space) شناخته می‌شود.

نگاشت زمان اجرا از آدرس‌های مجازی به فیزیکی به وسیله واحد مدیریت حافظه (MMU) صورت می‌گیرد که قطعه‌ای سخت‌افزاری است. MMU از سازوکار زیر برای تبدیل آدرس مجازی به آدرس فیزیکی بهره می‌گیرد:

  • مقدار موجود در ثبات پایه به همه آدرس‌های تولید شده از سوی پردازش کاربر اضافه می‌شود و به عنوان یک افست در هنگام ارسال به حافظه عمل می‌کند. برای نمونه اگر مقدار ثبات پایه برابر با 10000 باشد، در این صورت هنگامی که کاربر تلاش می‌کند از 100 موقعیت حافظه استفاده کند، مکان‌های حافظه مورد استفاده وی به صورت دینامیک تا موقعیت 10100 تخصیص می‌یابند.
  • برنامه کاربر با آدرس‌های مجازی سر و کار دارد و هرگز آدرس‌های فیزیکی واقعی را نمی‌بیند.

بارگذاری استاتیک یا دینامیک

انتخاب بین بارگذاری استاتیک و دینامیک در زمان نوشتن برنامه رایانه‌ای صورت می‌گیرد. اگر می‌خواهید برنامه را به صورت استاتیک بارگذاری کنید، در این صوت در زمان کامپایل، برنامه‌ها بدون برجای گذاشتن هیچ گونه برنامه بیرونی یا وابستگی ماژول، به صورت کامل کامپایل و لینک می‌شوند. در این حالت لینکر، برنامه object را با دیگر ماژول‌های object ضروری در قالب یک برنامه کامل کامپایل می‌کند که می‌تواند شامل آدرس‌های منطقی نیز باشد.

اگر مشغول بارگذاری دینامیک یک برنامه باشید، در این صورت کامپایلر برنامه را کامپایل خواهد کرد و برای همه ماژول‌هایی که می‌خواهید به صورت دینامیک بارگذاری شوند، تنها ارجاعی ارائه می‌شود و باقی کارها در زمان اجرا صورت می‌گیرند.

در زمان بارگذاری به صورت بارگذاری استاتیک، برنامه کامل (و داده‌ها) در حافظه بارگذاری می‌شوند تا اجرای برنامه آغاز شود.

اگر از بارگذاری دینامیک استفاده می‌کنید، رویه‌های دینامیک کتابخانه روی یک دیسک به صورت relocatable ذخیره می‌شوند و تنها زمانی که از سوی برنامه مورد نیاز باشند در حافظه بارگذاری می‌شوند.

لینک کردن استاتیک یا دینامیک

همان طور که در بخش قبلی اشاره کردیم، وقتی از روش لینک کردن استاتیک استفاده کنیم، لینکر همه ماژول‌های دیگر مورد نیاز از سوی برنامه را در قالب برنامه اجرایی منفردی ترکیب می‌کند تا از وابستگی‌های زمان اجرا جلوگیری کند.

زمانی که از روش لینک کردن دینامیک استفاده می‌شود، نیاز نیست ماژول واقعی یا کتابخانه به برنامه لینک شود و به جای آن ارجاعی به ماژول دینامیک در زمان کامپایل و لینک کردن ارائه می‌شود. کتابخانه‌های لینک دینامیک (DLL) در ویندوز و اشیای مشترک (Shared Objects) در یونیکس، نمونه‌های خوبی از کتابخانه‌های دینامیک محسوب می‌شوند.

سواپ کردن (Swapping)

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

با این که عملکرد سیستم معمولاً با سواپ کردن پردازش‌ها تحت تأثیر قرار می‌گیرد؛ اما این فرایند به اجرای پردازش‌های چندگانه و بزرگ به طور موازی کمک می‌کند و به همین دلیل سواپ کردن تحت عنوان تکنیک فشرده‌سازی حافظه (memory compaction) نیز نامیده می‌شود.

کل زمان مورد نیاز برای سواپ کردن پردازش، شامل زمانی است که برای انتقال کل پردازش به دیسک ثانویه و سپس کپی کردن مجدد آن به حافظه و همچنین زمان دریافت حافظه اصلی از سوی پردازش می‌شود.

فرض کنید که پردازش کاربر به اندازه 2048 کیلوبایت روی یک دیسک استاندارد باشد و فرایند سواپ کردن با سرعت حدود 1 مگابایت بر ثانیه صورت بگیرد. انتقال واقعی 100 کیلوبایت از پردازش از حافظه مدت زمان زیر طول می‌کشد:

2048KB / 1024KB per second

= 2 seconds

= 2000 milliseconds

اینک با در نظر گرفتن زمان ورود و خروج، در کل 4000 میلی‌ثانیه به علاوه مقدار زمان overhead اندکی طول می‌کشد تا پردازش مجدداً صاحب حافظه اصلی شود.

تخصیص حافظه

حافظه اصلی معمولاً دو پارتیشن دارد:

  • حافظه پایین (Low Memory) – پردازش‌های سیستم عامل در این حافظه هستند.
  • حافظه بالا (High Memory) – پردازش‌های کاربر در حافظه بالا نگهداری می‌شوند.

سیستم عامل از ساز و کار تخصیص حافظه زیر استفاده می‌کند:

روش تخصیص حافظه توضیح
تخصیص تک پارتیشنی در این نوع از تخصیص، از طرح‌بندی relocation-register برای حافظت از پردازش‌های کاربر در برابر همدیگر استفاده می‌شود تا بدین ترتیب کد و داده‌های سیستم عامل تغییری پیدا نکند. ثبات relocation شامل کوچک‌ترین مقدار آدرس فیزیکی است؛ در حالی که ثبات imit شامل بازه‌ای از آدرس‌های منطقی است. هر آدرس منطقی باید مقداری کمتر از ثبات limit داشته باشد.
تخصیص چند پارتیشنی در این نوع از تخصیص، حافظه اصلی به چند پارتیشن با طول ثابت تقسیم می‌شود که در آن هر پارتیشن شامل تنها یک پردازش است. وقتی یک پارتیشن آزاد می‌شود، پردازشی از صف ورودی انتخاب شده و درون پارتیشن آزاد بارگذاری می‌شود. وقتی یک پردازش خاتمه می‌یابد، پارتیشن در اختیار پردازش دیگری قرار می‌گیرد.

فرگمنت شدن (Fragmentation)

وقتی پردازش‌ها وارد حافظه شده و از آن خارج می‌شوند، فضای آزاد حافظه به قطعه‌های کوچکی تقسیم می‌شود. این وضعت پس از مدتی منتهی به این نتیجه می‌شود که پردازش‌ها نمی‌توانند در بلوک‌های حافظه تخصیص یابند، زیرا اندازه بلوک‌های حافظه کوچک و تکه تکه شده و در واقع بی‌استفاده می‌مانند. این مسئله به نام فرگمنت شدن (Fragmentation) نامیده می‌شود.

دو نوع فرگمنت شدن وجود دارند:

نوع فرگمنت شدن توضیح
فرگمنت شدن بیرونی در این حالت فضای کلی حافظه برای تأمین یک درخواست یا جایگیری یک پردازش کافی است؛ اما از آن جا که فضای حافظه پیوسته نیست، نمی‌تواند بدین منظور مورد استفاده قرار گیرد.
فرگمنت شدن درونی در این حالت، بلوک‌های حافظه تخصیص یافته به یک پردازش، بزرگ‌تر است. در این حالت بخشی از حافظه بی‌استفاده مانده است و از این رو نمی‌تواند از سوی پردازش‌های دیگر استفاده شود.

در نمودار زیر نشان داده شده است که چگونه فرگمنت شدن می‌تواند منجر به اتلاف حافظه شود و همچنین می‌بینیم که چگونه تکنیک فشرده‌سازی می‌تواند برای آزادسازی حافظه فرگمنت شده مورد استفاده قرار گیرد:

فرگمنت شدن بیرونی را می‌توان به وسیله روش‌های فشرده‌سازی (compaction) یا در هم سازی (shuffle) محتوا برای جای دادن همه حافظه آزاد در یک بلوک بزرگ کاهش داد. برای این که بتوان از تکنیک فشرده‌سازی استفاده کرد، باید از relocation دینامیک استفاده کرد.

صفحه‌بندی (Paging)

یک رایانه می‌تواند مقدار حافظه‌ای بیشتر از آن چه روی آن نصب شده است را آدرس‌دهی کند. حافظه بیشتری که در واقع حافظه مجازی نامیده می‌شود بخشی از هارددیسک است که برای تقلید RAM رایانه اختصاص یافته است. تکنیک صفحه‌بندی نقش مهمی در پیاده‌سازی حافظه مجازی دارد.

صفحه‌بندی تکنیک مدیریت حافظه‌ای است که در آن فضای آدرس پردازش به بلوک‌هایی با اندازه یکسان به نام صفحه (page) تقسیم می‌شود. اندازه این صفحه‌ها از توان 2 است و بین 512 بایت و 8192 بایت است. اندازه پردازش بر اساس تعداد صفحه‌ها اندازه‌گیری می‌شود.

به طور مشابه حافظه اصلی به بلوک‌های با اندازه ثابت کوچکی از حافظه فیزیکی تقسیم می‌شود که فریم (frame) نامیده می‌شود و اندازه یک فریم به همان اندازه یک صفحه حفظ می‌شود تا کارکرد بهینه‌ای از حافظه اصلی داشته باشد و از فرگمنت شدن بیرونی اجتناب شود.

ترجمه آدرس

آدرس صفحه به نام آدرس منطقی نامیده می‌شود و با شماره صفحه (page number) و افست (offset) نمایش می‌یابد.

Logical Address = Page number + page offset

آدرس فریم به نام آدرس فیزیکی نامیده می‌شود و به وسیله شماره فریم (frame number) و افست مشخص می‌شود.

Physical Address = Frame number + page offset

ساختمان داده‌ای که جدول نگاشت صفحه (page map table) نامیده می‌شود، نیز برای ردگیری رابطه بین یک صفحه از پردازش به یک فریم در حافظه فیزیکی مورد استفاده قرار می‌گیرد.

وقتی سیستم یک فریم را به صفحه‌ای تخصیص می‌دهد، آدرس منطقی‌اش را به آدرس فیزیکی ترجمه می‌کند تا مدخلی در جدول صفحه ایجاد کند که در سراسر زمان اجرای برنامه مورد استفاده قرار خواهد گرفت.

وقتی یک پردازش قرار است اجرا شود، صفحه‌های متناظر آن در فریم‌های موجود حافظه بارگذاری می‌شوند. فرض کنید برنامه‌ای با حجم 8 کیلوبایت داشته باشید؛ اما حافظه شما در هر زمان می‌تواند صرفاً 5 کیلوبایت تخصیص دهد، در این صورت مفهوم صفحه‌بندی مورداستفاده قرار می‌گیرد. زمانی که مقدار RAM رایانه پایان می‌یابد، سیستم عامل صفحه‌های بیکار یا ناخواسته حافظه را به روی دیسک منتقل می‌کند تا RAM برای پردازش‌های دیگر آزاد شود و آن‌ها را مجدداً در زمان نیاز از سوی برنامه گرد هم می‌آورد.

این فرایند در طی کل زمان اجرای برنامه که سیستم عامل صفحه‌های بیکار را از حافظه اصلی خارج می‌کند و آن‌ها را در حافظه ثانویه می‌نویسد تداوم می‌یابد.

مزایا و معایب صفحه‌بندی

در ادامه فهرستی از مزایا و معایب صفحه‌بندی را بررسی می‌کنیم:

  • صفحه‌بندی، فرگمنت شدن بیرونی را کاهش می‌دهد؛ اما همچنان از فرگمنت شدن درونی رنج می‌برد.
  • صفحه‌بندی، پیاده‌سازی آسانی دارد و به عنوان روش کارآمدی برای مدیریت حافظه نگریسته می‌شود.
  • به دلیل اندازه یکسان صفحه‌ها و فریم‌ها، سواپ کردن بسیار آسان است.
  • جدول صفحه، نیازمند فضای حافظه مازادی است و از این رو ممکن است برای سیستمی که RAM کوچکی دارد مناسب نباشد.

سگمنت کردن (Segmentation)

سگمنت کردن یک تکنیک مدیریت حافظه است که در آن هر وظیفه به چند سگمنت با اندازه‌های مختلف تقسیم می‌شود. یک سگمنت برای هر ماژول تشکیل می‌شود که شامل تکه‌هایی برای اجرای کارکردهای مرتبط است. هر سگمنت در عمل یک فضای آدرس منطقی متفاوت از برنامه است.وقتی یک پردازش قرار است اجرا شود، سگمنت‌های متناظر آن درون حافظه غیر پیوسته بارگذاری می‌شود؛ اما هر سگمنت در بلوک پیوسته‌ای از حافظه موجود بارگذاری می‌شود.

مدیریت حافظه سگمنتیشن در فرایند کاملاً شبیه صفحه‌بندی عمل می‌کند؛ اما در این روش سگمنت‌ها دارای طول متغیر هستند؛ در حالی که در روش صفحه‌بندی، صفحه‌ها اندازه ثابتی دارند.

یک سگمنت برنامه شامل تابع اصلی برنامه، تابع‌های کاربردی، ساختمان‌های داده و مواردی از این دست است. سیستم عامل یک جدول نگاشت سگمنت برای هر پردازش نگهداری می‌کند و لیستی از بلوک‌های حافظه آزاد را همراه با عددهای سگمنت، اندازه آن‌ها و مکان‌های متناظر حافظه اصلی در آن قرار می‌دهد. جدول در هر سگمنت آدرس‌های آغازین سگمنت و طول سگمنت را نگهداری می‌کند. یک ارجاع به موقعیت حافظه شامل مقداری است که یک سگمنت و یک افست را تعیین می‌کند.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

بر اساس رای 7 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *