معماری پردازنده

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، در ادامه ی بحثی که اینجا میکردیم :

گفتگو هایی در باب سی شارپ

ببینید قبلا گفتید که پردازنده هر موقع تشخیص داد (معمولا موقعی که نخ رو متوقف کنیم یا به هر نحوی پردازنده حس کنه که نخ داره معطلش میکنه بیخودی و ...) ، یه نخ را رها میکنه ، نخ دیگه ای رو اجرا میکنه و بعد میاد ادامه ی نخ قبلی را اجرا میکنه (برداشت کلی رو گفتم)
خوب . حالا منظورتون اینه که این سوئیچ کردن بین نخ ها ، زمان درخواست پردازنده برای خوندن و نوشتن اطلاعات از رم ، اتفاق نمیافته . مثا زمانی که پردازنده درخواست خوندن اطلاعات متغییر x را از حافظه میده ، به طبع چون سرعت رم خیلی پایینه ، پردازنده باید منتظر بمونه . در این لحظه ای که منتظر خوندن (یا نوشتن) اطلاعات در رم هست ، دیگه نمیره نخ دیگه ای (از یه پروسه ی دیگه یا از همون پروسه) را اجرا کنه . منتظر میمونه تا اطلاعات از رم برسه و ادامه ی نخ را اجرا کنه . منظورتون اینه . درسته؟
اما زمانی سوئیچ بین نخ ها انجام میشه که غیر از زمان انتظار برای خوندن و نوشتن اطلاعات از رم باشه . مثلا وقتی خودمون نخ را متوقف کنیم . درسته؟
حالا فرض میکنم اینها درست باشن ؛ حالا زمان منتظر موندن پردازنده برای دریافت اطلاعات متغییر x (هر میلی یا میکروثانیه که هست ، باشه) ولی ما فرض میکنیم این زمان انتظار ، فرضا 10 ثانیه هست . توی این 10 ثانیه انتظار ، در task manager اینو نشون میده که اون نخ ، در حال اشغال یک هسته از پردازنده هست؟ مثلا اگه پردازنده 4 هسته ای باشه ، توی task manager اون نخ رو نشون میده که 25 درصد از پردازنده را اشغال کرد؟
 

the_king

مدیرکل انجمن
سلام
استاد علی ، در ادامه ی بحثی که اینجا میکردیم :

گفتگو هایی در باب سی شارپ

ببینید قبلا گفتید که پردازنده هر موقع تشخیص داد (معمولا موقعی که نخ رو متوقف کنیم یا به هر نحوی پردازنده حس کنه که نخ داره معطلش میکنه بیخودی و ...) ، یه نخ را رها میکنه ، نخ دیگه ای رو اجرا میکنه و بعد میاد ادامه ی نخ قبلی را اجرا میکنه (برداشت کلی رو گفتم)
خوب . حالا منظورتون اینه که این سوئیچ کردن بین نخ ها ، زمان درخواست پردازنده برای خوندن و نوشتن اطلاعات از رم ، اتفاق نمیافته . مثا زمانی که پردازنده درخواست خوندن اطلاعات متغییر x را از حافظه میده ، به طبع چون سرعت رم خیلی پایینه ، پردازنده باید منتظر بمونه . در این لحظه ای که منتظر خوندن (یا نوشتن) اطلاعات در رم هست ، دیگه نمیره نخ دیگه ای (از یه پروسه ی دیگه یا از همون پروسه) را اجرا کنه . منتظر میمونه تا اطلاعات از رم برسه و ادامه ی نخ را اجرا کنه . منظورتون اینه . درسته؟

به یک نکته مهم توجه کنید، پردازنده ممکنه چند هسته داشته باشه و هر هسته ممکنه قابلیت تقسیم شدن به هسته های مجازی داشته باشه. وقتی یک کدی در حال استفاده از گذرگاه داده ای است که فرضا به RAM ارتباط داره، کد دیگری همزمان نمیتونه این گذرگاه داده رو بکار ببره، اما میتونه کدی همزمان اجرا بشه که کاری با اون گذرگاه داده نداره. پس اینکه بگیم پردازنده منتظر میشه یا هسته منتظر میشه بستگی به معماری پردازنده و هسته هاش و کدهایی که در حال اجرا هستند داره. اگر نوبت اجرا کد هایی باشه که همه شون از گذرگاه داده خاصی استفاده می کنند، طبعا باید برای اجرای یک کد بقیه منتظر بمونند، هر چند تا نخ هم باشه هیچکدوم شرایط اجرای همزمان رو ندارن چون یک گذرگاه داده بین همه هسته ها مشترک ئه و همزمان قابل استفاده نیست.
این نکته رو از این جهت گفتم که نمی توانید حکم کنید چون پردازنده منتظر خوندن یا نوشتن اطلاعات در رم هست پس دیگه کد دیگه ای رو اجرا نمی تونه بکنه یا حتما کد دیگه ای رو اجرا میکنه. از طرف دیگه سوئیچ کردن بین نخ ها چیزی نیست که برای هر انتظار باید انجام بشه، اولا سوئیچ کردن بین نخ خودش سربار و معطلی داره و پردازنده نمیاد برای یک انتظار با زمان ناچیز یک سوئیچ با هزینه زمانی بیشتر رو انجام بده. ثانیا برای اجرای همزمان دو کد لازم نیست دو تا نخ وجود داشته باشه، اگه کد بعدی همون نخ ارتباطی با نتیجه کد قبلی نداشته باشه میتونه با شرایطی همزمان اجرا بشن، مثلا یکی شون یک مقدار 0 رو در حافظه بنویسه و یکی شون مقدار یک رجیستر رو یک واحد افزایش بده، اینها دو تا کد کاملا مستقل هستند که قرار بوده در یک نخ پشت سر هم اجرا بشن، اما میشه همزمان روی دو هسته مجازی اجرا بشه.

اما زمانی سوئیچ بین نخ ها انجام میشه که غیر از زمان انتظار برای خوندن و نوشتن اطلاعات از رم باشه . مثلا وقتی خودمون نخ را متوقف کنیم . درسته؟
در نظر بگیرید که توقف نخ دلایل و اشکال متفاوتی داره، و از طرف دیگه توقف دقیقا در هر لحظه که اراده کنین که اتفاق نمی افته. کد ها بصورت اتمیک اجرا میشه، مثل اتمیک بودن تراکنش بانکی. وقتی پول از حسابی به حساب دیگه منتقل میشه باید از حساب مبدا پولی کسر بشه و به حساب مقصد پولی اضافه بشه. وسط این دو تا مرحله توقف اتفاق نمی افته چون به اصطلاح این تراکنش بانکی اتمیک ئه. یعنی یا باید کامل انجام بشه یا اصلا نشه، وسط مراحل نمیتونه نیمه کاره قطع بشه. شما هم نمی توانید اجرا کد رو وسط یک انتظار نگه دارید. اون کد باید تا پایان انتظار و خاتمه کد ادامه پیدا کنه تا پشت سرش کدی اجرا بشه که فرضا نیت توقف اجرا رو داشته باشه.
حالا فرض میکنم اینها درست باشن ؛ حالا زمان منتظر موندن پردازنده برای دریافت اطلاعات متغییر x (هر میلی یا میکروثانیه که هست ، باشه) ولی ما فرض میکنیم این زمان انتظار ، فرضا 10 ثانیه هست . توی این 10 ثانیه انتظار ، در task manager اینو نشون میده که اون نخ ، در حال اشغال یک هسته از پردازنده هست؟ مثلا اگه پردازنده 4 هسته ای باشه ، توی task manager اون نخ رو نشون میده که 25 درصد از پردازنده را اشغال کرد؟
شرایطی که توصیف می کنید یک پردازنده است که 4 هسته داره، ولی نه معماری و تکنولوژی هاش مشخصه و نه روال کد های داخل اون یک نخ و نه تعداد و روال کد سایر نخ های در صف اجرا مشخصه. اینکه هسته پردازنده مشغول اجرای یک کد مرتبط با حافظه RAM باشه که فرضا 10 ثانیه طول می کشه مشکلی نیست، فرض ئه، مشکلی با 10 ثانیه اش ندارم، اما پردازنده ای که تصور کردید نمیتونه کد دیگری رو که کاری با حافظه RAM نداره اجرا کنه؟ اگه بتونه اجرا کنه که ممکنه حداقل 12.5 درصد اشغالی باشه. اگه قابلیتشو نداره حداقل 25 درصد ئه. شما نمی توانید برای محیطی با شرایط نامعین یک نتیجه مشخص تعیین کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
به یک نکته مهم توجه کنید، پردازنده ممکنه چند هسته داشته باشه و هر هسته ممکنه قابلیت تقسیم شدن به هسته های مجازی داشته باشه.
ممنونم از توضیحات مفصل تون استاد علی :rose:
منظورتون از هسته های مجازی ، همون نخ فیزیکی برای هر هسته هست دیگه؟ یعنی مثلا یه پردازنده ای که 2 هسته و 4 نخ فیزیکی داره (برای هر هسته ، دو نخ فیزیکی) مثل i3 4150 و ...
حالا اگه هسته ای ، قابلیت تقسیم شدن به هسته ی مجازی (نخ فیزیکی) را داشته باشه (یعنی ، یک هسته ، چند نخی باشه) ، چه فرقی داره؟ قبلا گفتید فرقی نداره با پردازنده ی معمولی (پردازنده هایی که به ازای هر هسته ، یک نخ دارن) جز اینکه سرعت سوئیچ کردن نخ ها (نخ های پروسه ها) در پردازنده های چند نخی ، سریع تره


وقتی یک کدی در حال استفاده از گذرگاه داده ای است که فرضا به RAM ارتباط داره، کد دیگری همزمان نمیتونه این گذرگاه داده رو بکار ببره، اما میتونه کدی همزمان اجرا بشه که کاری با اون گذرگاه داده نداره.

منظورتون از گذرگاه داده ای ، همون تعداد کانال های رم هست که پردازنده باهاش در تماس هه؟ مثلا اغلب مادربردها و پردازنده و رم های سوکت های معمولی امروزی ، دو کاناله (dual channel) هستن ، منظورتون اینه؟
اگه آره ، یعنی همزمان ، پردازنده ، فقط دو دستور را میتونه بخونه یا بنویسه؟ چون کم پیش میاد که کدی یا تابعی ، نخواد از رم اطلاعاتی بخونه یا بنویسه . وهمچنین بخاطر اینکه برای سوکت های معمولی ، دو کانال بیشتر وجود ندارن . پس ، یه پردازنده ی 4 هسته ای که 4 نخِ همزمان را میتونه اجرا کنه ، چی؟ چون نمیتونه همزمان 4 مقدار را از رم بخونه یا بنویسه در یک سوکت دو کاناله (البته این سئوالات در صورتی هه که جواب پاراگراف بالا ، درست باشه)


پس اینکه بگیم پردازنده منتظر میشه یا هسته منتظر میشه بستگی به معماری پردازنده و هسته هاش و کدهایی که در حال اجرا هستند داره. اگر نوبت اجرا کد هایی باشه که همه شون از گذرگاه داده خاصی استفاده می کنند، طبعا باید برای اجرای یک کد بقیه منتظر بمونند، هر چند تا نخ هم باشه هیچکدوم شرایط اجرای همزمان رو ندارن چون یک گذرگاه داده بین همه هسته ها مشترک ئه و همزمان قابل استفاده نیست.
این نکته رو از این جهت گفتم که نمی توانید حکم کنید چون پردازنده منتظر خوندن یا نوشتن اطلاعات در رم هست پس دیگه کد دیگه ای رو اجرا نمی تونه بکنه یا حتما کد دیگه ای رو اجرا میکنه. از طرف دیگه سوئیچ کردن بین نخ ها چیزی نیست که برای هر انتظار باید انجام بشه، اولا سوئیچ کردن بین نخ خودش سربار و معطلی داره و پردازنده نمیاد برای یک انتظار با زمان ناچیز یک سوئیچ با هزینه زمانی بیشتر رو انجام بده.
آها ممنون

ثانیا برای اجرای همزمان دو کد لازم نیست دو تا نخ وجود داشته باشه، اگه کد بعدی همون نخ ارتباطی با نتیجه کد قبلی نداشته باشه میتونه با شرایطی همزمان اجرا بشن، مثلا یکی شون یک مقدار 0 رو در حافظه بنویسه و یکی شون مقدار یک رجیستر رو یک واحد افزایش بده، اینها دو تا کد کاملا مستقل هستند که قرار بوده در یک نخ پشت سر هم اجرا بشن، اما میشه همزمان روی دو هسته مجازی اجرا بشه.
عجیبه !
اصلا پردازنده از کجا میدونه که کدوم کد نتیجه اش به کدوم کدِ دیگه ربط داره یا نه؟ اونم قبل از اجرا
هر چند فکر کنم کم پیش بیاد (اگه این قضیه ، توضیح زیادی لازم داره ، لازم نیست توضیح بدین استاد علی)


در نظر بگیرید که توقف نخ دلایل و اشکال متفاوتی داره، و از طرف دیگه توقف دقیقا در هر لحظه که اراده کنین که اتفاق نمی افته. کد ها بصورت اتمیک اجرا میشه، مثل اتمیک بودن تراکنش بانکی. وقتی پول از حسابی به حساب دیگه منتقل میشه باید از حساب مبدا پولی کسر بشه و به حساب مقصد پولی اضافه بشه. وسط این دو تا مرحله توقف اتفاق نمی افته چون به اصطلاح این تراکنش بانکی اتمیک ئه. یعنی یا باید کامل انجام بشه یا اصلا نشه، وسط مراحل نمیتونه نیمه کاره قطع بشه. شما هم نمی توانید اجرا کد رو وسط یک انتظار نگه دارید. اون کد باید تا پایان انتظار و خاتمه کد ادامه پیدا کنه تا پشت سرش کدی اجرا بشه که فرضا نیت توقف اجرا رو داشته باشه.
آها ممنون

شرایطی که توصیف می کنید یک پردازنده است که 4 هسته داره، ولی نه معماری و تکنولوژی هاش مشخصه و نه روال کد های داخل اون یک نخ و نه تعداد و روال کد سایر نخ های در صف اجرا مشخصه. اینکه هسته پردازنده مشغول اجرای یک کد مرتبط با حافظه RAM باشه که فرضا 10 ثانیه طول می کشه مشکلی نیست، فرض ئه، مشکلی با 10 ثانیه اش ندارم، اما پردازنده ای که تصور کردید نمیتونه کد دیگری رو که کاری با حافظه RAM نداره اجرا کنه؟ اگه بتونه اجرا کنه که ممکنه حداقل 12.5 درصد اشغالی باشه. اگه قابلیتشو نداره حداقل 25 درصد ئه. شما نمی توانید برای محیطی با شرایط نامعین یک نتیجه مشخص تعیین کنید.

این تیکه ای که قرمز کردم ، به این معنی هه که فقط بعضی از پردازنده ها این قابلیت را دارن که کدهایی که با حافظه ی رم در ارتباط نیستن را اجرا کنه؟ و بعضی هاز پردازنده های دیگه ، این قابلیت را ندارن؟
بعد اینکه محاسبه تون چجوری هه؟ پردازنده ، نمیدونم چه تفاوتی دارن؟ شما نسل های خیلی قبل ، منظورتونه؟ مثلا یه پردازنده ی نسل 4 ام core i از اینتل . یا نسل های بالاتر (مثلا نسل آخر یعنی 8) رو در نظر بگیرید
بالاخره چه بتونه کدهای نامرتبط با رم را اجرا کنه یا نه ، این نخ فعلی (که 10 ثانیه منتظر میموند برای گرفتن اطلاعات از رم) ، یک هسته را درگیر میکنه دیگه . درسته؟
بعد هم اینکه پس حالا بیایم توی شرابط واقعی . یعنی واقعا یه نخی 10 ثانیه طول بکشه تا بخواد اطلاعات مورد نظرش از رم به پردازنده برسه . همون لحظه ، یه نخ دیگه هم باشه که 1 ثانیه اجراش طول بکشه . قطعا در این حالت ، پردازنده ، سربار را میپذیره و نخ جاری (که 10 ثانیه) طول میکشه را متوقف میکنه و میره سراغ اون نخی که اجراش 1 ثانیه طول میکشه و دوباره میاد سروقت نخ فعلی . درسته؟
غیر از اینکه این نخ را متوقف نمیکنه و سراغ نخ دیگه ای نمیره که هر دو نخ ، اجراشون یه زمان ببرن (در اینجا مثلا هر دو ، 10 ثانیه زمان ببرن) . درسته؟
پس با این حساب ، پردازنده هیچ وقت از 50 درصد ، بیشتر برای رم یا هارد زمان صرف نمیکنه . یعنی اگه قرار باشه بیشتر از 50 درصد برای نخ ای زمان بذاره برای خوندن یا نوشتن از رم ، قطعا سربار را میپذیره و سراغ نخ دیگه ای میره . درسته؟
پس ، اون مقاله ای که نشون داده بودم :

چرا نمی‌توان به Task Manager ویندوز اعتماد کرد؟

اشتباه حساب کرده بود . چون توی شکل نشون داد که وقتی در task manager نشون میده که 90 درصد از پردازنده مشغول هه ، ممکنه این طور نباشه و حدود 25 درصد مشغول باشه . که طبق روند بالا ، این طور نیست . درسته؟

بعد اینکه ، طبق چیزی که اون مقاله گفت ، با پایش کننده‌های کارایی (PMC) مثل perf در سیستم عامل لینوکس ، میشه به مشغول بودن واقعی پردازنده پی برد؟ یعنی این برنامه ، مقداری که نخِ پردازنده ، منتظر خوندن و نوشتن اطلاعات از رم میشه را در نظر نمیگیره؟
 

the_king

مدیرکل انجمن
ممنونم از توضیحات مفصل تون استاد علی :rose:
منظورتون از هسته های مجازی ، همون نخ فیزیکی برای هر هسته هست دیگه؟ یعنی مثلا یه پردازنده ای که 2 هسته و 4 نخ فیزیکی داره (برای هر هسته ، دو نخ فیزیکی) مثل i3 4150 و ...

منظورتون درسته ولی اینکه بگید هسته مجازی همون نخ فیزیکیه برای هر هسته است اشتباهه، مثل اینه که بگید سیخ کباب همون کوبیده است، هسته مجازی کد یک نخی رو اجرا می کنه، خودش که نخ نیست. وقتی CPU خاموشه نخی دیگه وجود نداره اما اون هسته های مجازی همچنان سر جاشه.
حالا اگه هسته ای ، قابلیت تقسیم شدن به هسته ی مجازی (نخ فیزیکی) را داشته باشه (یعنی ، یک هسته ، چند نخی باشه) ، چه فرقی داره؟ قبلا گفتید فرقی نداره با پردازنده ی معمولی (پردازنده هایی که به ازای هر هسته ، یک نخ دارن) جز اینکه سرعت سوئیچ کردن نخ ها (نخ های پروسه ها) در پردازنده های چند نخی ، سریع تره
همه رو قاطی کردین با هم. سوئیچ نخ و سوئیچ پروسه و ... همون مطالب قبلی رو گفته بودم رو لطفا دوباره مطالعه کنین. پردازنده چند نخی دیگه چیه، اصطلاحات جدید اختراع می کنین. هسته مجازی با هسته فیزیکی خیلی فرق داره، هسته فیزیکی تمامی منابع عملیاتی خودشو مستقلا داره وقتی بخواد یک کدی رو اجرا کنه مستقل از اینکه نوع کد چیه میتونه انجامش بده، اما هسته مجازی مثل هم اتاقی هایی هستند که وسایل مشترکی دارند. هسته مجازی صرفا میتونه کدی رو اجرا کنه که هسته مجازی شریکش مانع اجراش نشه، فرضا هسته مجازی شریک درخواست داده از حافظه کرده، تو این فاصله که اون داده بیاد بخش اجرایی هسته بیکاره، اون یکی هسته مجازی تو این زمان فرصت داره یک کد اجرایی که کاری با حافظه نداره رو اجرا کنه، وگرنه اونقدر دستش که باز نیست مثل هسته فیزیکی هر کدی خواست همون لحظه اجرا کنه. همزمان که نمی توانند کار مشابهی رو انجام بدن.
منظورتون از گذرگاه داده ای ، همون تعداد کانال های رم هست که پردازنده باهاش در تماس هه؟ مثلا اغلب مادربردها و پردازنده و رم های سوکت های معمولی امروزی ، دو کاناله (dual channel) هستن ، منظورتون اینه؟
اگه آره ، یعنی همزمان ، پردازنده ، فقط دو دستور را میتونه بخونه یا بنویسه؟ چون کم پیش میاد که کدی یا تابعی ، نخواد از رم اطلاعاتی بخونه یا بنویسه . وهمچنین بخاطر اینکه برای سوکت های معمولی ، دو کانال بیشتر وجود ندارن . پس ، یه پردازنده ی 4 هسته ای که 4 نخِ همزمان را میتونه اجرا کنه ، چی؟ چون نمیتونه همزمان 4 مقدار را از رم بخونه یا بنویسه در یک سوکت دو کاناله (البته این سئوالات در صورتی هه که جواب پاراگراف بالا ، درست باشه)
گذرگاه bus ئه، گذرگاه داده صرفا یک نوع از گذرگاه ئه. پردازنده هم که فقط با RAM در ارتباط نیست، در صورت تمایل در مورد گذرگاه و پل جنوبی و پل شمالی و ... مطالعه کنید.
کد منظور متد یا Function و ... نیست، کد منظور یک عدد کد ماشین ئه یعنی یک دستور به زبان ماشین که پردازنده میفهمه و معادل یک کد زبان اسمبلی ئه. کم هم پیش نمیاد، خیلی هاشون هیچ ارتباطی با حافظه RAM ندارند.
عجیبه !
اصلا پردازنده از کجا میدونه که کدوم کد نتیجه اش به کدوم کدِ دیگه ربط داره یا نه؟ اونم قبل از اجرا
شما قبل از اینکه دو تا کد AX = 1 و BX = BX + 1 اجرا بشه نمیتونید تشخیص بدید که نتیجه این دو تا کد ربطی بهم ندارند و با هر ترتیبی اجرا بشوند نتیجه یکسانه؟ بعد از اینکه اجراشون کردید چطور نتیجه می گیرید که بهم ربط داشتند یا نه؟
این تیکه ای که قرمز کردم ، به این معنی هه که فقط بعضی از پردازنده ها این قابلیت را دارن که کدهایی که با حافظه ی رم در ارتباط نیستن را اجرا کنه؟ و بعضی هاز پردازنده های دیگه ، این قابلیت را ندارن؟

خیر. عرض کردم هسته پردازنده مشغول اجرای یک کد مرتبط با حافظه RAM باشه، در این شرایط که هسته فیزیکی پردازنده منتظر اجرای درخواستی از گذرگاه ئه، فقط برخی پردازنده ها میتوانند در این حالت کد مستقل دیگری رو روی اون هسته اجرا کنند. همه پردازنده ها که قابلیتی مثل Hyper-Threading ندارند.

بعد اینکه محاسبه تون چجوری هه؟ پردازنده ، نمیدونم چه تفاوتی دارن؟ شما نسل های خیلی قبل ، منظورتونه؟ مثلا یه پردازنده ی نسل 4 ام core i از اینتل . یا نسل های بالاتر (مثلا نسل آخر یعنی 8) رو در نظر بگیرید
بالاخره چه بتونه کدهای نامرتبط با رم را اجرا کنه یا نه ، این نخ فعلی (که 10 ثانیه منتظر میموند برای گرفتن اطلاعات از رم) ، یک هسته را درگیر میکنه دیگه . درسته؟
مگه شما مشغول بودن پردازنده رو با درصد نمیسنجید؟ این درصد نسبت به چیه؟ مگه نسبت به تعداد هسته هایی که داره نمی سنجید؟ مگر غیر از اینه که در یک پردازنده دو هسته ای یک هسته نصف توانشه. پس چطور میگید شرایط هسته ای فیزیکی ای که فقط میتونه یک کد رو در هر لحظه اجرا کنه توانش با هسته ای فیزیکی ای که دو هسته مجازی حساب میشه و میتونه همزمان دو تا کد رو با شرایطی همزمان اجرا کنه یکی ئه؟ شما نصفی از توان اون هسته رو صرف کد تون کردید، نیمه دیگه توانش رو که نه. اینکه نصفش اش مشغول باشه و یا کل اش فرقی نداره؟

بعد هم اینکه پس حالا بیایم توی شرابط واقعی . یعنی واقعا یه نخی 10 ثانیه طول بکشه تا بخواد اطلاعات مورد نظرش از رم به پردازنده برسه . همون لحظه ، یه نخ دیگه هم باشه که 1 ثانیه اجراش طول بکشه . قطعا در این حالت ، پردازنده ، سربار را میپذیره و نخ جاری (که 10 ثانیه) طول میکشه را متوقف میکنه و میره سراغ اون نخی که اجراش 1 ثانیه طول میکشه و دوباره میاد سروقت نخ فعلی . درسته؟
غیر از اینکه این نخ را متوقف نمیکنه و سراغ نخ دیگه ای نمیره که هر دو نخ ، اجراشون یه زمان ببرن (در اینجا مثلا هر دو ، 10 ثانیه زمان ببرن) . درسته؟
پس با این حساب ، پردازنده هیچ وقت از 50 درصد ، بیشتر برای رم یا هارد زمان صرف نمیکنه . یعنی اگه قرار باشه بیشتر از 50 درصد برای نخ ای زمان بذاره برای خوندن یا نوشتن از رم ، قطعا سربار را میپذیره و سراغ نخ دیگه ای میره . درسته؟
خیر. ابدا درست نیست. در مورد اتمیک بودن کد ها و شرایط توقف اجرای کد عرض کردم. توجه نکردید. پردازنده ای که مشغول اجرای یک کد ئه وسط کار چطور سوئیچ کنه؟ به نظرتون منطقیه که بگیم قراره بوده مقدار فلان خونه حافظه خوانده بشه در AX و تا الان که دو ثانیه گذشته 27 درصد مقدارش خونده شده و بقیه اش مونده؟ یکمی اش اجرا شده یا یه کمی اش مونده تو منطق کدی که پردازنده اجرا می کنه جایی نداره.

بعد اینکه ، طبق چیزی که اون مقاله گفت ، با پایش کننده‌های کارایی (PMC) مثل perf در سیستم عامل لینوکس ، میشه به مشغول بودن واقعی پردازنده پی برد؟ یعنی این برنامه ، مقداری که نخِ پردازنده ، منتظر خوندن و نوشتن اطلاعات از رم میشه را در نظر نمیگیره؟
اصلا میزان مشغول بودن واقعی پردازنده چه اهمیتی داره؟ چه کم باشه یا زیاد که از بیرون پردازنده نمی توانید برایش کاری بکنید. میتوانید تنظیمش کنید توانش تغییر کنه؟ نه. فرض کنید درصد مشغول بودن واقعی پردازنده حداکثر 20 درصد بشه، شما می توانید از اون 80 درصد باقی استفاده کنید؟ خوب معلومه که نه. این درصد واقعی چه چیزیش واقعی محسوب میشه وقتی ارتباط معنا داری با توان سیستم نداره. پردازنده چه مفید و چه غیر مفید، وقتی منتظر باشه در هر حال از دید بیرون پردازنده مشغول ئه. واقعیت چیزیه که به عنوان منبع سیستم مشهود باشه، واقعیت اینه که چه مشغول باشه و چه منتظر باشه برای سیستم عامل busy حساب میشه. اینکه داخلش چه چیزی دلیل busy بودن بوده که یا پردازنده اتلاف انرژی کم داره یا زیاد برای سیستم عامل که اهمیتی نداره. وقتی مشخصات یک خودرو رو مطالعه می کنید به این توجه میشه که با سرعت مشخص چقدر سوخت مصرف می کنه. حالا چه اهمیتی داره که چقدر از این سوخت واقعا برای حرکت صرف شده و چقدرش به اشکال مختلف اتلاف شده؟ مهم اینه که اونقدر سوخت رو بصورت مشهود مصرف میکنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
منظورتون درسته ولی اینکه بگید هسته مجازی همون نخ فیزیکیه برای هر هسته است اشتباهه، مثل اینه که بگید سیخ کباب همون کوبیده است، هسته مجازی کد یک نخی رو اجرا می کنه، خودش که نخ نیست. وقتی CPU خاموشه نخی دیگه وجود نداره اما اون هسته های مجازی همچنان سر جاشه.

همه رو قاطی کردین با هم. سوئیچ نخ و سوئیچ پروسه و ... همون مطالب قبلی رو گفته بودم رو لطفا دوباره مطالعه کنین. پردازنده چند نخی دیگه چیه، اصطلاحات جدید اختراع می کنین. هسته مجازی با هسته فیزیکی خیلی فرق داره، هسته فیزیکی تمامی منابع عملیاتی خودشو مستقلا داره وقتی بخواد یک کدی رو اجرا کنه مستقل از اینکه نوع کد چیه میتونه انجامش بده، اما هسته مجازی مثل هم اتاقی هایی هستند که وسایل مشترکی دارند. هسته مجازی صرفا میتونه کدی رو اجرا کنه که هسته مجازی شریکش مانع اجراش نشه، فرضا هسته مجازی شریک درخواست داده از حافظه کرده، تو این فاصله که اون داده بیاد بخش اجرایی هسته بیکاره، اون یکی هسته مجازی تو این زمان فرصت داره یک کد اجرایی که کاری با حافظه نداره رو اجرا کنه، وگرنه اونقدر دستش که باز نیست مثل هسته فیزیکی هر کدی خواست همون لحظه اجرا کنه. همزمان که نمی توانند کار مشابهی رو انجام بدن.

گذرگاه bus ئه، گذرگاه داده صرفا یک نوع از گذرگاه ئه. پردازنده هم که فقط با RAM در ارتباط نیست، در صورت تمایل در مورد گذرگاه و پل جنوبی و پل شمالی و ... مطالعه کنید.
کد منظور متد یا Function و ... نیست، کد منظور یک عدد کد ماشین ئه یعنی یک دستور به زبان ماشین که پردازنده میفهمه و معادل یک کد زبان اسمبلی ئه. کم هم پیش نمیاد، خیلی هاشون هیچ ارتباطی با حافظه RAM ندارند.

شما قبل از اینکه دو تا کد AX = 1 و BX = BX + 1 اجرا بشه نمیتونید تشخیص بدید که نتیجه این دو تا کد ربطی بهم ندارند و با هر ترتیبی اجرا بشوند نتیجه یکسانه؟ بعد از اینکه اجراشون کردید چطور نتیجه می گیرید که بهم ربط داشتند یا نه؟

سلام
ممنونم استاد علی
منظورم از پردازنده ی چند نخی ، همون پردازنده های hyper thread هستن .
خوب پردازنده چجوری تشخیص میده؟
پل جنوبی که برای پردازنده های امروزی حذف شد . پل شمالی هم باز هم اطلاعاتش رو از رم میخونه دیگه؟ درسته؟


خیر. عرض کردم هسته پردازنده مشغول اجرای یک کد مرتبط با حافظه RAM باشه، در این شرایط که هسته فیزیکی پردازنده منتظر اجرای درخواستی از گذرگاه ئه، فقط برخی پردازنده ها میتوانند در این حالت کد مستقل دیگری رو روی اون هسته اجرا کنند. همه پردازنده ها که قابلیتی مثل Hyper-Threading ندارند.


مگه شما مشغول بودن پردازنده رو با درصد نمیسنجید؟ این درصد نسبت به چیه؟ مگه نسبت به تعداد هسته هایی که داره نمی سنجید؟ مگر غیر از اینه که در یک پردازنده دو هسته ای یک هسته نصف توانشه. پس چطور میگید شرایط هسته ای فیزیکی ای که فقط میتونه یک کد رو در هر لحظه اجرا کنه توانش با هسته ای فیزیکی ای که دو هسته مجازی حساب میشه و میتونه همزمان دو تا کد رو با شرایطی همزمان اجرا کنه یکی ئه؟ شما نصفی از توان اون هسته رو صرف کد تون کردید، نیمه دیگه توانش رو که نه. اینکه نصفش اش مشغول باشه و یا کل اش فرقی نداره؟

من که آخر متوجه نشدم . اصلا هسته ی مجازی گفتین چیزی را نمیتونه اجرا کنه . هسته ی واقعی گفته بودین که اجرا میکنه .
الان تفاوت پردازنده های چند نخی (مثل i3 6100) با پردازنده های معمولی (مثل i5 6400) اینه که در پردازنده های چند نخی ؛ در نخ فیزیکی شون (که 2 نخ فیزیکی در هر هسته وجود دارن) ، اگه یه نخ فیزیکی ، یه کدی که مربوط به خوندن یا نوشتن اطلاعات از رم هست را اجرا کنه ، یه نخ دیگه ای وجود داره که میتونه کدی که مربوط به خوندن و نوشتن از رم نباشه را اجرا کنه؟ منظورتون اینه؟
اما قبلا گفتین هسته ی فیزیکی فقط کد را اجرا میکنه و همزمانی فقط برای هسته ها معنا داره . یعنی در یک هسته ، همزمان ، یک کد اجرا میشه


خیر. ابدا درست نیست. در مورد اتمیک بودن کد ها و شرایط توقف اجرای کد عرض کردم. توجه نکردید. پردازنده ای که مشغول اجرای یک کد ئه وسط کار چطور سوئیچ کنه؟ به نظرتون منطقیه که بگیم قراره بوده مقدار فلان خونه حافظه خوانده بشه در AX و تا الان که دو ثانیه گذشته 27 درصد مقدارش خونده شده و بقیه اش مونده؟ یکمی اش اجرا شده یا یه کمی اش مونده تو منطق کدی که پردازنده اجرا می کنه جایی نداره.


اصلا میزان مشغول بودن واقعی پردازنده چه اهمیتی داره؟ چه کم باشه یا زیاد که از بیرون پردازنده نمی توانید برایش کاری بکنید. میتوانید تنظیمش کنید توانش تغییر کنه؟ نه. فرض کنید درصد مشغول بودن واقعی پردازنده حداکثر 20 درصد بشه، شما می توانید از اون 80 درصد باقی استفاده کنید؟ خوب معلومه که نه. این درصد واقعی چه چیزیش واقعی محسوب میشه وقتی ارتباط معنا داری با توان سیستم نداره. پردازنده چه مفید و چه غیر مفید، وقتی منتظر باشه در هر حال از دید بیرون پردازنده مشغول ئه. واقعیت چیزیه که به عنوان منبع سیستم مشهود باشه، واقعیت اینه که چه مشغول باشه و چه منتظر باشه برای سیستم عامل busy حساب میشه. اینکه داخلش چه چیزی دلیل busy بودن بوده که یا پردازنده اتلاف انرژی کم داره یا زیاد برای سیستم عامل که اهمیتی نداره. وقتی مشخصات یک خودرو رو مطالعه می کنید به این توجه میشه که با سرعت مشخص چقدر سوخت مصرف می کنه. حالا چه اهمیتی داره که چقدر از این سوخت واقعا برای حرکت صرف شده و چقدرش به اشکال مختلف اتلاف شده؟ مهم اینه که اونقدر سوخت رو بصورت مشهود مصرف میکنه.

در مورد بقیه ی توضیحات هم ممنون
:rose:
 

the_king

مدیرکل انجمن
سلام
ممنونم استاد علی
منظورم از پردازنده ی چند نخی ، همون پردازنده های hyper thread هستن .

مثل همون نمونه قبلی هسته مجازی همون نخ فیزیکیه شد که اشتباهه، پردازنده ها Hyper Thread نیستند، میتوانند تکنولوژی Hyper-Threading رو داشته باشند، ولی نه اینکه پردازنده Hyper Thread یا هر جور دیگری از Thread باشه. پردازنده چند هسته ای داریم، ولی پردازنده چند نخی معنی نداره. پردازنده نخ نداره که تک نخی باشه یا چند نخی.

خوب پردازنده چجوری تشخیص میده؟

دستورات زبان ماشین مشخص هستند دیگه، نکته مبهم و ناشناخته ای نداره که پردازنده نفهمه این دستور از چه نوعیه، دستوراتی که با حافظه RAM در ارتباطند مشخص هستند، دستوراتی هم که کاری با حافظه RAM ندارند هم مشخص اند. اگه پردازنده جزئیات دستور رو تشخیص نمیداد که نمیتونست اجراش کنه.
پل جنوبی که برای پردازنده های امروزی حذف شد .

پل جنوبی حذف نشد، در داخل پردازنده قرار گرفت و ترکیب شد. همانطور که کنترل کننده حافظه یا کمک پردازنده ریاضی یا کارت گرافیکی با پردازنده ترکیب میشه. اینکه کمک پردازنده ریاضی یا کارت گرافیکی داخل پکیج پردازنده قرار گرفته به این معنا نیست که حذف شده و دیگر وجود ندارند.
پل شمالی هم باز هم اطلاعاتش رو از رم میخونه دیگه؟ درسته؟

این جمله یعنی چی؟ از مطالعه چه مطلبی به این همچین سوالی رسیدید؟ چه برداشتی از نقش پل شمالی دارید؟
من که آخر متوجه نشدم . اصلا هسته ی مجازی گفتین چیزی را نمیتونه اجرا کنه . هسته ی واقعی گفته بودین که اجرا میکنه .
عجب. لطفا اون بخشی از مطالبم که همچین عبارتی رو گفتم بمن نشون بدید.

الان تفاوت پردازنده های چند نخی (مثل i3 6100) با پردازنده های معمولی (مثل i5 6400) اینه که در پردازنده های چند نخی ؛ در نخ فیزیکی شون (که 2 نخ فیزیکی در هر هسته وجود دارن) ، اگه یه نخ فیزیکی ، یه کدی که مربوط به خوندن یا نوشتن اطلاعات از رم هست را اجرا کنه ، یه نخ دیگه ای وجود داره که میتونه کدی که مربوط به خوندن و نوشتن از رم نباشه را اجرا کنه؟ منظورتون اینه؟
اما قبلا گفتین هسته ی فیزیکی فقط کد را اجرا میکنه و همزمانی فقط برای هسته ها معنا داره . یعنی در یک هسته ، همزمان ، یک کد اجرا میشه
پردازنده چند نخی دیگه چیه؟ از اساس اشتباهه، یا مفهوم نخ رو متوجه نشدید یا پردازنده رو یا هر دو. پردازنده که برنامه و پروسه نیست نخ داشته باشه. نخ فیزیکی هم متعلق به سیستم عامله، وقتی کدی برای اجرا نباشه نخی وجود نداره. پردازنده که خودش نه کدی داره و نه کاری برای انجام. وقتی سوالتون اشتباه باشه و فرقی بین هسته و نخ قائل نشید جوابی بهش نمیشه داد.
سوال میپرسید ولی توجهی به جواب ها نمی کنید، یک مطلب رو بارها هم توضیح میدم ولی همچنان یک قاعده و استدلال از خودتون اختراع می کنید و نهایتا میگید من اونطور گفتم. صحبت هسته فیزیکی یا مجازی نبوده، این مطالب که جدید نیست :
موازی سازی میتونه روی یک هسته انجام بشه، اما لازمه اش اینه که اولا کد هایی که همزمان اجرا میشن مناسب اینکار باشه و ثانیا هسته توانایی اینکار رو داشته باشه و ثالثا کد برای اجرای موازی نوشته شده باشه. مثل اینه که از کاربر بپرسیم آیا مطمئنی میخوای این فایل رو حذف کنی و بعد اگه پاسخ Yes بود فایل رو حذف کنیم. این کد باید ترتیبی اجرا بشه، برای موازی سازی مناسب نیست. این کد رو موازی اجراش کنیم چی میشه؟ فایل رو حذف کنیم و همزمان از کاربر بپرسیم آیا رضایت داشتی که فایل رو حذف کردیم یا دلخور شدی؟ نمیشه که. هسته برای افزایش کارایی فرمان هایی رو موازی اجرا می کنه که مستقل از هم هستند و نتیجه شون روی هم تاثیری نداره. در ضمن توانایی سخت افزاری پردازنده هم ملاک ئه، فرضا فقط یک فرمان مرتبط با حافظه رو همزمان با یک فرمان مربوط به محاسبات اعشاری انجام میده، چون بخش های سخت افزاری شون مستقل ئه. نه اینکه دو فرمان مرتبط با حافظه یا دو فرمان مرتبط با محاسبات اعشاری رو همزمان اجرا کنه. هدفش هم اینه که بخش مرتبط با حافظه یا محاسبات اعشاری اش بیکار نمونه. ممکنه در یک لحظه همچین شرایطی برای اجرای موازی باشه و یک زمانی نباشه. در هر صورت اینها کاملا مرتبط با معماری و خصوصیات یک پردازنده خاص هستند، نمیشه برای همه پردازنده ها یک حکم قطعی داد. و در نظر بگیرید که خیلی تفاوته بین اجرای موازی کد های دو نخ از یک پروسه و اجرای موازی کد های دو پروسه متفاوت. سوئیچ بین دو پروسه سربار داره، پس خیلی مطلوب نیست، اما این سربار از بیکار بودن یک بخش از هسته بهتره.

موازی سازی رو معادل چند هسته ای قرار ندین. ممکنه روی یک هسته موازی سازی صورت بگیره، موازی سازی اجرای همزمان ئه، از نظر سخت افزاری ممکنه در یک هسته هم اینکار اتفاق بیافته، شما که وقتی در مورد موازی سازی حرف می زنید در مورد توانایی یک پردازنده خاص صحبت نمی کنید. به این معنی هم نیست که حتما 100 درصد توان هسته صرف یک پروسه بشه. دید تون رو باید نسبت به کارکرد پردازنده و مدیریت منابع سیستم عامل تغییر بدید، اینکه یک پروسه همه توان پردازنده رو استفاده کنه به این معنی ئه که ماوس، صفحه کلید، کارت گرافیکی، ساعت سیستم، هارد دیسک و ... همه شون سکته کنند و هیچ واکنشی روی سیستم نه کاربر دریافت کنه و نه کاربر بتونه دخالتی داشته باشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
ممنون استاد علی
میگم ، این چیزی که میگم درست نیست دیگه . درسته؟ :
"اختصاص حافظه در سیستم عامل ویندوز به نسبت پردازنده و میزان حافظه RAM متغیر هست"
یعنی مثلا برنامه ای در ویندوز 32 بیتی ، در سیستمی که مثلا 1 گیگ رم داره (مثلا پردازنده اش هم G2020 باشه) ، 300 مگ رم مصرف کنه و دقیقا در همون شرایط ، در ویندوز 32 بیت دیگه در سیستم دیگه ای که 256 مگ رم داره (مثلا پردازنده ی Athlon 3600+ و کلا یه پردازنده ی قدیمی) ، رم کمتری مصرف کنه (مثلا 100 مگ مصرف کنه) .
چنین چیزی درست نیست . درسته؟
یعنی نمیشه برنامه یه درخواستی بده که فلان میزان حافظه میخوام ولی سیستم عامل بگه چون محدودیت دارم ، پس بهت کمتر میدم و کار هم کنه . در این صورت ، سیستم عامل ، ارور مصرف حافظه ی کم رو میده و برنامه با خطا متوقف میشه دیگه . درسته؟
 

the_king

مدیرکل انجمن
سلامی مجدد
ممنون استاد علی
میگم ، این چیزی که میگم درست نیست دیگه . درسته؟ :
"اختصاص حافظه در سیستم عامل ویندوز به نسبت پردازنده و میزان حافظه RAM متغیر هست"
یعنی مثلا برنامه ای در ویندوز 32 بیتی ، در سیستمی که مثلا 1 گیگ رم داره (مثلا پردازنده اش هم G2020 باشه) ، 300 مگ رم مصرف کنه و دقیقا در همون شرایط ، در ویندوز 32 بیت دیگه در سیستم دیگه ای که 256 مگ رم داره (مثلا پردازنده ی Athlon 3600+ و کلا یه پردازنده ی قدیمی) ، رم کمتری مصرف کنه (مثلا 100 مگ مصرف کنه) .
چنین چیزی درست نیست . درسته؟
یعنی نمیشه برنامه یه درخواستی بده که فلان میزان حافظه میخوام ولی سیستم عامل بگه چون محدودیت دارم ، پس بهت کمتر میدم و کار هم کنه . در این صورت ، سیستم عامل ، ارور مصرف حافظه ی کم رو میده و برنامه با خطا متوقف میشه دیگه . درسته؟
ملاک تون حافظه RAM ئه و پردازنده است، در حالی که اولا حافظه پروسه صرفا RAM نیست، ترکیبی از حافظه RAM و حافظه مجازی است که سهم شون هم مدام و لحظه ای طبق شرایط سیستم تغییر میکنه. ثانیا مصرف کننده حافظه، اون پردازنده که نیست، پردازنده خودش یک منبع ئه، همانطور که RAM و دیسک یک منبع هستند. اون پروسه ها هستند که مصرف کننده اند. مصرف کننده RAM اون پروسه و نخی است که اجرا میشه، اینجا پردازنده نقشی نداره. اینکه پردازنده 32 بیتی حافظه کمتری نسبت به 64 بیتی مصرف میکنه ظاهر قضیه است، در واقع اون پروسه با کد ماشین 32 بیتی ئه که حافظه کمتری نسبت به پروسه با کد 64 بیتی مصرف می کنه، پروسه دلیلش بوده، نه پردازنده. چطور که شما وقتی روی لپ تاپ ویندوز 32 بیتی نصب می کنید یا ویندوز 64 بیتی نصب می کنید پردازنده تون یا ماژول های حافظه RAM عوض شده؟ نه. پردازنده یک قطعه سخت افزاری است که چه ویندوز 32 بیتی باشه و چه 64 بیتی باشه همونه که بود. چیزی که تغییر کرده نرم افزار ئه، پروسه های 32 بیتی و 64 بیتی هستند که تغییر در میزان مصرف منبع RAM رو باعث می شوند.

سیستم مدیریت حافظه ویندوز بر اساس آدرس حافظه های مجازی ترکیبی از حافظه RAM و حافظه مجازی رو بکار می بره، مدام Page های حافظه بین RAM و حافظه مجازی روی دیسک جابجا میشوند تا پروسه ای که در حال اجراست اون بخشی از حافظه که الان بهش احتیاج داره رو روی RAM در اختیار داشته باشه، اون بخشی که همین الان لازمش داره، نه کل حافظه پروسه. مثلا اگر پروسه بازی در مرحله دوم قرار داره و مرحله یک رو رد کرده برای پروسه بازی اهمیتی نداره که حافظه مرحله اول در حافظه RAM باشه یا حافظه مجازی روی دیسک، بنابر این مدیریت حافظه ویندوز ممکنه اون Page های حافظه که به تازگی مورد استفاده پروسه نبودند رو موقتا منتقل کنه روی حافظه مجازی، هر زمان پروسه بهشون نیاز داشت مجددا منتقل میشه روی حافظه RAM. پروسه اصلا متوجه این انتقالات نمیشه که از دیدش خطایی رخ بده. خطای کمبود حافظه میتونه رخ بده، ولی زمانی که مدیریت حافظه نتونه با جابجایی ها اون حافظه RAM خالی درخواستی رو ایجاد کنه. اگه امکانش باشه پروسه هایی رو بحالت تعلیق میبره تا حافظه RAM اشغالی شون روی حافظه مجازی منتقل بشه و حافظه RAM بقدر کافی خالی بشه.

در نتیجه اولا لزومی نداره که کل حافظه 300 مگابایتی یک پروسه بصورت کامل در حافظه RAM قرار بگیره، میتونه بخشی اش روی حافظه مجازی و تا لحظه مناسب روی دیسک باقی بمونه و ثانیا نیازی نیست که حافظه RAM ای که یک پروسه درخواست کرده همون لحظه بهش ارائه بشه، میتونه پروسه درخواست کننده بحالت تعلیق دربیاد تا زمانی که امکانش باشه، اینجا خطایی برای پروسه رخ نمیده. پروسه در حالت تعلیق قرار میگیره تا زمانی که اون حافظه درخواستی مهیا بشه و پروسه به اجراش ادامه بده. پروسه ای که در کما است اصلا متوجه نمیشه که چقدر در کما بوده، از دید پروسه خطایی رخ نمیده. دقیقا مربوط به این قضیه نیست اما از نظر فنی یک خطایی برای مدیریت حافظه رخ میده که اونم خطا به مفهوم بدی نیست، پروسه زمانی که سراغ آدرس مجازی حافظه میره Page مورد نظرش در حافظه RAM جستجو میشه، یک خطایی در این لحظه میتونه رخ بده که مربوط به جستجوی Page ها است، که میگه Page درخواستی در RAM نیست، اگر نیست پس حتما روی حافظه مجازی است و باید اول منتقل بشه به RAM تا بشه اون آدرس حافظه مجازی به مقصد منتهی بشه، اینجا یک عملیات انتقال صورت میگیره که بخاطرش نخ باید لحظه ای تعلیق بشه تا انتقال خاتمه پیدا کنه. از نظر فنی اینم خطا است ولی خطای بدی نیست و درضمن خطایی نیست که برای پروسه و نخ رخ بده، یک خطای داخل مدیریت حافظه است که پروسه ازش بیخبره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها ممنون استاد علی
پس بسته به میزان رم ، سیستم عامل میتونه مقداری که در حال حاضر استفاده نمیشه را به حافظه ی مجازی منتقل کنه که بنابراین در حافظه های متفاوت ، میزان رم مختلفی استفاده میکنن . یا به عبارتی ، اختصاص حافظه در ویندوز ، به نسبت حافظه ی ram و حافظه ی مجازی دیسک سخت ، متغییر هست . درسته؟

بعد اینکه اون قسمتی که به حافظه ی مجازی دیسک سخت منتقل شد ، در پروسه ی مربوطه اش در task manager که نشون نمیده؟ درسته؟ یعنی در task manager فقط بخش مربوط به ram برای اون پروسه را نشون میده . درسته؟

بعد هم اینکه حالا فرض کنید اون 300 مگابایت را اون پروسه ، همون اول اجراش و اول کارش لازم داره و بخشی که بعدا استفاده بشه ، نداره (یعنی همه ی 300 مگابایت را همون لحظه نیاز داره) . در این صورت چی؟ آیا بازم بخشی به حافظه ی مجازی دیسک سخت منتقل میشه یا پروسه با خطای کمبود حافظه در سیستم دومی ، متوقف میشه؟

بعد هم اینکه حالا فرض کنید یه سیستمی با 1 گیگ رم و یه سیستمی با 2 گیگ رم داریم که این برنامه را که (همون لحظه ی اول 300 مگ رم لازم داره) را توشون اجرا میکنیم . در این صورت سیستم عامل در هر دو سیستم ، کاملا اون 300 مگ را در اختیار این پروسه قرار میده دیگه ؟ درسته؟ یعنی هر چقدر از این 300 مگ لازم داشته باشه را در اختیارش قرار میده دیگه . درسته؟ چون در هر دو سیستم ، براحتی 300 مگابایت فضای خالی داره
 
آخرین ویرایش:

the_king

مدیرکل انجمن
آها ممنون استاد علی
پس بسته به میزان رم ، سیستم عامل میتونه مقداری که در حال حاضر استفاده نمیشه را به حافظه ی مجازی منتقل کنه

بله.
که بنابراین در حافظه های متفاوت ، میزان رم مختلفی استفاده میکنن . یا به عبارتی ، اختصاص حافظه در ویندوز ، به نسبت حافظه ی ram و حافظه ی مجازی دیسک سخت ، متغییر هست . درسته؟

بله. اما اونقدر جمله تون ابهام داره که خواننده میتونه برداشت اشتباهی بکنه. وقتی چیزی لحظه به لحظه تغییر میکنه، دیگه نسبت دادن تغییرات به میزان حافظه RAM و حافظه مجازی بی معنیه. روی یک سیستم مشخص هم این نسبت ثابت نمیمونه. این میزان تخصیص حافظه نیست که متغیره، اگر پروسه فلان 100 مگابایت حافظه لازم داشته باشه، سیستم عامل بهر حال بهش 100 مگابایت حافظه تخصیص میده، و اینجا اهمیتی نداره که حافظه مجازی یا حافظه RAM سیستم 8 گیگابایت باشه یا 16 گیگابایت. اگر حافظه RAM سیستم رو دو برابر یا نصب بکنید، باز اون پروسه 100 مگابایت دریافت می کنه و چون لحظه به لحظه تغییرات رخ میده، در این لحظه یک بخشی روی RAM قرار داره. حافظه تخصیص یافته به پروسه به معنی حافظه RAM نیست.

بعد اینکه اون قسمتی که به حافظه ی مجازی دیسک سخت منتقل شد ، در پروسه ی مربوطه اش در task manager که نشون نمیده؟ درسته؟ یعنی در task manager فقط بخش مربوط به ram برای اون پروسه را نشون میده . درسته؟
ستون های متفاوتی هست که میشه اضافه و کم شون کرد، میتونه نشون بده یا نده. بستگی داره در مورد اطلاعات چه ستونی صحبت کنید.

بعد هم اینکه حالا فرض کنید اون 300 مگابایت را اون پروسه ، همون اول اجراش و اول کارش لازم داره و بخشی که بعدا استفاده بشه ، نداره (یعنی همه ی 300 مگابایت را همون لحظه نیاز داره) . در این صورت چی؟ آیا بازم بخشی به حافظه ی مجازی دیسک سخت منتقل میشه یا پروسه با خطای کمبود حافظه در سیستم دومی ، متوقف میشه؟

الان و بعدا مفاهیم نسبیه که ما بکار میبریم، برای سیستم عامل بیمعنیه. الان و بعدا ما بر اساس یک مدت زمانی سنجیده میشه، الان و بعدا ما ممکنه کسری از ثانیه بعد باشه یا چند ساعت بعد. 300 مگابایت که در یک Page که جا نمیشه که بگیم یا همه اش یا اصلا هیچی. Page های زیادی رو شامل میشه. سیستم عامل میتونه هر لحظه اراده کرد بخشی از Page ها رو روی دیسک مجازی منتقل کنه. حتی اگه اون حافظه یک آرایه ای باشه که اینطوری بین RAM و حافظه مجازی تقسیم بشه.
بعد هم اینکه حالا فرض کنید یه سیستمی با 1 گیگ رم و یه سیستمی با 2 گیگ رم داریم که این برنامه را که (همون لحظه ی اول 300 مگ رم لازم داره) را توشون اجرا میکنیم . در این صورت سیستم عامل در هر دو سیستم ، کاملا اون 300 مگ را در اختیار این پروسه قرار میده دیگه ؟ درسته؟ یعنی هر چقدر از این 300 مگ لازم داشته باشه را در اختیارش قرار میده دیگه . درسته؟ چون در هر دو سیستم ، براحتی 300 مگابایت فضای خالی داره
سیستم عامل که فقط در خدمت برنامه شما که نیست، پروسه های زیادی هستند که در حال اجرا اند. اصلا نمیتوانید اینجا هیچ شرایطی برای مقایسه ایجاد کنید. شما روی یک سیستم هم براتون تکرار شرایط قبلی میسر نیست، به اصطلاح تکرار پذیر نیست. هر بار سیستم روشن میشه و شروع به کار میکنه در ثانیه فلان شرایط متفاوت از دفعه قبلی است. روال کار مدیریت حافظه هم به این سادگی نیست که هر چی حافظه RAM داشت، همینطور به هر پروسه خواست فوری بده و بعد که یهو RAM ته کشید تازه یادش بیافته که قرار بود مدیریتی در کار باشه و شروع کنه به خالی کردن های پی در پی روی دیسک مجازی که سیستم عامل و پروسه ها سکته کنن و ناگهانی کند بشن. این اصلا روال منطقی و قابل استفاده ای نیست. مدیریت حافظه واقعا مدیریت ئه، تحلیل شده، روش ها مقایسه شده، همیطوری بی حساب و کتاب که RAM تخصیص نمیده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
چیزی بنام فناوری "Memory Enhancement" در پردازنده ها وجود داره؟ یا کلا فناوری ای برای مدیریت حافظه در پردازنده ها (مخصوصا پردازنده های روز) وجود داره؟
اگه آره ، کارش مدیریت حافظه هست؟ به این معنی که پردازنده هایی که این فناوری را دارن ، توی دو سیستم ، یکی با این فناوری و یکی بدون این فناوری ، در یک نرم افزار و در یک شرایط ، چقدر در مدیریت رم و آزاد سازی حافظه ، تاثیر داره؟
بعد اینکه کنترلر در پردازنده چیه؟ در واقع همون کنترل کننده ی حافظه هست؟ صرفا خوندن و نوشتن از حافظه را کنترل میکنه؟
 

the_king

مدیرکل انجمن
سلام
ممنون استاد علی
چیزی بنام فناوری "Memory Enhancement" در پردازنده ها وجود داره؟ یا کلا فناوری ای برای مدیریت حافظه در پردازنده ها (مخصوصا پردازنده های روز) وجود داره؟

همچین چیزی نشنیدم اما قطعا به این معنی که شما میگید فناوری ای بوجود نمیاد. پردازنده یک قطعه سخت افزاریه که وظیفه اش اجرای تک به تک دستورات زبان ماشین ئه، نه یک روال طولانی از پیش تعریف شده. دستورات زبان ماشین روال داخلی خیلی ساده ای دارند. مدیریت حافظه یک روال نرم افزاری پیچیده است شامل مجموعه ای از روتین ها که در سیستم عامل تعریف شده و در نخ های هسته سیستم عامل انجام میگیره، پردازنده نه معنی ویندوز رو میفهمه نه لینوکس و نه سیستم عامل دیگه ای رو، چه برسه به اینکه بخواد مدیریت حافظه سیستم عامل رو به عهده بگیره یا نقشی درش داشته باشه. دستورات و قابلیت هایی داره که مربوط به حافظه و مود های اون هستند و قطعا قابلیت های سخت افزاری جدیدتر و اضافه شدن دستورات جدید در پردازنده به سیستم عامل کمک می کنند که عملیاتی رو سریعتر، ایمن تر یا کاربردی تر انجام بده، یعنی سیستم عامل رو برای استفاده از تکنولوژی های پردازنده مدرن بازنویسی کنند تا از فلان دستورات پردازنده هم استفاده کنه، اما هیچوقت پردازنده روالی که وظیفه سیستم عامل ئه انجام نمیده. پردازنده دستورات منحصر بفرد و محدود شناخته شده خودش رو اجرا میکنه، دستوراتی خیلی ساده و ابتدایی. پردازنده روتین نداره، متد نداره، نخ نداره و درضمن مگه چقدر حافظه داره که بخواد یک روال مدیریت حافظه رو داخلش نگهداره. مدیریت حافظه چیزی نیست که در یک دستور خلاصه بشه که بخواد به CPU سپرده بشه.
اگه آره ، کارش مدیریت حافظه هست؟ به این معنی که پردازنده هایی که این فناوری را دارن ، توی دو سیستم ، یکی با این فناوری و یکی بدون این فناوری ، در یک نرم افزار و در یک شرایط ، چقدر در مدیریت رم و آزاد سازی حافظه ، تاثیر داره؟
اینها که میگید ارتباطی با پردازنده نداره. و کلا پردازنده کاری به این مفاهیم نرم افزاری نداره.
بعد اینکه کنترلر در پردازنده چیه؟ در واقع همون کنترل کننده ی حافظه هست؟ صرفا خوندن و نوشتن از حافظه را کنترل میکنه؟
سوالتون همونقدر کلی ئه که باید کلی پاسخ بدم. نه. کنترلر یک مدار الکتریکی ئه که مدیریت ورود و خروج و نگهداری بخش خاصی بهش واگذار شده، قطعا کنترلر پردازنده یا Processor Controller بی معنیه چون صحبت بخش خاصی رو نمی کنه، پس باید ببینید در مورد کنترلر چه بخشی صحبت می کنید، مستقل از اینکه مدارش داخلش پردازنده قرار گرفته یا یک مدار مستقل بیرونیه. فرضا کنترلر حافظه. کنترلر مسئولیت نگهداری اون بخش رو هم بر عهده داره، فرضا حافظه با تکنولوژی های متفاوتی تولید میشه، جنس و ماهیت اون حافظه RAM سیستم تون با حافظه فلش درایو مدرن و حافظه سیستم های از رده خارج قدیمی و فلش درایو های اولیه یکجور نیست. کاملا به شیوه های متفاوتی کار می کنند، بعضی ها باید بصورت متوالی در کسری از ثانیه مجددا Refresh بشن وگرنه داده شون پاک میشه، بعضی ها به این راحتی بازنویسی نمیشن و قبل از بازنویسی باید پاک بشن و برای پاک شدن باید با روتین و مدار متفاوتی داده شون پاک بشه، بعضی هاشون مخصوصا برای استفاده در سرور برای صحت داده به شیوه ای چک میشن، اینها همگی وظایف همون کنترلر ئه، پس الزاما فقط Read و Write نیست، بماند که یک حافظه اصلا ممکنه ماهیتش Write پذیر نباشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی .
نمیدونم این سئوال به اینجا مربوط میشه یا نه (اگه نشد ، ببخشید)
من page file ام را در تنظیمات ویندوز ، بصورت دستی حداکثر تا 6 گیگ تنظیم کردم ولی در نرم افزار msi after burner میزان استفاده را تا 14 گیگ هم نشون داد . چی این وسط اشتباه هست؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام استاد علی .
نمیدونم این سئوال به اینجا مربوط میشه یا نه (اگه نشد ، ببخشید)
من page file ام را در تنظیمات ویندوز ، بصورت دستی حداکثر تا 6 گیگ تنظیم کردم ولی در نرم افزار msi after burner میزان استفاده را تا 14 گیگ هم نشون داد . چی این وسط اشتباه هست؟
بعدا از Set کردن میزان حافظه مجازی ویندوز رو Restart کردید؟ میتونه الگوریتم اشتباهی بکار ببره، میتونه مجموع حافظه ها باشه و ...
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعدا از Set کردن میزان حافظه مجازی ویندوز رو Restart کردید؟ میتونه الگوریتم اشتباهی بکار ببره، میتونه مجموع حافظه ها باشه و ...

سلام
بله.
در عنوان نرم افزار after burner گفت که اون آمار pagefile هست اما توضیحی نداد که مجموع حافظه هست یا نه . ولی میزان حافظه ی رم را بصورت جداگانه داره .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد .
استاد ، این قضیه ی تست کلاس Parallel باعث شد ، مروری بر مباحث پردازنده کنم . من هیچ وقت نتونستم دقیق مبحث پردازنده و نخ ها را و اینکه آیا در هسته های های چند نخی (2 نخی) (مثل پردازنده ی i3 4150) ، دو نخ در یک هسته ، بصورت همزمان میتونن اجرا بشن یا نه؟ ( استاد من این اصطلاحات را اگه اشتباه میگم ، زیاد روی اون تمرکز نکنین . معنای اصلی حرفم را که متوجه میشین . نمیدونم در اصطلاح علمی بهش چی میگن . مثل اصطلاح هسته های های چند نخی که در بالا گفتم . اصلا نمونه و مصداق اون پردازنده را میگم . )

اول بذارید اصطلاح ها را درست کنیم .خیلی از مشکلاتم بخاطر اینه که اصطلاح ها و نام هایی که بکار میبرم ، با نام هایی که شما بکار میبرین ، یکی نیست .
شاید نیاز به رسم شکل باشه . من این جوری دقیق متوجه نمیشم .
طبق مقاله ی و شکل زیر :

What is the difference between a ‘Thread’ and a ‘Core’?

الان منظور این از اصطلاح "logical core" برابر با اصطلاح "هسته های مجازی" ای که شما در پست های بالا اشاره کردین هست . درسته؟
و این هسته ی مجازی هم همون تعداد نخ فیزیکی در هسته های پردازنده هست . درسته؟ مثلا پردازنده هایی مثل i3 4150 ، در هر هسته شون ، دو نخ فیزیکی دارن . درسته؟ اما پردازنده هایی مثل i5 4460 در هر هسته شون ، فقط یک نخ فیزیکی دارن. درسته؟ هر چند در پست بالا اشاره کردین که هسته ی مجازی همون نخ فیزیکی نیست اما من دقیق متوجه نشدم پس چیه؟
الان منظورتون از هسته های مجازی ، همونی هه که در لینک بالا (در عکس زیر) ، با رنگ های صورتی و سبز نشون داد؟ :

core-image.jpg


اصطلاح "physical core" هم برابر با هسته های غیر مجازی (حالا نمیدونم هسته های واقعی میگین یا نه) هست؟ یعنی همون مثل اینکه پردازنده ی i3 4150 برابر با 2 هسته ی واقعی داره و i5 4460 برابر با 4 هسته ی واقعی داره . درسته؟

الان من از متن های شما ، برداشت های مختلف کردم که واقعا گیج شدم چی درسته ، چی غلطه . الان ، من از بعضی از پست هاتون به همراه مقاله ی زیر :

https://www.logicbig.com/quick-info/programming/multi-threading.html

برداشت زیر را میکنم . ببینین برداشتم درست هه؟ (اصطلاحات نخ فیزیکی و هسته ی واقعی و اینها را که در زیر میگم ، همون مفهومی مد نظرم هست که در بالا ازتون پرسیدم درست هستن یا نه و فرض ام بر این هستن که درستن) :

--------------------------------------------

multithreading.png


اول اینکه طبق عکس بالا ، پردازنده هایی که هر هسته شون ، دو نخ فیزیکی داره (مثل i3 4150) ، هر نخ شون ، یک کش و حافظه ی مخصوص به خودشون را دارن بنابراین در این نوع پردازنده ها ، هر هسته ، 2 حافظه ی مجزای کش داره اما در پردازنده هایی که هر هسته شون ، یک نخ فیزیکی دارن (مثل i5 4460) ، هر هسته شون ، یک حافظه ی کش دارن.

نخ های پروسه های مختلفِ نرم افزار که در هسته های مختلف اجرا میشن .
در یک پروسه ، وقتی دو یا چند نخ ایجاد و اجرا میکنیم ، اولا این نخ ها فقط در یک هسته اجرا میشه (بجز کلاس Parallel که خودش بسته به نوع کد که مثلا گلوگاه ایجاد نشه ، توی چند هسته بصورت همزمان کدها را اجرا میکنه) . اگه پردازنده ، یک نخ فیزیکی (به ازای هر هسته) داشته باشه (مثل i5 4460) ، همزمانی واقعی وجود نداره . یعنی اینکه در این نوع پردازنده ها ، اول ، یک نخِ مربوط به پروسه ی نرم افزار ، اجرا میشه (بسته به زمانی که سیستم عامل یا پردازنده تشخیص داد (نمیدونم سیستم عامل نخ ها را مدیریت میکنه یا پردازنده یا هر دو) ، ممکنه وسط اجرای نخ ، اجراش معلق بمونه و بره به سراغ نخ دیگه . برای معلق گذاشتن یک نخ ، باید تا اونجایی که اجرا کرد ، توی حافظه ی رجیستر پردازنده ، ذخیره بشه که این ذخیره سازیِ اطلاعات مربوط به نخِ جاری که قراره معلق بشه و سوئیچ کردن به نخ دیگه که به این فرآیند ، Context switch میگن ، سربار داره و علاوه بر اشغال حافظه ی رجیستر در پردازنده ، کلاک پردازنده و زمانی را صرف این کار میکنن که کلا معطلی داره) . مثلا اجرای این نخِ مربوط به پروسه ی نرم افزارش ، 5 میلی ثانیه طول کشید (همونطور که گفتم ، ممکنه وسط کار ، اجرای اون نخ را رها کرده باشه یا نه . حالا ما فرض میکنیم که نیمه کاره رهاش کرد) . بعد از این 5 میلی ثانیه ، میره سر وقت نخ بعدی و همون روند که توضیح دادم هم برای این نخ اتفاق میافته . (برای این نخ ، 2 میلی ثانیه فرض میکنیم زمان صرف کرد). بعد دوباره میره سر وقت نخ دیگه (این نخ ممکنه نخِ پروسه ی دیگه باشه یا همون نخ اولیه ی قبلی . اما سوئیچ کردن به نخ پروسه ی دیگه ، سخت تر از سوئیچ کردن پروسسه های نخ جاری هست . ما فرض میکنیم دوباره سراغ نخ قبلی در همین پروسه رفت) و ادامه ی اون نخ قبلی را انجام میده . به این ترتیب ، در این نوع پردازنده ها ، هیچ وقت در هیچ هسته ای ، همزمانی واقعی اتفاق نمیافته و در واقع سوئیچ های مختلف و سریع بین نخ های پروسه فقط انجام میشه . مثل شکل زیر :

context-switching.png



حالا ، وقتی دو یا چند نخ در یک پروسه ایجاد و اجرا میکنیم و این را در پردازنده هایی که هر هسته اش 2 نخ فیزیکی دارند (مثل پردازنده ی i3 4150) ، اجرا کنیم ، در صورتی بصورت واقعی ، دو نخ اش (مربوط به پروسه ی نرم افزار) بصورت همزمان در نخ های فیزیکی (که در هسته وجود دارن) اجرا میشن که اجرای این دو نخِ پروسه ها ، با هم تداخل نداشته باشن . مثلا هر دو کدی را اجرا نکنن که مربوط به استفاده و خوندن و نوشتن از رم باشه . مثلا یک نخ پروسه ای که کدهاش مربوط به ارتباط با رم هست را میتونه با یک نخ دیگه ای از همون پروسه (یا حتی پروسه های دیگه) که ارتباطی با رم نداره و کدش فقط به پردازنده مرتبط هست را بصورت همزمان اجرا کنه . این قضیه (همزمانی) ، همون مفهوم اجرای موازی (parallel) در یک هسته هست که میگفتین :

parallelism-vs-concurrency.png



الان این درک ام درست هه؟

----------------------------------------------

یه سئوال مجزا اینکه دلیل اینکه به RAM که همون random access memory هست ، حافظه ی دسترسی تصادفی میگن ؛ این عبارت "تصادفی" اش بخاطر همون قضیه هست که میگفتین حافظه ای که در رم برای اشیاء اختصاص داده میشه ، هر لحظه ممکنه آدرسش تغییر کنه (و از حافظه ی مجازی یا همون page file به رم منتقل بشه و برعکس) ؟

ببخشید که زیاد سئوال میپرسم
با تشکر ازتون استاد :rose:
 

the_king

مدیرکل انجمن
سلام استاد .
استاد ، این قضیه ی تست کلاس Parallel باعث شد ، مروری بر مباحث پردازنده کنم . من هیچ وقت نتونستم دقیق مبحث پردازنده و نخ ها را و اینکه آیا در هسته های های چند نخی (2 نخی) (مثل پردازنده ی i3 4150) ، دو نخ در یک هسته ، بصورت همزمان میتونن اجرا بشن یا نه؟ ( استاد من این اصطلاحات را اگه اشتباه میگم ، زیاد روی اون تمرکز نکنین . معنای اصلی حرفم را که متوجه میشین . نمیدونم در اصطلاح علمی بهش چی میگن . مثل اصطلاح هسته های های چند نخی که در بالا گفتم . اصلا نمونه و مصداق اون پردازنده را میگم . )
البته قبلا توضیح دادم، ولی باز تکرار می کنم.
هر پردازنده ای معماری خاص خودش رو داره که بهش قابلیت هایی رو میده که ممکنه در خانواده پردازنده های دیگری عینا نباشه، اینه که اگه بخواهیم روی پردازنده های خانواده خاصی متمرکز بشیم بحث از حالت کلی و قابل استفاده خارج میشه. قبلا گفتم که بصورت کلی هسته های فیزیکی پردازنده ممکنه به چند بخش تقسیم بشن، ممکنه، یعنی در همه پردازنده ها چنین نیست. این تقسیم شدن هسته به چند بخش فرضا دو بخش به این معنا است که اگر یک بخش درگیر کاری باشه بخش دیگه بیکاره و میتونه کاری رو انجام بده که نیازی به تعامل بخش دیگه نداشته باشه. پردازنده میتونه دو کد ماشین مستقل که هر کدوم فقط یک بخش از هسته رو درگیر میکنه همزمان روی اون هسته انجام بده. شرط همزمانی اینه که کد ها هر دو مربوط به یک بخش مشترک نباشند چون اختلال ایجاد میشه. مثال ساده ای میزنم. هسته به دو بخش تقسیم بشه که یک بخش میتونه با پورت ها ارتباط داشته باشه و بخش دوم محاسبات ریاضی. این هسته نمیتونه همزمان دو تا کد رو که با پورت ها ارتباط دارند روی یک هسته اجرا کنه، ولی میتونه یک کد که با پورت در ارتباطه و یک کد که محاسبات ریاضی میکنه همزمان روی هسته اجرا کنه، چون دو تا بخش متفاوت اختلالی در کار هم ندارند.

الان منظور این از اصطلاح "logical core" برابر با اصطلاح "هسته های مجازی" ای که شما در پست های بالا اشاره کردین هست . درسته؟
بله.
و این هسته ی مجازی هم همون تعداد نخ فیزیکی در هسته های پردازنده هست . درسته؟
نه. هسته پردازنده که نخ نداره، پردازنده مفاهیم نرم افزاری مثل نخ و پروسه و ... رو درک نمی کنه.
نخ فیزیکی رو نمیدونم از کدوم منبع یاد گرفتید ولی به هر حال در کار با پردازنده با هسته سر و کار داریم و نه نخ. پردازنده نمیتونه یک نخ رو اجرا کنه، نمیفهمه نخ چیه. این نمودار ها که می بینید تصور انتزاعی و ساده ای هستند از کاری که سیستم عامل با پردازنده می کنه، دید سخت افزاری که واقعا رخ میده نیست. پردازنده روی اون هسته مجازی یک عدد کد ماشین رو اجرا میکنه. همین. هیچ درکی از روتین نداره. این سیستم عامل ئه که کد ها رو از بین نخ ها انتخاب می کنه و به پردازنده تحویل میده. نخ فیزیکی نیست، نخ نرم افزاری ئه، چیزیه که سیستم عامل بصورت نرم افزاری برای خودش تعریف کرده، واقعا فیزیکی نیست.

مثلا پردازنده هایی مثل i3 4150 ، در هر هسته شون ، دو نخ فیزیکی دارن . درسته؟ اما پردازنده هایی مثل i5 4460 در هر هسته شون ، فقط یک نخ فیزیکی دارن. درسته؟ هر چند در پست بالا اشاره کردین که هسته ی مجازی همون نخ فیزیکی نیست اما من دقیق متوجه نشدم پس چیه؟
نخ فیزیکی نه، هسته فیزیکی. هر هسته فیزیکی پردازنده میتونه به چند هسته مجازی تقسیم بشه یا نشه. نخ فیزیکی چیزیه که شما میگید، اصطلاح مرسومی هم نیست، فیزیکی یعنی بصورت یک جسم باید وجود داشته باشه، که نیست.
حتی در لینک هایی که قرار دادید هم عبارت physical thread نیست که در موردش صحبت کنیم.

الان منظورتون از هسته های مجازی ، همونی هه که در لینک بالا (در عکس زیر) ، با رنگ های صورتی و سبز نشون داد؟ :

core-image.jpg
نه. اینها مسیر داده و کدی رو نشون میده که داخل هسته میشه و در میاد، هسته که مسیر نیست، هسته مجازی داخل اون مستطیل Core 0 ئه، انگار که Core 0 رو دو تا مستطیل چسبیده به هم تصور کنید، دو تیکه بشه.

اصطلاح "physical core" هم برابر با هسته های غیر مجازی (حالا نمیدونم هسته های واقعی میگین یا نه) هست؟ یعنی همون مثل اینکه پردازنده ی i3 4150 برابر با 2 هسته ی واقعی داره و i5 4460 برابر با 4 هسته ی واقعی داره . درسته؟
هسته واقعی رو شما اختراع کردید، همچین اصطلاحی نداریم. هسته غیر مجازی یعنی هسته فیزیکی. بله، physical core همون هسته فیزیکی ئه.

اول اینکه طبق عکس بالا ، پردازنده هایی که هر هسته شون ، دو نخ فیزیکی داره (مثل i3 4150) ، هر نخ شون ، یک کش و حافظه ی مخصوص به خودشون را دارن بنابراین در این نوع پردازنده ها ، هر هسته ، 2 حافظه ی مجزای کش داره اما در پردازنده هایی که هر هسته شون ، یک نخ فیزیکی دارن (مثل i5 4460) ، هر هسته شون ، یک حافظه ی کش دارن.
بله دیگه، هسته فیزیکی ذاتا مستقل ئه، هم چیزش مال خودشه. شریک نداره. اما هسته های مجازی یک مواردی رو مشترک استفاده می کنند، هسته فیزیکی برای اجرا کردن کد محدودیت نداره چون معطل شریک اش نمیشه، ولی هسته مجازی فقط در شرایطی میتونه کد رو اجرا کنه، کد هایی رو نمیتونه اجرا کنه و همچنین باید شرایط هسته مجازی مجاورش رو در نظر بگیره که ببینه اون چه کدی اجرا می کنه. هسته های مجازی خوبه ولی به این معنا نیست که دو تا هسته مجازی کارایی دو هسته فیزیکی رو داشته باشه.

نخ های پروسه های مختلفِ نرم افزار که در هسته های مختلف اجرا میشن .
بله.

در یک پروسه ، وقتی دو یا چند نخ ایجاد و اجرا میکنیم ، اولا این نخ ها فقط در یک هسته اجرا میشه (بجز کلاس Parallel که خودش بسته به نوع کد که مثلا گلوگاه ایجاد نشه ، توی چند هسته بصورت همزمان کدها را اجرا میکنه) .
نه. صحبت گلوگاه نیست. گلوگاه یهو ایجاد نمیشه، تاثیرش رو در جایی خوب نشون میده و گاهی نشون نمیده ولی کلا چیزیه که همیشه هست. Parallel نخ ها رو میسازه ولی در اجراشون تعیین کننده نیست، سیستم عامل تعیین کننده است.

اگه پردازنده ، یک نخ فیزیکی (به ازای هر هسته) داشته باشه (مثل i5 4460) ، همزمانی واقعی وجود نداره . یعنی اینکه در این نوع پردازنده ها ، اول ، یک نخِ مربوط به پروسه ی نرم افزار ، اجرا میشه (بسته به زمانی که سیستم عامل یا پردازنده تشخیص داد (نمیدونم سیستم عامل نخ ها را مدیریت میکنه یا پردازنده یا هر دو) ، ممکنه وسط اجرای نخ ، اجراش معلق بمونه و بره به سراغ نخ دیگه . برای معلق گذاشتن یک نخ ، باید تا اونجایی که اجرا کرد ، توی حافظه ی رجیستر پردازنده ، ذخیره بشه که این ذخیره سازیِ اطلاعات مربوط به نخِ جاری که قراره معلق بشه و سوئیچ کردن به نخ دیگه که به این فرآیند ، Context switch میگن ، سربار داره و علاوه بر اشغال حافظه ی رجیستر در پردازنده ، کلاک پردازنده و زمانی را صرف این کار میکنن که کلا معطلی داره) . مثلا اجرای این نخِ مربوط به پروسه ی نرم افزارش ، 5 میلی ثانیه طول کشید (همونطور که گفتم ، ممکنه وسط کار ، اجرای اون نخ را رها کرده باشه یا نه . حالا ما فرض میکنیم که نیمه کاره رهاش کرد) . بعد از این 5 میلی ثانیه ، میره سر وقت نخ بعدی و همون روند که توضیح دادم هم برای این نخ اتفاق میافته . (برای این نخ ، 2 میلی ثانیه فرض میکنیم زمان صرف کرد). بعد دوباره میره سر وقت نخ دیگه (این نخ ممکنه نخِ پروسه ی دیگه باشه یا همون نخ اولیه ی قبلی . اما سوئیچ کردن به نخ پروسه ی دیگه ، سخت تر از سوئیچ کردن پروسسه های نخ جاری هست . ما فرض میکنیم دوباره سراغ نخ قبلی در همین پروسه رفت) و ادامه ی اون نخ قبلی را انجام میده . به این ترتیب ، در این نوع پردازنده ها ، هیچ وقت در هیچ هسته ای ، همزمانی واقعی اتفاق نمیافته و در واقع سوئیچ های مختلف و سریع بین نخ های پروسه فقط انجام میشه . مثل شکل زیر :

context-switching.png



حالا ، وقتی دو یا چند نخ در یک پروسه ایجاد و اجرا میکنیم و این را در پردازنده هایی که هر هسته اش 2 نخ فیزیکی دارند (مثل پردازنده ی i3 4150) ، اجرا کنیم ، در صورتی بصورت واقعی ، دو نخ اش (مربوط به پروسه ی نرم افزار) بصورت همزمان در نخ های فیزیکی (که در هسته وجود دارن) اجرا میشن که اجرای این دو نخِ پروسه ها ، با هم تداخل نداشته باشن . مثلا هر دو کدی را اجرا نکنن که مربوط به استفاده و خوندن و نوشتن از رم باشه . مثلا یک نخ پروسه ای که کدهاش مربوط به ارتباط با رم هست را میتونه با یک نخ دیگه ای از همون پروسه (یا حتی پروسه های دیگه) که ارتباطی با رم نداره و کدش فقط به پردازنده مرتبط هست را بصورت همزمان اجرا کنه . این قضیه (همزمانی) ، همون مفهوم اجرای موازی (parallel) در یک هسته هست که میگفتین :

parallelism-vs-concurrency.png



الان این درک ام درست هه؟
بله.

یه سئوال مجزا اینکه دلیل اینکه به RAM که همون random access memory هست ، حافظه ی دسترسی تصادفی میگن ؛ این عبارت "تصادفی" اش بخاطر همون قضیه هست که میگفتین حافظه ای که در رم برای اشیاء اختصاص داده میشه ، هر لحظه ممکنه آدرسش تغییر کنه (و از حافظه ی مجازی یا همون page file به رم منتقل بشه و برعکس) ؟
نه. به مفهوم تصادفی بودن یا جابجایی مربوط نیست، در این مورد خاص منظور از Random در مقابل مفهوم ترتیبی Sequential معنی داره، معنی کلی Random رو در نظر نگیرید. در یک نوار ویدئو یا کاست برای دسترسی به موقعیت خاصی ناچارید آدرس های داده قبلی رو پیمایش کنید تا به اون موقعیت خاص برسید، شبیه رفتاری که با فایل های متنی میشه. پس نمی توانید بگیم به آدرس دلخواه من (که از نظر پاسخ دهنده یک آدرس تصادفی و غیر قابل پیش بینی است) برو، ناچار هستید از ابتدا شروع به خواندن کنید. اما در مورد RAM هر آدرس حافظه موقعیت مشخصی داره و می توانید هر آدرس دلخواه (تصادفی) رو اعلام کنید تا فورا داده اش در اختیارتون قرار بگیره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
البته قبلا توضیح دادم، ولی باز تکرار می کنم.
هر پردازنده ای معماری خاص خودش رو داره که بهش قابلیت هایی رو میده که ممکنه در خانواده پردازنده های دیگری عینا نباشه، اینه که اگه بخواهیم روی پردازنده های خانواده خاصی متمرکز بشیم بحث از حالت کلی و قابل استفاده خارج میشه. قبلا گفتم که بصورت کلی هسته های فیزیکی پردازنده ممکنه به چند بخش تقسیم بشن، ممکنه، یعنی در همه پردازنده ها چنین نیست. این تقسیم شدن هسته به چند بخش فرضا دو بخش به این معنا است که اگر یک بخش درگیر کاری باشه بخش دیگه بیکاره و میتونه کاری رو انجام بده که نیازی به تعامل بخش دیگه نداشته باشه. پردازنده میتونه دو کد ماشین مستقل که هر کدوم فقط یک بخش از هسته رو درگیر میکنه همزمان روی اون هسته انجام بده. شرط همزمانی اینه که کد ها هر دو مربوط به یک بخش مشترک نباشند چون اختلال ایجاد میشه. مثال ساده ای میزنم. هسته به دو بخش تقسیم بشه که یک بخش میتونه با پورت ها ارتباط داشته باشه و بخش دوم محاسبات ریاضی. این هسته نمیتونه همزمان دو تا کد رو که با پورت ها ارتباط دارند روی یک هسته اجرا کنه، ولی میتونه یک کد که با پورت در ارتباطه و یک کد که محاسبات ریاضی میکنه همزمان روی هسته اجرا کنه، چون دو تا بخش متفاوت اختلالی در کار هم ندارند.


بله.

نه. هسته پردازنده که نخ نداره، پردازنده مفاهیم نرم افزاری مثل نخ و پروسه و ... رو درک نمی کنه.
نخ فیزیکی رو نمیدونم از کدوم منبع یاد گرفتید ولی به هر حال در کار با پردازنده با هسته سر و کار داریم و نه نخ. پردازنده نمیتونه یک نخ رو اجرا کنه، نمیفهمه نخ چیه. این نمودار ها که می بینید تصور انتزاعی و ساده ای هستند از کاری که سیستم عامل با پردازنده می کنه، دید سخت افزاری که واقعا رخ میده نیست. پردازنده روی اون هسته مجازی یک عدد کد ماشین رو اجرا میکنه. همین. هیچ درکی از روتین نداره. این سیستم عامل ئه که کد ها رو از بین نخ ها انتخاب می کنه و به پردازنده تحویل میده. نخ فیزیکی نیست، نخ نرم افزاری ئه، چیزیه که سیستم عامل بصورت نرم افزاری برای خودش تعریف کرده، واقعا فیزیکی نیست.


نخ فیزیکی نه، هسته فیزیکی. هر هسته فیزیکی پردازنده میتونه به چند هسته مجازی تقسیم بشه یا نشه. نخ فیزیکی چیزیه که شما میگید، اصطلاح مرسومی هم نیست، فیزیکی یعنی بصورت یک جسم باید وجود داشته باشه، که نیست.
حتی در لینک هایی که قرار دادید هم عبارت physical thread نیست که در موردش صحبت کنیم.


نه. اینها مسیر داده و کدی رو نشون میده که داخل هسته میشه و در میاد، هسته که مسیر نیست، هسته مجازی داخل اون مستطیل Core 0 ئه، انگار که Core 0 رو دو تا مستطیل چسبیده به هم تصور کنید، دو تیکه بشه.


هسته واقعی رو شما اختراع کردید، همچین اصطلاحی نداریم. هسته غیر مجازی یعنی هسته فیزیکی. بله، physical core همون هسته فیزیکی ئه.


بله دیگه، هسته فیزیکی ذاتا مستقل ئه، هم چیزش مال خودشه. شریک نداره. اما هسته های مجازی یک مواردی رو مشترک استفاده می کنند، هسته فیزیکی برای اجرا کردن کد محدودیت نداره چون معطل شریک اش نمیشه، ولی هسته مجازی فقط در شرایطی میتونه کد رو اجرا کنه، کد هایی رو نمیتونه اجرا کنه و همچنین باید شرایط هسته مجازی مجاورش رو در نظر بگیره که ببینه اون چه کدی اجرا می کنه. هسته های مجازی خوبه ولی به این معنا نیست که دو تا هسته مجازی کارایی دو هسته فیزیکی رو داشته باشه.


بله.


نه. صحبت گلوگاه نیست. گلوگاه یهو ایجاد نمیشه، تاثیرش رو در جایی خوب نشون میده و گاهی نشون نمیده ولی کلا چیزیه که همیشه هست. Parallel نخ ها رو میسازه ولی در اجراشون تعیین کننده نیست، سیستم عامل تعیین کننده است.

خیلی ممنون استاد :rose:

بله.


نه. به مفهوم تصادفی بودن یا جابجایی مربوط نیست، در این مورد خاص منظور از Random در مقابل مفهوم ترتیبی Sequential معنی داره، معنی کلی Random رو در نظر نگیرید. در یک نوار ویدئو یا کاست برای دسترسی به موقعیت خاصی ناچارید آدرس های داده قبلی رو پیمایش کنید تا به اون موقعیت خاص برسید، شبیه رفتاری که با فایل های متنی میشه. پس نمی توانید بگیم به آدرس دلخواه من (که از نظر پاسخ دهنده یک آدرس تصادفی و غیر قابل پیش بینی است) برو، ناچار هستید از ابتدا شروع به خواندن کنید. اما در مورد RAM هر آدرس حافظه موقعیت مشخصی داره و می توانید هر آدرس دلخواه (تصادفی) رو اعلام کنید تا فورا داده اش در اختیارتون قرار بگیره.

یعنی همه ی چیزها به یک کنار ، این جواب بله تون به تنهایی به یک کنار . :green:
این قدر خوشحال شدم . فکر نمیکردم اون همه توضیحاتم ، همه اش اون هم یکجا درست باشن . :green:
حداقل فکر میکردم چند تا بند و تبصره بهش بدید .:green:
پس از این به بعد ، کلا به توضیحات همین دو پست آخریِ خودم (که مجموع صحبت هاتون در این تاپیک و ... هست) و خودتون استناد میکنم دیگه .
درباره ی رم هم خیلی ممنون :rose:
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد ، میگم ویژال استودیو (فرضا آخرین نسخه اش که 2019 هست) ، چه پردازنده ای براش پیشنهاد میشه؟ (زبان سی شارپ منظورمه) .
و اینکه آیا زبان های مختلف (مثل سی پلاس پلاس در مقایسه با سی شارپ) ، قدرت پردازنده ی متفاوتی خواهند داشت؟
در هر زمان منظورمه . مثلا موقع نوشتن پروژه یا لود پروژه یا start پروژه .
استفاده از مثلا دسکتاپ ، یا وب یا زامارین در سی شارپ ، پردازنده هایی با قدرت و هسته های متفاوت را میطلبه یا در همه ی اینها ، استفاده از توان پردازنده ها ، تقریبا یکی خواهد بود؟
اینکه ویژال استودیو از چند هسته میتونه حداکثر استفاده کنه؟
عملکرد تک هسته ای در یک پردازنده برای ویژال استودیو مهمتر هه یا عملکرد چند هسته ای؟

من قبلا i3 4150 داشتم و بعد که i5 4460 گرفتم ، توی افزایش سرعت و کارایی پروژه های ویژال استودیو ام تاثیر محسوسی داشت (اون موقع ، یعنی زمان تغییر پردازنده ، ویژال استودیو 2015 داشتم) .
کلا برای کسی که بخواد با ویژال استودیو 2019 کار کنه (زبان سی شارپ) ، چه پردازنده ای برای کار با دسکتاپ ، چه پردازنده ای برای کار با وب و چه پردازنده ای برای کار با زامارین پیشنهاد میدین؟
 

the_king

مدیرکل انجمن
سلام
استاد ، میگم ویژال استودیو (فرضا آخرین نسخه اش که 2019 هست) ، چه پردازنده ای براش پیشنهاد میشه؟ (زبان سی شارپ منظورمه) .
این چیزیه که مایکروسافت باید توصیه بکنه، در کل هر چقدر پردازنده سریعتری باشه اجرای برنامه ها سریعتر میشن، چه تحت ماشین مجازی باشن و چه نباشن.
Visual Studio 2019 System Requirements

و اینکه آیا زبان های مختلف (مثل سی پلاس پلاس در مقایسه با سی شارپ) ، قدرت پردازنده ی متفاوتی خواهند داشت؟
در هر زمان منظورمه . مثلا موقع نوشتن پروژه یا لود پروژه یا start پروژه .
از سوالتون سر در نمیارم. قدرت پردازنده یک چیز سخت افزاریه که همیشه هست، وقتی سیستم خاموشه هم قدرت پردازنده همونه که وقتی روشن بود، زبان برنامه نویسی ربطی به قدرت پردازنده نداره.
اگه منظورتون از ++C برنامه هایی باشه که با Visual C++ Native می نویسند، در حالت کلی کارکرد زبان های تحت NET. با زبان های Native قابل مقایسه نیستند، خروجی هاشون بصورت محسوسی و از همه جوانب کند تر هستند. در مورد محیط کد نویسی نمیشه مقایسه ای انجام داد چون مشخصات کد و پروژه ها متفاوت ئه.

استفاده از مثلا دسکتاپ ، یا وب یا زامارین در سی شارپ ، پردازنده هایی با قدرت و هسته های متفاوت را میطلبه یا در همه ی اینها ، استفاده از توان پردازنده ها ، تقریبا یکی خواهد بود؟
هر نرم افزاری هم میزان درخواست پردازش متفاوتی داره و هم سربار پردازش متفاوتی داره. بیشتر به کد برنامه اش بستگی داره، نه زبان و پلتفرم اش.

اینکه ویژال استودیو از چند هسته میتونه حداکثر استفاده کنه؟
متغیر ئه. سیستم عامل مشخص میکنه. ویژوال استدیو و پلاگین هاش یکسری نخ و پروسه دارن که در هر لحظه ممکنه کم و زیاد بشه و درخواست اجرا شدن شون رو به سیستم عامل میدن و سیستم عامل با توجه به مشخصات سخت افزاری و نرم افزاری سیستم تصمیم میگیره که در این لحظه چه هسته هایی درگیر بشن.

عملکرد تک هسته ای در یک پردازنده برای ویژال استودیو مهمتر هه یا عملکرد چند هسته ای؟
اگه محدودیتی برای اجرا نداشته باشه، عملکرد چند هسته ای. اما اگر اجبارا صرفا روی یک هسته اجرا بشه، عملکرد تک هسته ای.

من قبلا i3 4150 داشتم و بعد که i5 4460 گرفتم ، توی افزایش سرعت و کارایی پروژه های ویژال استودیو ام تاثیر محسوسی داشت (اون موقع ، یعنی زمان تغییر پردازنده ، ویژال استودیو 2015 داشتم) .
کلا برای کسی که بخواد با ویژال استودیو 2019 کار کنه (زبان سی شارپ) ، چه پردازنده ای برای کار با دسکتاپ ، چه پردازنده ای برای کار با وب و چه پردازنده ای برای کار با زامارین پیشنهاد میدین؟
پیشنهادی ندارم. خیلی فرقی نمی کنه که برای چه کاری باشه. هر چقدر هزینه بیشتری کنید، هم پردازنده قوی تری می توانید بخرید و هم حافظه RAM سریعتر و با ظرفیت بیشتر.
 

جدیدترین ارسال ها

بالا