در این مطلب میخوایم Process ، Thread ، Virtual Memory ، ساختار های داده و فرایند اجرای یک برنامه رو باهم به زبان ساده و مختصر بررسی کنیم : وقتی یک برنامه اجرا میشه بهش پردازش یا Process گفته میشه (مثلا الان Notepad وقتی اجرا بشه و شما توش تایپ کنید یه پردازش محسوب میشه و میتونید از داخل Task Manager ببینیدش ) و هر برنامه از یک یا چند پردازش تشکیل شده ، هر نخ یا Thread میاد و یه قسمت از کد برنامه رو اجرا میکنه
و نخ اون چیزیه که سیستم عامل بهش پردازنده رو اختصاص میده برای محاسبه و در نهایت اجرا شدن برنامه ، هر پردازش ممکنه یک تا چند نخ داشته باشه که درست کار کنن و یا ممکنه این نخ ها باهم در تضاد باشن (چند تا نخ یک قسمت از کد رو اجرا کنن) که معمولا ساختار سیستم عامل و Memory Handling جلوگیری میکنه از تداخل نخ ها حافظه مجازی یه حافظه ایه که به صورت خیالی شکل میگیره برای هر پردازش تا اون پردازش بتونه توی محیط خودش فارغ از بقیه پردازش ها کارشو انجام بده ، ساختار داده مربوط به اطلاعاتی میشه که پردازش ها و نخ ها ازش استفاده میکنن و مربوطه به دیتاهاییه که ذخیره میشه ، مکان اون ها و...
گفتیم که به یک برنامه در حال اجرا پردازش یا Process میگن ، به تعریف دقیق تر پردازش یا process یک ظرف یا محتوا یا صندوق یا container هست و هر چیزی که برای اجرای یک برنامه نیازه داخل اون قرار میگیره ، هر اطلاعاتی که یه برنامه نیاز داره به اون برای اجرا شدن از قبیل کتابخونه یا library هایی که برنامه نیاز داره ، هر اطلاعاتی که مربوط میشه به اجرای نخ یا thread ها ، هر اطلاعاتی که مربوط به socket ها میشه (برای برقراری ارتباط با اینترنت ) ، open handles مثل mutexes و... و هر پردازش هم حافظه مجازی یا virtual memory خودشو داره که تمام اطلاعات اون برنامه داخل اون ذخیره میشه (حجمی مطابق حافظه اصلی کامپیوتر (4گیگ برای سیستم های 32 بیتی و..)) و هر پردازش شماره و شناسه منحصر به فرد خودشو داره که توسط اون شناسایی میشه
ما یه حافظه فیزیکی و واقعی داریم (فرض کنید مثلا یک رم داریم با ظرفیت 4 گیگ) و تمامی پردازش ها داخل این حافظه قرار دارن ویه ID یا شناسه خاصی دارن برای خودشون که توسط این عدد شناسایی میشن ، هر پردازش یک جا از حافظرو گرفته و هر پردازش فقط میتونه بخشی رو از مموری یا حافظه اصلی بخونه که مربوط به خودشه ، مثلا ما الان در این تصویر دوتا پردازش داریم با شناسه های متفاوت که درحال اجرا هستن ، هر کدوم حافظه مجازی خودشون رو دارن که این حافظه مجازی رو پردازنده و سیستم عامل برای اون پردازش اختصاص دادن
حالا هر پردازش هرچیزی که نیاز داره رو داخل این حافظه مجازی قرار میده و از داخل اون به تمام اطلاعات مورد نیازش دسترسی پیدا میکنه ، اطلاعاتی که داخل حافظه مجازی هستن درواقع بخشیشون در حافظه ram هست و بقیشون توی hard و به صورت رندوم قرار دارن ، ولی موقع خوندن اطلاعات ، یک mapper یا همون WMM ای که داخل عکس هست (همون فِلِش ها) میان و از داخل هارد اشاره میکنن به اطلاعات داخل حافظه اصلی یا همون رم
مثلا شما یه سیستم با رم 4 گیگ دارید و فتوشاپ و اکسل و چند تا نرم افزار رو باز میکنید ، سیستم میاد و به تک تک این برنامه ها یه حافظه مجازی به ظرفیت 4 گیگ اختصاص میده ، فرض کنید فتوشاپ 6 گیگ دیتا داره ، سیستم میاد و مثلا 2 گیگشو میزاره تو رم و 4 گیگ بقیشو میزاره تو هارد ، بعد میره اطلاعات رمو پردازش میکنه و بعد اینکه تموم شد تک تک 4 گیگ رو از هارد میریزه رو رم و پردازششون میکنه !
فرض کنید یک پردازش به یک کتابخونه داخل حافظه مجازی خودش نیاز داره ، وقتی که میخواد اون اطلاعاتو از حافظه مجازی بخونه ، ویندوز با استفاده از WMM میاد و اون اطلاعاتو براش از حافظه واقعی میاره ، خوبی حافظه مجازی اینه که هر پردازش در جای مخصوص خودش اجرا میشه ، یکی دیگه از قابلیتای حافظه مجازی ، Memory Protection هست : در حافظه مجازی ، هر قسمت از دیتا میتونه مجوز و سطح دسترسی خودشو داشته باشه
مثلا این بخش از حافظه فقط قابل خوندنه یا اون بخش از حافظه فقط قابل خوندن و اجراعه ولی قابل نوشتن نیست ! از اونور شما وقتی داخل حافظه مجازی خودتون هستید ، از طریق WMM فقط به اطلاعات حافظه مجازی خودتون در حافظه فیزیکی و واقعی دسترسی دارید و نمیتونید اطلاعات پردازش های دیگه رو داخل حافظه فیزیکی دست کاری کنید
با این حرکت خیلی از بدافزار ها قابلیت خودشونو از دست میدن ولی خیلی های دیگه هم از طریق های خاصی این قابلیت رو بایپس میکنن .. حجم حافظه مجازی برای هر پردازش عینا برابر حجم حافظه فیزیکیه (اگر مثلا رم 4 گیگ رو سیستم باشه و 10 تا پردازش در حال استفاده از این حافظه باشن ، 10 تا حافظه مجازی داریم با ظرفیت 4 گیگ )اگر مقدار دیتایی که وارد RAM یا همون حافظه فیزیکی ما میشه بیشتر از حجمش باشه ، حافظه مجازی اون دیتارو در هارد دیسک(HDD-SSD) ذخیره میکنه و WMM از اونجا اطلاعاتو میخونه
خب تا اینجا فهمیدیم که ما یه پردازش داریم که همه اطلاعات لازم برای اجرا رو توی خودش داره ، ولی اجرا از کجا اتفاق می افته ؟ نخ یا همون Thread این وظیفه رو بر عهده داره و میاد یه قسمت از کد رو اجرا میکنه (ممکنه یه Thread کل کد رو اجرا کنه
ممکنه یه قسمت رو اجرا کنه و بقیه قسمت های کد رو Thread های دیگه اجرا کنن یا ممکنه چند تا Thread بخوان یه قسمت از کد رو اجرا کنن ، فرض کنید یه دهن بخواد یه غذا رو بخوره ، ولی از اونور فرض کنید چند تا دهن میخواد یه غذا رو بخوره 😋. سیپیو های جدید میتونن چندین Thread رو همزمان اجرا کنن ولی سیپیو های قدیمی میامدن و Thread هارو یکی یکی اجرا میکردن، Thread ها میان و تمامی منابعی که پردازش ازش استفاده میکنه رو باهم به اشتراک میزارن ، مثل کتابخونه ها ، حافظه ، socket و ...)
مثلا فرض کنید یه کیلاگر روی سیستم هست ، یه Thread اون قسمت از کدی رو میخونه که منتظر تایپ شماست و اونارو ذخیره میکنه ، یه Thread اون کدی رو میخونه که Socket ای منتظر دریافت دستور از نویسنده اون کیلاگره ، یه Thread قسمتی از کدو میخونه که بعد دریافت مثلا 250 تا کلید ، یک ایمیل به نویسنده اون کیلاگر بفرسته و .. (اگر چند تا Thread یه برنامه رو اجرا کنه اون برنامه سریع تر اجرا میشه نسبت به اینکه یه Thread بخواد کل کد های برنامه رو اجرا کنه
وقتی یه پردازش چند تا Thread داره و پردازنده اون هارو اجرا میکنه ، هر کدوم از Thread ها به نحو خودشون توی ریجستر ها دست میبرن و مقادیر اون رو تغییر میدن ، مثلا پردازشی مثل Notepad اگر سه تا نخ داشته باشه و نخ اول مقدار eax رو تغییر بده ، نخ دوم اگر بیاد مقدار eax رو تغییر میده و نخ سوم باز مقدار eax رو مجددا تغیر میده و نخ اول اگر اجرا بشه مقدار eax رو میکنه همونی که خودش بوده
و شما با نگاه کردن به مقدار یک ریجستر در آخر اجرا نمیتونید بفهمید چند تا thread ران شده و.. ، پس وقتی پردازنده یک Thread رو اجرا کرد ، میاد و از تمامی ریجستر ها و مقادیر ها یه Snapshot میگیره و یه جا ذخیرش میکنه و میره سراغ Thread بعدی و اونو اجرا میکنه و در نهایت از اونم یه Snaptshot میگیره .... (در بحث DATA STRUCTURES بیشتر در مورد این ها صحبت میکنیم) و نخ ها حافظه جدای خودشونو ندارن و از حافظه مجازی ای که پردازششون استفاده میکنه استفاده میکنن ، و هر نخ ساختار حافظه خودشو داره (stack,resgiter)
مثلا در بالا در ستون های سمت چپ که یه پردازشو نشون میده با نخ تکی ، وقتی که نخ کد برنامه رو از قسمت text میخونه و میاد توی استک و دیتا هارو اجرا میکنه و میریزه و حذف میکنه و با ریجستر ها کار میکنه ، این حالت ساده و اولیه برنامه ها بوده ولی در ستون های سمت راست پردازشی رو نشون میده که توسط چند نخ داره اجرا میشه و هر نخ استک و ریجستر های خودشو داره (ولی تمام نخ ها کد رو از یه قسمت میخونن)
مثلا در اینجا وقتی دوتا نخ دارن کدی رو اجرا میکنن ، فرض کنید الان دوتا نخ یک قسمت از کد رو اجرا کنن (مثلا در مثال بالا روتین1) ، در پردازنده های جدید نخ ها باهم هماهنگ (Sync) میشن و در ویندوز دستوراتی هست که اگر چند تا نخ بخوان یک قسمت از کد رو اجرا کنن ، بزارنشون در صف و همزمان باهم اجرا نشن
در عکس بالا دیدید که پردازش یه سری اطلاعات ذخیره میکنه مثل شناسه پردازش ، کاربری که اونو اجرا کرده ، و... و نخ ها هم یه سری اطلاعات ذخیره میکنن و استک و ریجستر های خودشونو دارن ، ولی این اطلاعات دقیقا چی هستن و کجا ریخته میشن و ذخیره میشن ؟
ما دو دسته ساختارهای داده داریم که یه سریشون متعلق به ما هستن و یه سری دیگشون متعلق به سیستم عامل :
ساختارهای های داده ای که متعلق به ما هستن :
ساختارهای داده ای که متعلق به سیستم عامل هستن:
حالا میخوایم مراحل اجرای یک برنامه رو به طور ساده بیان کنیم :
فرض کنید میخواید ماشین حساب رو از My Computer اجرا کنید:
این اطلاعات خیلی مهمه برای یه متخصص تجزیه تحلیل کن بدافزار (تیم ابی) یا بدافزار نویس (تیم قرمز) چون بعدها میخواد Process Injection هارو بشناسه و اون هارو حتی بنویسه مثلا یکی از اون تکنیک ها Process Hollowing هست و بعدها واسه درک اون ها باید این هارو بلد باشه حجم اطلاعات بسیار زیادی بود ، واسه دونستن بعضی از این مفاهیم باید کلی پیش زمینه داشته باشید ولی اگر بعد چند بار خوندن نفهمیدیدشون حتما بپرسید :)
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)
کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود