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

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

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

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
پردازنده ی من i5 4460 هه (4 هسته ی فیزیکی با 4 هسته ی منطقی) و وقتی کد بالا را توش اجرا میکنم ، از 50 درصد توان پردازنده یعنی از 2 هسته اش (یعنی بصورت موازی) استفاده میکنه . زمان اجراش هم تقریبا 25 ثانیه برام بود .
وقتی کد بالا را در یک نخ اجرا میکنم (کد دو تا نخ را توی یکی میزارم) ، یعنی کد زیر را مینویسم :


private void TransparentControl4_Click(object sender, EventArgs e)
{
for (long i = 0; i < 10000000000; i++)
{
}


for (long j = 0; j < 10000000000; j++)
{
}


MessageBox.Show("main thread loop finished");
}



اولا که مشخص هست در یک هسته اجرا میکنه و دوما اینکه زمان اجراش بیش از 55 ثانیه میشه .



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


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

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