تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 2 از 2

نام تاپيک: malloc و عدم وجود سیستم عامل

  1. #1
    کاربر فعال تالار .Net Msba's Avatar
    تاريخ عضويت
    Dec 2006
    محل سكونت
    ! My Mind
    پست ها
    506

    14 malloc و عدم وجود سیستم عامل

    سلام.
    یک سوال برام پیش اومده که مربوط میشه به میکروکنترلر ها که سیستم عامل ندارند. پس اگر بخشی از برنامه حافظه بگیرد چند حالت می تواند بوجود می آید:
    1- حافظه در اختیار قرار می گیرد.
    2- حافظه برای ارائه وجود ندارد.
    3- حافظه فضا دارد ولی fragment هست.
    4- احتمال تداخل اشاره گر ها.
    حالت اول که عالی هست و مشکلی نخواهد بود. اگر حالت دوم شود می توان بررسی کرد و یک کاریش کرد.
    می خواهم بدانم حالت سوم اگر اتفاق بیافتد چه می شود؟ آیا یک اشاره گر null بر می گردد یا اینکه عمل خاصی اتفاق می افتد و یک اشاره گر صحیح بر می گردد و یا اینکه حالت 4 پیش می آید.

    ممنون.

  2. #2
    کـاربـر بـاسـابـقـه god of war 2's Avatar
    تاريخ عضويت
    Jun 2007
    پست ها
    585

    پيش فرض

    سلام.
    قبل از هر چیزی یک توضیح مختصر بدم در رابطه با تخصیص حافظه در سخت افزار های مختلف از جمله Microcontroller ها. هر سخت افزار جامعی متشکل از حداقل یک پردازنده و یک حافظه رم و قابلیت دریافت برنامه توسط یک زبان برنامه نویسی مانند C این توانایی رو داره که حافظه رم موجود رو آدرس دهی کنه و این عملیات لزوما ارتباطی با سیستم عامل مقیم روی اون سخت افزار یا اصلا نبودن سیستم عامل نداره. پس تا اینجا دو جواب مطرح میشه که باتوجه به مطلبی که گفتم جواب اول درست است.
    1- امکان آدرس دهی و استفاده از رم وجود دارد.
    2- ........................................... ندارد.

    اما میرسیم به اینکه آدرس دهی و عملیات تخصیص چگونه انجام میشود.(حتی بدون وجود سیستم عامل)
    میکروکنترلر ها بطور کلی و پایه شامل 2 نوع حافظه میباشند.
    1- حافظه FLASH که یک نوع حافظه Non-volatile هست یعنی قادر هست اطلاعات رو حتی در زمانی که اتصال برق قطع میباشد هم نگهداری کند.(برای مثال همین فلش مموری های معمول)
    2- حافظه RAM که از نوع Volatile هست و با قطع اتصال برق اطلاعات داخلش از بین میره.
    حافظه نوع اول معمولا برای نگهداری دستورالعمل های برنامه بکار میره و در برخی مواقع هم برای نگهداری مقادیر ثابت Constant از این حافظه استفاده میشه. معمولا این حافظه توسط برنامه نویس فقط قابلیت خواندن دارد و تنها زمانی بر روی آن عملیان نوشتن انجام میشود که کدها در حال قرار گرفتن روی آن هستند.با توجه به سوال ما با این حافظه زیاد کاری نداریم و سوال اصلی مربوط میشه به نوع بعدی.
    حافظه نوع دوم یا همان RAM. کاربرد و وظیفه اصلی این حافظه نگهداری مقادیر و متغییر های یک برنامه زمانی که آن برنامه در حال اجرا هست میباشد. در محیط اجرایی زبان C این حافظه تشکیل میشه از متغییر های نوع static, فضای heap و stack .
    زبان C دارای یک مدل حافظه زمان اجرا میباشد که به آن C Runtime Memory Model گفته میشود و در هر محیطی که قابلیت نوشتن برنامه به زبان C باشد این مدل زمان اجرا نیز وجود دارد و به نوعی جزئی از استاندارد این زبان محسوب میشود. این مدل میتواند به 3 جزء اصلی تقسیم شود که شامل متغییر های static / سراسری, فضای heap و stack میباشد این سه بخش تمام چیز هایی هستند که حافظه رم رو به اشتراک میگذارند.
    برای پیکربندی و مقدار دهی اولیه این مدل, کامپایلر کدهایی رو به فایل باینری برنامه شما اضافه میکند. این کدها که بخشی از محیط زمان اجرای C میباشد قبل از تابع main یعنی قبل از اجرای برنامه اجرا میشوند و عملیات تخصیص و آزاد کردن حافظه رو امکان پذیر میکنند.(در اصل کار با حافظه در میکروکنترولر توسط این قسمت انجام میشود و ارتباطی با سیستم عامل ندارد)
    این مدل زمان اجرا به درستی میتواند حافظه heap رو توسط دستورهای مربوطه مثل malloc تخصیص و یا آزاد کند ولی باتوجه به اینکه حافظه رم بر روی میکروکنترولر ها بسیار محدود میباشد ممکن است شرایطی پیش بیاید که باعث برخورد دو بخش heap و stack بشود. در این شرایط برنامه نویسان ناچارند تا مصرف حافظه heap رو به حداقل برسانند.
    اما در رابطه با fragment شدن حافظه میشه گفت که جلوگیری از این کار در حقیقت در سطح بالاتری از تخصیص حافظه صورت میگیره به زبان ساده یعنی تمام تخصیصها و آزاد کردن ها باید توسط یک مدیر حافظه صورت بگیره تا از fragment شدن حافظه جلوگیری بشه. تقریبا اینجا میتونیم روی سیستم عامل حساب کنیم یعنی یک سیستم عامل وظیفه داره تا با یک برنامه مشخص حافظه رو مدیریت کنه تا از fragment شدن اون جوگیری کنه. اما بر روی میکروکنترولر ها و در شرایط عدم وجود سیستم عامل این وظیفه برنامه نویس هست که یک مدیر حافظه با توجه به نیازهاش پیاده سازی کنه.
    خوب فکر میکنم مطلب طولانی شد و بنده هرچقدر سعی کنم موضوع رو باز تر کنم طولانی تر میشه که متاسفانه وقت زیادی میخواد. از توضیح موارد پایه مثل heap و stack و نحوه قرار گیری در حافظه و ... صرف نظر کردم چون مبحث خیلی طولانی میشد و امیدوارم که دوستان با این مباحث آشنایی قبلی داشته باشند.
    اگر سوالی براتون پیش امد بگید سعی میکنم در اولین موقعیت پاسخ بدم.
    سال نو همگی مبارک باشه.

  3. 2 کاربر از god of war 2 بخاطر این مطلب مفید تشکر کرده اند


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •