هسته فیزیکی یا هسته مجازی؟ بصورت متعارف میتونه روی فرضا دو هسته مجازی دو تا نخ برنامه تون رو همزمان اجرا کنه ولی روی دو هسته فیزیکی نه.
مساله به معماری پردازنده بستگی داره، چون ما در مورد یک پردازنده خاص صحبت نمی کنیم و نمیدونیم در آینده چه تغییری در معماریشون رخ میده جواب ممکنه همیشه نه نباشه.
اما بصورت متعارف شما صد تا نخ هم که در پروسه برنامه تون داشته باشید پردازنده اونها رو روی یک هسته فیزیکی اش اجرا می کنه. یعنی فرضا اگه چهار هسته فیزیکی داشته باشه، همزمان دو نخ رو در دو هسته فیزیکی مجزا اجرا نمی کنه.
اما از طرف دیگه باز بصورت متعارف پردازنده ها هسته فیزیکی شون خودش به چند هسته مجازی تقسیم شده، فرضا هر هسته فیزیکی معادل دو هسته مجازی شده.
از اونجایی که این دو تا هسته مجازی روی یک هسته فیزیکی قرار دارن میتونن دو تا نخ مربوط به پروسه شما رو همزمان اجرا کنند، البته کارکرد پایینتر.
دلیل اش اینه که دو تا هسته مجازی نمی توانند کاملا مستقل از هم هر کد ماشینی رو اجرا کنن، مثل این میمونه که هسته فیزیکی یک اتاق خواب داره و یک آشپزخانه.
اتاق خواب رو به یک هسته مجازی میدن و آشپزخونه رو به یک هسته مجازی دیگه. اولی نمیتونه هیچ کدی که به آشپزخونه نیاز داره اجرا کنه و دومی نمیتونه هیچ کدی که به اتاق خواب نیاز داره.
کارکرد دو تا هسته مجازی معادل دو تا هسته فیزیکی نیست، چون هر هسته مجازی فقط میتونه کد ماشینی رو همزمان با هسته مجازی همسایه اش انجام بده که تداخلی با کد ماشینی که همسایه اش انجام میده نداشته باشه.
اگه منظورتون هسته مجازی باشه، بله میتونه همچین کاری رو انجام بده، اما نمیتونه هسته مجازی اول روی یک هسته فیزیکی باشه و هسته مجازی دوم روی هسته فیزیکی دیگری، باید همسایه هم باشن.
چه بخواهیم و چه نخواهیم همیشه سوئیچ داره انجام میشه، توجه به این نکته داشته باشید که پروسه برنامه شما یکی از صدها پروسه ای است که از سیستم عامل میخوان که اجراشون کنه. دائم داره بین نخ هایی که هسته اجرا می کنه سوئیچ صورت میگیره. از هر کدوم چند کد بیشتر اجرا نمیشه و سوئیچ میشه به نخ دیگری. اینکه شما درصد کارکرد رو 50 درصد میبینید به این معنی نیست که نخ های شما 50 درصد توان پردازنده رو گرفتن، اگر اینطور بود که خیلی عالی میشد.
یکی از چالش های طراحی سیستم عامل همینه که تا حد امکان بازدهی رو ببرن بالا ولی هنوز به اون حد نرسیده که بتوانید همچبن بازدهی رو داشته باشید.
متاسفانه اونقدر بازدهی بالا نیست که همچین اتفاقی بیافته. اون چیزی که شما به عنوان درصد میبینید معیار اسمی و ظاهری است، دقت کافی رو نداره.
اگر پردازنده میخواست در هر لحظه حواسش به اون درصد باشه باید یک هسته اش رو مشغول نگه میداشت که اون درصد اشغالی رو بسنجه.
اون چیزی که بهتون نشون میده به این معنی است که در 50 درصد زمان هایی که سنجش صورت گرفته نخ هایی که بیشترین توان پردازنده رو گرفته نخ های برنامه شما است. هیچوقت صد در صد به این معنی نیست که شما صد درصد توان پردازنده رو گرفتید چون اونوقت خود Task Manager و سیستم مدیریت حافطه و مدیریت فایل و ... رو با چه پردازنده ای اجرا کنه؟
یکی از محدودیت های NET. این بود که شما نخ رو می ساختید ولی برای اجرای چند هسته ای کاری نمی توانستید انجام بدید. Parallel برای همین طراحی شد تا یک مجرایی برای اجرای نخ ها روی هسته های مجزا ایجاد کنه.
اون Parallel این امکان رو به NET. و سیستم عامل میده که به بهترین شکل ممکن و در حدی که محدودیت های معماری پردازنده اجازه میده نخ ها رو بین هسته ها تقسیم کنن، یعنی کاری که شما با نخ سازی نمیتوانید انجام بدید.
پس اگر قصدتون این باشه که از توان چند هسته ای فیزیکی استفاده کنید بجای نخ سازی از Parallel کمک می گیرید.
پردازنده کد ماشین رو در دو تا مد اجرا میکنه، یک حالت مد هسته است که به سخت افزار دسترسی مستقیم داره و برنامه های هسته سیستم عامل و درایور ها ازش استفاده می کنند و حالت دوم مد کاربر ئه که به سخت افزار دسترسی مستقیم نداره و برنامه هایی عادی ازش استفاده می کنند. اون چیزی که تحت عنوان kernel time میبینید نشون میده که چه بخشی از کارکرد پردازنده برای اجرا شدن کد های مود هسته صرف شده، یعنی فرضا اگه 20 درصد توان پردازنده باشه، نشون میده 20 درصد توان پردازنده برای اجرا شدن کد های برنامه هسته سیستم عامل و درایور ها صرف شده، نه سایر برنامه های عادی و سیستمی.