سلام
ضمن تایید صحیت های دوستمان am_merman01، میتوانم اضافه کنم...
در عمل برای اجرای هر برنامه ای یک بخش از RAM کدهای دستورات برنامه بارگذاری میشود
و بطور معمول، دو بخش از RAM به ذخیره متغییرها و داده تخصیص داده میشود.
یک بخش که با نام حافظه STACK شناخته میشود و مختص هرریسمان/Thread است و متغییرهای struct ای هر تابع در آن ذخیره میشود.
یک بخش دیگر با نام حافظه HEAP شناخته میشود و داده های class برنامه در آن ذخیره میشود.
داده ها در STACK بطور کامل پشت سرهم ذخیره میشوند و در شروع هر تابع STACK پرتر و در پایان هر تابع خالی تر میشود.
اگر شما توابعی را پشت سر هم به تعداد زیاد فراخوانی کنید و هیچ کدام تمام نشود و مجدد تابع بعدی را اجرا کنید، خطای مشهور Stack-Overflow را دریافت خواهید کرد که به پر شدن STACK اشاره دارد.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این که واقعا داده های شما دقیق در کدام آدرس RAM ذخیره شود مشخص نیست و حتی بین هر اجرا متفاوت است.
بستگی به مدیریت حافظه سیستم عامل دارد که در لحظه اجرا ، کجای RAM خالی باشد و آن را به برنامه ها قرض دهد.
با فعال سازی unsafe در سی-شارپ میتوانید کد زیر را اجرا کنید که آدرس واقعی را در می آورد و مشاهده میکنید درهر اجرا فرق میکند.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی این را هم عرض کنم که واژه "تصادفی" در RAM بیشتر به کلمه "دلخواه" دلالت دارد.
قدیم برخی حافظه ها مانند نوارهای مغناطیسی Tape رایج تر بودند الان هم برای پشتیبان گیری انبوه اطلاعات وبرای طولانی مدت هنوز استفاده میشوند.
ساختار این حافظه ها "ترتیبی" بوده ، زیاد وارد بحث نشوم ، یعنی نمیشود یک دفعه شما بگویید من بایت 1000000 ام Tape را میخواهم... ... ...
ولی در RAM شما میتوانید در هرلحظه و "تصادفی/دلخواه" به هر نقطه ای دسترسی پیدا کنید. یعنی یک لحظه میتوانید بایت 100 ام را بخوانید و در لحظه بعد میتوانید بایت 1000000 ام را تغییر دهید و...
نوشته شده توسط
vb.civil
وقتی یه متغییر مثلا از نوع Integer تعریف میکنم و مقداری رو در اون میزارم این مقدار چه جوری و به چه شکل و در کجای حافظه ی RAM نوشته میشه ؟
بطور عادی اگر این متغییر را درون یک تابع/متد تعریف کنید.
این متغییر در شروع تابع (در دات نت 4 بایت) از حافظه STACK بصورت معکوس میگیرد.
عدد 305419896 برابر 0x12345678 در مبنای 16 است.
یعنی اگر عدد 0x12345678 درون این int باشد، بایت های 0x78 و بعد 0x56 و بعد 0x34 و بعد 0x12 درون STACK خواهند نشست.
نوشته شده توسط
vb.civil
تبدیل اعداد به مبنای 2 و مبنای 16 در کامپوتر برای چیست و به چه معناست ؟
چون ذات رایانه 1 و 0 است.
اعداد هم در سلول های RAM و هارد و سی.دی و... واقعا بصورت رشته ای از یک ها و صفرها ذخیره میشود.
پس با دیدن باینری(مبنای 2) اعداد میتوان درک بهتری از برخی دستورات داشت.
ارزش مبنای 16 هم از این بابت است که بدلیل آنکه 16 توان صحیح از 2 است ، تبدیل یا نمایش مبنای 2 و 16 به یکدیگر بسیار ساده است و حتی ذهنی هم میتوان اعداد مبنای 2 و 16 را به هم تبدیل کرد...
الان نمیخواهم اطاله کلام کنم، ولی بدانید تبدیل فوق ساده ای دارد، پس یک بایت را بجای 8 رقم باینری ، میتوان در دو رقم هگزادسیمال نمایش داد.
هر دو رقم مبنای 16 معادل یک بایت را نمایش میدهد.
در همین مثال قبل اگر شما عدد 305419896 را در 4 بایت ذخیره کنید به خروجی زیر خواهید رسید:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی عدد بزرگ 305419896 در غالب چهار بایت کوچک 120 و 86 و 52 و 18 در حافظه ذخیره میشود!
خیلی معنی خاصی ندارد؟ درست است؟
ولی اگر به این اعداد باچشم هگزادسیمالی نگاه کنیم ، خواهیم دید معنی خیلی منطقی دارد
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با دید مبنای 16 کاملا مشخص است که عدد بزرگ 0x12345678 در چهار بایت شسته-رفته در RAM شکسته شده است.
همچنین برای اعمال فلاگی و ماسک و And و Or و Not و شیفت بیتی و... و... با تبدیل مبنای 16 میتوان بهتر عملی که در رایانه انجام میشود را درک کرد.
با تبدیل مبنای 16 برای خودمان، در واقع با چشم رایانه به این اعداد نگاه میکنیم.
نوشته شده توسط
vb.civil
به طور کلی دنبال نام درسی از رشته مهندسی نرم افزار هستم که راجع به این مسائل توضیح داده باشه
دوستمان am_merman01 هم اشاره ای کردند.
نزدیک ترین مبحث دانشگاهی واحد "ساختمان داده ها" است که در مقاطع مختلف شاخه نرم افزار دوباره و دوباره تدریس میشود.
که البته باید عرض کنم خیلی هم عمیق وارد نمیشوند ولی اگر خودتان کتابهایی با این عنوان را تهیه و مطالعه کنید، شاید به جواب هایتان برسید.
موفق باشید.