تبلیغات
Notions Of Creation - حافظه پروسس ها در مینیکس

هیچ کاری بزرگی نیست مگر ایده ای قبل آن باشد

حافظه پروسس ها در مینیکس

نویسنده :Niko Bellic
تاریخ:سه شنبه 30 دی 1393-12:45 ق.ظ

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

همونطور که انتظار دارم بدونید  وقتی شما یه برنامه رو اجرا میکنید فایل برنامه شما در رم قرار میگیره (در مینیکس از دستور fork برای این کار استفاده میشه)

حالا نسخه ای از برنامه رو روی رم دارین که برای اجرا شدن اون(یعنی مفسر بیاد متن برنامه رو بخونه (مثلا در برنامه ای که با سی نوشته شده بیاد اینکلود ها رو احظار کنه و بعد از قسمت main شروع به اجرای دستورات کنه)) دستوری مشابه exec استفاده میشه.

این دستور کد رو اجرا کرده و به برنامه اجازه میده تغییر کنه.


حالا برگردیم به همون اول یعنی قرار گرفتن برنامه در حافظه.

و این بحث بسیار شیرینیه که در ادامه مطلب بهش میپردازیم


هسته سیستم عامل برای برنامه یه فضا در اختیار میگیره که احتیاجات اون رو رفع کنه.

حالا برنامه به چه فضایی نیاز داره؟

1)_ محیطی برای قرار گرفتن متن برنامه: برنامه ای که نوشته شده و میخواد اجرا باشه باید در رم قرار بگیره مثلا برنامه hello world به زبان سی رو که همتون بلدید! باید دقیقا در رم قرار بگیره تا مفسر با سرعت بالا بهش دسترسی پیدا کنه.


2)_محیطی برای داده های برنامه: فرض کنید برنامه تون قراره تعداد کلید های فشرده شده رو از زمان اجرا تا 10 ثانیه بعد رو چاپ کنه.

برای اینکار باید یه متغیر تعریف کنه و با هر بار فشرده شدن کلید یکی بهش اضافه کنه.

خوب! این عددی که در متغیر ذخیره میشه یه داده است و بالاخره باید یه جایی ثبت بشه. برای اینکار یه محیط به نام دیتا سگمنت به برنامه اختصاص میدیم.


3)_محیطی برای پشته برنامه: اگه در مورد توابع بازگشتی اطلاعات ندارید حتما سرچ بزنید.  وقتی برنامه میخواد ترتیبی از کارها رو انجام بده اونا رو در پشته قرار میده تا بعد یکی یکی از اونجا برداره.


حالا خودتون رو جای دستور fork بزارید. اول متن برنامه رو نگاه میکنید و میفهمید فلان قدر حجمشه. همون فلان قدر رو در رم در نظر گرفته و برنامه رو از حافظه فعلی(هارد دیسک یا فلاپی یا . . .)  روی رم کپی میکنید. حالا یه مقدار پیش فرض دارید برای که قراره پشته و داده دو تایی درش قرار بگیرن.

چیکار میکنید؟ حافظه بیشتر رو به کی میدید؟


طراحا اومدن از یه روش جالب استفاده کردن.

اونا این حافظه باقی مونده رو به اشتراک گذاشتن.

اینا اومدن پشته رو بالای بالای حافظه گذاشتن و رشدش رو به سمت پایین تعیین کردن.

یعنی اولین مقدار در بالا ترین ادرس حافظه قرار میگیره و بعد یکی پایین تر و بعدی هم همینطور تاااااا  بیاد برسه به متن برنامه که ته حافظه قرار گرفته(البته کنار هم بودن متن برنامه و داده ضروری نیست).

بعد این قسمت دیتا رو بالای همین قسمت متن برنامه گذاشتن و به بالا رشد میکنه یعنی میره به سمت پشته.

پشته هم که میاد پایین به سمت داده. و هر کدوم مقید شدن که اگه به دیگری رسیدن (پشته به بالا ترین عنصر داده یا داده به پایین ترین عنصر پشته) دیگه پیشرفت نکنن.

اینطوری هر کدوم میتونن بیشترین فضای خالی باقی مونده رو استفاده کنن.

البته دیتا برای افزایش باید با استفاده از دستور brk مقدار مورد نظر جهت افزایش یا کاهش رو دقیقا اعلام کنه.





Teresa
دوشنبه 25 اردیبهشت 1396 12:49 ق.ظ
I constantly spent my half an hour to read this blog's articles
or reviews all the time along with a cup of coffee.
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر