مدیریت حافظه (Memory Management) یکی از وظایف اصلی سیستم عاملسیستم عامل چیست به زبان ساده، چرا باید از OS استفاده کنیم؟این مقاله عالی به معرفی سیستم عامل (Operating System|OS) به زبان ساده پرداخته، همچنین بررسی کرده که چرا باید از سیستم عامل استفاده کنیم است که در آن، حافظه اصلی (Primary) مدیریت میشود؛ به این صورت که فرآیندها یا Processها بین حافظه اصلی و حافظه دیسک جابجا میشوند. در فرآیند مدیریت حافظه، تمامی قسمتهای حافظه (Memory Location) زیر نظر سیستم عامل است، صرفنظر از این که آن بخش از حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روشهای آدرس دهی کش، نگاشت آدرس و موارد دیگر میپردازیم به فرآیندی تخصیص داده شده باشد یا خیر؛ همچنین تصمیمگیری دربارهی این که چه میزان حافظه در چه زمانی باید به یک فرآیند تخصیصداده شود نیز بر عهدهی این قسمت است. این عمل دائماً در حال انجام است و حافظهای که به یک فرآیند تخصیصداده میشود و یا از آن پسگرفته میشود همیشه در حال بهروزرسانی است. با ما همراه باشید تا در ادامهی مقاله به مفاهیم اصلی و پایه مدیریت حافظه در سیستم عامل بپردازیم.
فضای آدرس فرآیند
فضای آدرس فرآیند یا Process Address Space در واقع مجموعهای از آدرسهای منطقی است که فرآیندها در کدهای خود به آن ارجاع میدهند؛ به عنوان مثال وقتی از یک سیستم آدرس 32 بیتی استفاده میکنیم، آدرس ما میتواند 2 به نمای 31 حالت مختلف داشته باشد. همانطور که گفته شد، آدرسهایی که ارجاع داده شده، فیزیکی نیستند، بلکه منطقی هستند. وظیفهی نگاشت یا مپکردن یک آدرس منطقی به آدرس فیزیکی در زمان تخصیص حافظه به یک برنامه، بر عهدهی سیستم عامل است. به طور کلی قبل و بعد از تخصیص حافظه، 3 نوع آدرس داریم که در لیست زیر آنها را مشاهده میکنید:
- آدرسهای نمادین (Symbolic Addresses): این نوع آدرسها در سورس کد (Source Code)سورس کد چیست؟ آیا سورس کد یا سورس برنامه قابلیت اجرا دارند؟این مقاله عالی به سورس کد یا سورس برنامه پرداخته؛ همچنین به بررسی اهداف سورس کد، نحوه ساخت سورس کد و اینکه آیا سورس کد ها قابلیت اجرا دارند پرداختهها استفاده میشوند. نام متغیر متغیر در برنامه نویسی چیست ⚡️انواع متغیر در برنامه نویسیاین صفحه عالی بررسی کرده متغیر در برنامه نویسی چیست و انواع متغیر در برنامه نویسی را معرفی و مراحل کار با متغیر، نحوه تعریف و قوانین نامگذاری متغیرها را گفته ها و ثابتها از المانهای اصلی فضای آدرس نمادین هستند.
- آدرسهای نسبی (Relative Addresses): در زمان کامپایل کد، کامپایلر، آدرسهای نمادین را به آدرسهای نسبی تبدیل میکند.
- آدرسهای فیزیکی (Physical Addresses): بخش بارگذار یا همان Loader، این آدرسها را موقعی که برنامه داخل حافظه اصلی بارگذاری شد، تولید میکند.
آدرسهای فیزیکی و مجازی در زمان کامپایل و بارگذاری یکسان هستند، اما در زمان اجرا با یکدیگر تفاوت دارند. در این جا 2 اصطلاح کاربردی وجود دارد؛ به تمامی آدرسهای منطقی که توسط برنامه به آن ارجاع داده شده، Logical Address Space و به تمامی آدرسهای فیزیکی مربوط به این آدرسهای منطقی، Physical Address Space گفته میشود.
واحد مدیریت حافظه
نگاشت آدرس مجازی به آدرس فیزیکی توسط واحد مدیریت حافظه یا Memory Management Unit که به اختصار به آن MMU میگویند و در واقع یک سخت افزارسخت افزار چیست - بررسی اجزای اصلی سخت افزار کامپیوتردر این صفحه بررسی شده که سخت افزار چیست و سخت افزار کامپیوتر به زبان ساده معرفی شده است، همچنین به بررسی اجزای اصلی سخت افزار کامپیوتر پرداخته شده است است انجام میشود. MMU از مکانیزمهای زیر برای تبدیل آدرس مجازی به آدرس فیزیکی استفاده میکند:
- مقدار موجود در ثبات پایه (Base Register) به تمامی آدرسهای تولید شده توسط فرآیند کاربر اضافه میشود؛ بنابراین این مقدار به صورت یک نقطهی شروع یا Offset عمل میکند؛ به عنوان مثال فرض کنید مقدار ثبات پایه برابر 5000 باشد، اگر کاربری تلاش کند تا آدرس مکان 20 را استفاده کند، مکان آدرس تخصیص داده شده به صورت پویا برابر 5020 خواهد شد.
- برنامهها همیشه با آدرس مجازی سر و کار دارند و هیچ موقع آدرس فیزیکی را مشاهده نخواهند کرد.
بارگذاری ایستا در مقابل پویا
به طور کلی 2 روش بارگذاری وجود دارد، بارگذاری ایستا و بارگذاری پویا. انتخاب بین بارگذاری ایستا و پویا در زمان توسعهی برنامه مشخص میشود. در بارگذاری پویا، تمامی بخشهای برنامه به طور کامل در زمان کامپایل، کامپایل میشوند و هیچگونه لینک خارجی به برنامه یا ماژولهای خارجی در کار نخواهد بود، بدین صورت تمامی وابستگیها (Dependency) به صورت یکپارچه درون خود برنامه قرار میگیرند؛ اما در بارگذاری پویا قضیه کمی متفاوت است، ممکن است وسط اجرای برنامه بخواهیم به یک ماژول خارجی دسترسی پیدا کنیم، در این صورت دیگر امکان ایجاد یکپارچهسازی برنامه وجود ندارد و باید در زمان استفاده از ماژول خارجی، بارگذاری انجام شود؛ بنابراین در بارگذاری پویا، تنها برنامه مورد نظر، کامپایل شده و دسترسی به ماژولهای خارجی، تنها به صورت ارجاع باقی میمانند و تمامی مراحل باقی مانده در زمان اجرا انجام میشوند. لازم است بدانید در زمان بارگذاری به صورت ایستا، تمامی برنامه و دادههای مربوطه داخل حافظه بارگذاری میشوند؛ اما در بارگذاری پویا، کتابخانهها و ماژولهای پویا داخل دیسک قرار میگیرند و در زمان نیاز برنامه به آنها، داخل حافظه بارگذاری میشوند.
لینککردن ایستا در مقابل پویا
همانطور که پیشتر گفته شد، در بارگذاری به صورت ایستا، لینک کننده یا Liner، تمامی ماژولهای خارجی را با برنامه ادغام کرده و به صورت یکپارچه در میآورد تا هیچ وابستگی در حین اجرای برنامه وجود نداشته باشد. زمانی که از لینک کردن پویا استفاده میشود، نیازی به لینک کردن ماژولها و کتابخانهها با برنامه را نداریم؛ در عوض تنها ایجاد ارجاعی به آنها در زمان کامپایل کافی است. Dynamic Link Libraries یا DLL در ویندوز و Shared Objects در یونیکس از جمله مثالهایی برای کتابخانههای پویا هستند.
مبادله یا Swapping
مبادله یا سواپینگ یک مکانیزمی است که در آن، فرآیندها به صورت موقت از حافظه اصلی به داخل حافظه ثانویه (دیسک) Swap یا مبادله میشوند. به وسیلهی این کار، میزان حافظه افزایش پیدا میکند و در دسترس بقیهی فرآیندها قرار میگیرد. در زمانهای دیگر، مجدداً فرآیندها از حافظه ثانویه به داخل حافظه اصلی Swap میشوند. به طور کلی، سواپ کردن بر روی پرفورمنس سیستم تاثیر میگذارد و باعث کند شدن میشود؛ اما برای این که بتوانیم چندین فرآیند را به صورت موازی (Parallel) پردازش کنیم، چارهای جز این کار نداریم.
زمان کلی (Total Time) سپری شده توسط تکنیک Swapping شامل زمان انتقال از حافظه اصلی به حافظه ثانویه به علاوهی زمان کپی کردن فرآیند از داخل حافظه ثانویه به داخل حافظه اصلی و همچنین زمان به دست گرفتن حافظه اصلی میباشد. فرض کنید حجم فرآیند کاربر 3072 کیلوبایت است و سرعت یک هارد دیسک در زمان سواپ کردن 1 مگابایت در ثانیه است. در نتیجه زمان کلی فرآیند سواپ 1536 کیلوبایت از فرآیند به صورت زیر محاسبه میشود:
3072KB / 1536KB Per Second = 2 Seconds or 2000 Milliseconds
تخصیص حافظه
حافظه اصلی معمولاً از دو قسمت تشکیل شده است:
- حافظه سطح پایین (Low Memory): پردازشهای سیستم عامل در این قسمت قرار دارند.
- حافظه سطح بالا (High Memory): پردازشهای فرآیندهای کاربر در این قسمت قرار دارند.
مکانیزم تخصیص حافظه توسط سیستم عامل به صورت زیر است:
- تخصیص تک پارتیشنی (Single-Partition Allocation): در این رویکرد، از یک طرحی با نام Relocation-Register استفاده میشود که در آن از فرآیندهای کاربران در مقابل همدیگر محافظت میشود تا داده یا کدی تغییر نکند.
- تخصیص چند پارتیشنی (Multiple-Partition Allocation): در این رویکرد، حافظه اصلی به پارتیشنها یا قسمتهایی با اندازههای ثابت تقسیم میشود، به صورتی که هر پارتیشن تنها میتواند یک فرآیند را نگهداری کند. وقتی یک پارتیشن آزاد بود، فرآیندها میتوانند (از طریق الگوریتمالگوریتم چیست به زبان ساده و با مثال های فراواندر این مقاله به زبان بسیار ساده و با مثال های متعدد توضیح داده شده که الگوریتم چیست و چه کاربردهایی داردهای نوشته شده) داخل این پارتیشنهای آزاد بارگذاری شوند و زمانی که کارشان به پایان رسید، از پارتیشن خارج شوند و آن را برای فرآیندهای دیگر آزاد بگذارند.
قطعه قطعه شدن (Fragmentation)
زمانی که فرآیندها به داخل حافظه بارگذاری شده و حذف میشوند، فضای خالی به تکههای کوچکی شکسته میشود؛ این امر به دلیل حجم متفاوت فرآیندها اتفاق میافتد. وقتی زمان بگذرد و تعداد زیادی فرآیند وارد و خارج شوند، قسمتهای کوچکی از حافظه به وجود میآید که به دلیل ناپیوسته بودن، بلااستفاده باقی میماند؛ به این مشکل به اصطلاح قطعه قطعه شدن یا Fragmentation میگویند. به طور کلی، قطعه قطعه شدن به دو صورت وجود دارد:
- قطعه قطعه شدن خارجی (External Fragmentation): در این حالت، کل فضای خالی حافظه به اندازهای است که جوابگوی نیاز فرآیند باشد، اما این فضای خالی به طور پیوسته نیست؛ بنابراین قابل استفاده نمیباشد.
- قطعه قطعه شدن داخلی (Internal Fragmentation): در این حالت، میزان بلوکهای حافظه تخصیص داده شده به یک فرآیند بزرگتر از نیازش است، بنابراین بخشی از حافظه بلااستفاده مانده است، اما از آنجایی که آن بخش به فرآیندی تخصیص داده شده است، در نتیجه فرآیندهای دیگر نمیتوانند از آن استفاده کنند.
در تکنیکهای مربوط به مدیریت حافظه در سیستم عامل، تکنیکی با نام فشرده سازی یا Compaction وجود دارد که مشکل فرگمنت شدن را حل میکند؛ به این صورت که با جابجا کردن حافظههای تخصیص داده شده، فضاهای خالی را به صورت پیوسته کنار هم قرار میدهد. در تصویر زیر، حافظه قطعه قطعه شده را قبل و بعد از فشردهسازی مشاهده میکنید:
صفحهبندی (Paging)
یک کامپیوترکامپیوتر چیست؟ ⚡️ کامپیوتر چیست به زبان سادهاین مقاله عالی توضیح داده که کامپیوتر چیست و چه کاربردی دارد و همه چیز درباره کامپیوتر از جمله فواید کامپیوتر و تعریف کامپیوتر و اجزای آن را بیان کرده است میتواند میزان حافظهای، بیشتر از آن چیزی که به صورت فیزیکی در سیستم است را آدرسدهی کند؛ به این حافظه اضافی، به اصطلاح حافظه مجازی یا Virtual Memory میگویند. این قسمت از حافظه در واقع بخشی است که هدف آن شبیهسازی RAMرم کامپیوتر چیست؟ رم کجاست؟ معرفی انواع رم (RAM) کامپیوتراین مقاله عالی به معرفی رم کامپیوتر پرداخته، همچنین بررسی کرده رم کامپیوتر (RAM : Random Access Memory) کجاست و انواع رم کامپیوتر را معرفی کرده است است. تکنیک صفحهبندی یکی از تکنیکهای مهمی است که برای پیادهسازی حافظه مجازی مورد استفاده قرار میگیرد. در واقع صفحهبندی یا همان Paging یکی از تکنیک های مدیریت حافظه است که در آن فضای آدرس به بلاکهایی با اندازههای یکسان شکسته میشود که به آنها صفحه یا Page میگویند. اندازه این صفحات معمولاً مضربی از 2 و بین 512 بایت و 8192 بایت است. اندازهی کلی فرآیند براساس تعداد صفحات آن محاسبه میشود. به طور مشابه، حافظه اصلی نیز به بلاکهای کوچکتر و با اندازهی یکسان تقسیم میشود. به هر تکه از این بخشهای حافظه (فیزیکی) یک فریم (Frame) میگویند. برای جلوگیری از External Fragmentation، سایز فریمها نیز به اندازهی سایز صفحات انتخاب میشوند.
ترجمه آدرس (Address Translation)
آدرسهای صفحه با نام آدرسهای منطقی (Logical Address) شناخته میشوند و مقدار آنها با شمارهی صفحه و افست نمایش داده میشود:
Logical Address = Page Number + Page Offset
آدرسهای فریم با نام آدرسهای فیزیکی (Physical Address) شناخته میشود و مقدار آنها با شمارهی فریم و افست نمایش داده میشود:
Physical Address = Frame Number + Page Offset
در اینجا یک ساختمان دادهآموزش ساختمان داده و الگوریتمهر ساختمان داده یک نوع فرمت ذخیرهسازی و مدیریت دادهها در کامپیوتر است، که امکان دسترسی و اصلاح کارآمد آن دادهها را برای یکسری از الگوریتمها و کاربردها فراهم میکند، در این صفحه به بررسی و آموزش ساختمان داده و الگوریتم پرداخته شده استای وجود دارد به نام جدول نگاشت صفحات یا Page Map Table که از آن برای یافتن و بررسیکردن ارتباط بین یک صفحهی فرآیند و فریم مربوط به حافظه فیزیکی آن استفاده میشود. وقتی سیستم یک فریم را به هر صفحهی دلخواهی تخصیص داد، آدرس منطقی آن را به آدرس فیزیکی ترجمه میکند و یک مدخل (Entry) درون جدول صفحات میسازد که برای اجرای برنامه، مورد استفاده قرار میگیرد.
زمانی که یک فرآیند بخواهد اجرا شود، صفحات مربوط به آن، داخل فریمهای در دسترس حافظه بارگذاری میشوند. فرض کنید برنامهی شما 8 کیلوبایت باشد، اما حافظه شما تنها توانایی تخصیص 5 کیلوبایت به شما را در زمان مورد نظر دارد، در اینجا مفهوم صفحهبندی وسط میآید. وقتی میزان حافظه رم (RAM) کامپیوتری تمام شده باشد، سیستم عامل صفحاتی که بیکار ماندهاند را وارد حافظه ثانویه میکند تا فضای رم خالی شود و بقیهی فرآیندها بتوانند از حافظه رم استفاده کنند؛ سپس مجدداً در زمانهای دیگر آنها را به حافظه اصلی باز میگرداند.
مزایا و معایب صفحهبندی
در لیست زیر، مزایا و معایب تکنیک صفحهبندی به طور خلاصه آورده شده است:
- صفحهبندی، قطعه قطعه شدن خارجی را کاهش میدهد، اما همچنان قطعه قطعه شدن داخلی وجود دارد.
- پیادهسازی صفحهبندی ساده است و در واقع یک تکنیک مدیریت حافظه بهینه محسوب میشود.
- با توجه به همسان بودن اندازهی صفحات و فریمها، Swapping بسیار سادهتر میشود.
- Page Table نیاز به حافظه اضافه دارد، بنابراین برای سیستمی که حافظه رم پایینی دارد ممکن است مناسب نباشد.
قطعهبندی (Segmentation)
قطعهبندی یا سگمنتیشن یکی از تکنیکهای مدیریت حافظه است که در آن هر کار (Job) به قطعات کوچکتری با سایزهای متفاوت تقسیم میشود. در واقع، یک قطعه برای هر ماژول ایجاد میشود که شامل تکههایی برای اجرای توابع مرتبط است. در اینجا هر قطعه یا سگمنت دارای آدرس منطقی متفاوتی است. وقتی یک فرآیند اجرا میشود، قطعات مختلف مربوط به یک فرآیند که غیرپیوسته و جدا از هم هستند، داخل حافظه و به صورت بلاکهایی به هم پیوسته بارگذاری میشوند. سیستم مدیریت حافظه قطعهبندی، بسیار شبیه به سیستم صفحهبندی کار میکند؛ با این تفاوت که قطعات یا سگمنتها در اینجا میتوانند اندازهی متفاوتی داشته باشند و دیگر همانند صفحهها، اندازههای یکسان و ثابتی ندارند. یک سگمنت از برنامه، شامل تابع اصلی برنامه، توابع کمکی، ساختمان دادهها و... میباشد. وظیفهی مدیریت کردن جدول نگاشت سگمنتها برای تمامی فرآیندها و نگهداری لیست بلاکهای خالی حافظه همه و همه بر عهدهی سیستم عامل است. از دیگر وظایف سیستم عامل در قطعهبندی میتوان به نگهداری شماره سگمنتها، اندازهی آنها و مکان مربوط به آن در حافظه اصلی اشاره کرد. به ازای هر سگمنت، آدرس شروع و اندازهی سگمنت، درون جدول ذخیره میشود.
جمعبندی
مدیریت حافظه توسط سیستم عامل یکی از مباحث مهم در تئوریات کامپیوتر و مباحث سیستم عاملی محسوب میشود و از زمان به وجود آمدن کامپیوتر تاکنون، تکنیکهای مختلفی جهت مدیریت حافظه به وجود آمده است. یادگیری این مباحث برای مهندسین کامپیوتر یک امر مهم محسوب میشود؛ چرا که با فهم موارد مربوط به مدیریت حافظه و عملکرد سیستم عامل، میتوان از نحوهی کارکرد سیستم باخبر شد و توسعهی برنامههای کامپیوتری را در جهت بهبود کارایی کلی برنامه پیش برد. در این مقاله به طور کلی به مباحث پایه مدیریت حافظه توسط سیستم عامل پرداختیم و تکنیکهای مهمی که در این زمینه استفاده میشود را مرور کردیم.
مدیریت حافظه در سیستم عامل چیست؟
به طور خلاصه، مدیریت حافظه (Memory Management) یکی از عملکردهای اصلی سیستم عامل است که در آن حافظه اصلی (Primary) مدیریت میشود؛ به این صورت که فرآیندها (Processes) بین حافظه اصلی و حافظه دیسک جابجا میشوند.
چه تکنیکهایی در مدیریت حافظه استفاده میشود؟
تکنیکهای بسیاری برای مدیریت حافظه وجود دارد که از مهمترین آنها، میتوان به صفحهبندی (Paging)، قطعهبندی (Segmentation) و فشردهسازی (Compaction) اشاره کرد.
تفاوت قطعه قطعه شدن داخلی و خارجی چیست؟
قطعه قطعه شدن خارجی به بلاکهای کوچک و آزادی در سرتاسر حافظه گفته میشود که ناپیوسته هستند و تخصیص آنها به فرآیندها سخت و یا امکانپذیر نیست. قطعه قطعه شدن داخلی زمانی اتفاق میافتد که یک فرآیند مقدار بیشتر از میزان مصرف خود حافظه گرفته است که آن مقدار حافظه تخصیص داده شده، بلااستفاده مانده و در واقع هدر رفته است.