برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
سلامی مجدد بر گلپسر عزیز .
اول اینکه ، حتما باید این پست هایی که نوشتم را بخونی . در واقع این جواب هایی که میدم ، به نوعی مرور اون پست هایی هه که نوشتم . قضیه ی مفصل اش را در پست هایی که در همین تاپیک دادم ، گفتم .
همونطور که گفتم ، برنامه ی Resource Monitor را باز کن (بصورت مجزا یا از در قسمت پایینیِ برنامه ی Task Manager قابل دسترس هه) و در سربرگ اول یا دومِ این برنامه (سربرگ cpu) ، در ستون Threads مینویسه که در حال حاضر ، کدوم پروسه و کدوم برنامه ، چند نخ در حال اجرا داره . (اگه این ستون مشخص نیست ، برنامه را maximize کن) .
دقت کن که نخ ای که در حال اجراست ، به این معنا نیست که کدهای قابل اجرای سنگینی داره و داره پردازنده را مشغول میکنه . نه . یه نخ میتونه در اون لحظه متوقف شده باشه (که کدی اجرا نمیشه) یا اینکه اون نخ کد خاصی در اون لحظه نداشته باشه . مثل نخ اصلی برنامه که رویداد گراست و در صورت وقوع رویدادی ، میتونه کدی اجرا بشه و پردازنده را درگیر کنه .
و همونطور هم که میدونی ، این نخ ها در هر لحظه ممکنه کم یا زیاد بشن (قضیه شو که توضیح دادم) .
هر پروسه ، حداقل 1 نخ در حال اجرا داره که نخ اصلی بهش میگن .
پروسه ای که در سی شارپ ساختی ، حتی اگه خودت هم نخ نسازی ، معمولا بالای 5 نخ داره . این نخ ها توسط clr برای پروسه ی سی شارپ ساخته میشن که همونطور که ماهیت نخ ها را میدونی (و توضیح دادم) ، در هر لحظه ممکنه کم یا زیاد بشن . تو هم اگه نخ ای اضافه کنی ، تا زمانی که نخ ات در حال اجراست ، به همون تعداد نخ ای که ساختی ، در این ستون برای پروسه ات ، تعداد نخ اضافه میشه و بعد از اتمام ، کم میشه .
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
اولا ترد نه .
ترد یا نخ ، یه چیز نرم افزاری هست . چیزی که سیستم عامل باهاش سر و کار داره . پردازنده ، نخ را نمیشناسه . نخ ، چیزی هه که در سی شارپ ، از کلاس Thread ، شی میسازی .
بجای نخ (در قضیه ی پردازنده) ، عبارت "هسته ی منطقی" را استفاده کن .
هر هسته ی منطقی ، در یک زمان ، یک نخ را میتونه اجرا کنه . البته اگه 2 هسته ی منطقی ، درون یک هسته ی فیزیکی باشن (مثل همین پردازنده ای که گفتی) ، اگه از اطلاعات مشترک بخوان استفاده کنن ، در اون زمان ، فقط یک هسته ی منطقی میتونه کد را اجرا کنه .
رندر ، کلمه ای هه که باز هم برای پردازنده معنا نداره . در سطح برنامه و نرم افزار معنا داره .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
پردازنده فقط کد را اجرا میکنه .
یه برنامه ، فقط یک نخ یا دو نخ نمیتونه داشته باشه .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
بی نهایت نخ میتونه داشته باشه . از 1 نخ تا 100 نخ تا بی نهایت نخ .
کلمه ی "بی نهایت" ، به معنای واقعی کلمه نیست چون هر نخ (و هر چیزی) برای اجرا ، حافظه میخواد و حافظه ی کامپیوتر هم محدود هست .
هیچ کدوم از گزینه های "الف" و "ب" درست نیست .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
هر برنامه ای که باز بشه (بعد از پروسه ی طولانی بارگذاری در حافظه ی رم) ، به تعدادِ نخ ای که اون برنامه در اون لحظه برای اجرا داره ، ممکنه (نه همیشه) به تعداد نخ هاش ، در هسته های منطقی مختلفی اون نخ هاش اجرا بشن .
این هسته های منطقی ، مدام در حال سوئیچ روی نخ های مختلف (چه نخ های متفاوتی که در یک پروسه باشه و چه نخ های متفاوت از پروسه های متفاوت) هستند .
هر سوئیچ هم سربار (انتظار) داره .
اما سوئیچ روی نخ های یک پروسه (بخاطر قضیه ای که توضیح داده بودم) ، سربار کمتری داره . سوئیچ در پردازنده های داره Hyper Thread و SMT ، سربار کمتر و بنابراین زودتر انجام میشه . بنابراین تا جایی که پردازنده میتونه ، نخ های یک پروسه را توی یک هسته ی فیزیکی انجام میده مگر اینکه دمای اون هسته بالا بره یا شرایط دیگه ای پیش بیاد تا سوئیچ کنه روی یه هسته ی دیگه . البته این کلمه ی "میتونه" که گفتم ، به معنای بازه ی زمانی خاصی نیست . یا به این معنا نیست که کل کدهای اون نخ را در اون هسته ی فیزیکی اجرا میکنه . این کلمه ی "میتونه" ، ممکنه حتی در حد چند میکرو ثانیه یا میلی ثانیه باشه حتی اگه کد بزرگی برای اجرا داشته باشه . یعنی مثلا اون نخ ممکنه بعد از چند میکروثانیه هم ، از یه هسته ی فیزیکی ، به هسته ی فیزیکی دیگه سوئیچ کنه .
هر هسته ی منطقی هم موقع اجرای کد ، تا حداکثر فرکانس تعیین شده ، کدها را اجرا میکنه .
این رو هم یادت باشه که چیزی که در Task Manager نشون میده که مثلا یک پروسه داره 100 درصد از کارکرد اون هسته ی منطقی را میگیره ، این طور نیست .
یک هسته ی منطقی تا زمانی که اطلاعات مورد نظرش در حافظه ی رجیستر وجود نداشته باشه ، در حال انتظار هست . بنابراین تا زمانی که اطلاعات توی حافظه ی کش یا مخصوصا توی حافظه ی رم وجود داشته باشه ، اون هسته ی منطقی در حال انتظار هست . اگه این انتظار طولانی باشه (مثلا اطلاعات در رم یا page file یا همون حافظه ی مجازی باشه) ، اون هسته ی منطقی ممکنه به نخ دیگه ای سوئیچ کنه .
متوجه ی اون تیکه از صحبتت که رنگی کردم ، نشدم .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
از برنامه نویسی موازی ، دقیق اطلاعی ندارم .
توی سی شارپ ، برنامه نویسی موازی که با کلاس Parallel انجام میشه ، فرق خاصی با کلاس Thread نداره جز اینکه کدنویسی اش بهینه تر شده و معمولا ، فقط اندکی (نه زیاده) کدهاش زودتر اجرا میشه .
البته خود مایکروسافت هم اعلام کرده که بجای کلاس Thread ، از کلاس Task استفاده کنیم که کدهاش هم بهینه تر هست و هم ساده تر .
درون Task ، از کلاس Thread (یا نخ Managed که همین کلاس در سی شارپ هست یا نخ Unmanaged که برای سیستم عامل هست) استفاده میشه .
البته خود کلاس Thread در سی شارپ که Managed هست هم از نخ Unmanaged که برای سیستم عامل هست ، استفاده میکنه .
برنامه ها cpu را نمیشناسن .
برنامه ها فقط درخواست اجرای نخ هاشون را به سیستم عامل میدن .
این سیستم عامل هست که اگه صلاح دید ، میگه کدوم نخ برای کدوم هسته ی منطقی برای اجرا ارسال بشه . شاید هم سیستم عامل ، نخ ها را تحویل پردازنده بده و این پردازنده باشه که مشخص کنه که کدوم نخ در کدوم هسته ی منطقی اجرا بشه . دقیق نمیدونم . بنابراین چه یکی cpu و چه دو تا cpu ، برای برنامه ها هیچ فرقی ندارن . اونها cpu رو نمیشناسن . برنامه ها فقط سیستم عامل را میشناسن .
قطعا 2 هسته ی منطقی به ازای هر هسته ی فیزیکی داشتن (فناوری HT و SMT) (مثل Ryzen 3600) ، بهتر هه .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
تک هسته ی منطقی به ازای هر هسته ی فیزیکی (مثل Ryzen 3500) ، برتری ای نداره .
اونی که شما میگید ، عملکرد یک هسته ی فیزیکی هست . نه عملکرد هسته ی منطقی که بنابراین تعداد هسته ی منطقی به ازای هر هسته ی فیزیکی مهم باشه .
چون خیلی از برنامه ها ، از یک نخ (منظورم نخ سنگینی که اجرا و پردازش سنگینی بخواد) و بنابراین از یک هسته ی منطقی استفاده میکنن ، واسه ی همین ، در خیلی از جاها ، عملکرد تک هسته ای را مد نظر قرار میدن .
عملکرد تک هسته ای ، بستگی به نوع برنامه نویسی داره . اگه در برنامه ای که از یک نخ استفاده شده باشه ، معمولا دیگه HT و SMT ، کارایی چندانی نداره . در این صورت فرکانس اون هسته هست که سرعت تک هسته را مشخص میکنه . در این جور مواقع ، فرکانس turbo boost ، بسیار تاثیر گذار هست .
اگه برنامه نویسی در چند نخ انجام بشه ، بسته به این داره که سیستم عامل و پردازنده ، نخ های مختلف را در هسته های منطقی ای که در هسته های فیزیکیِ مجزا قرار دارن یا نه ، اجرا کنن ، عملکردشون هم متفاوت خواهد بود .
چون اجرای دو نخ از یه پروسه در دو هسته ی منطقی ای که در یک هسته ی فیزیکی قرار دارن ، باعث میشه سوئیچ نخ ها در این نوع هسته های منطقی سریعتر انجام بشه اما در عوض در مواردی که حافظه ی اشتراکی بطلبه ، قطعا چون یک هسته ی منطقی در اون زمان میتونه کد را اجرا کنه ، سرعتش از این لحاظ کم میشه اما در هسته های منطقی ای که در هسته های فیزیکی مجزا قرار دارن ، برعکسِ این حالت هست .
اما فکر کنم سیستم عامل یا پردازنده ، میسنجن که اگه اون نخ ، کد سنگینی (یا بهینه ای) بود که اجراش طولانی باشه ، در هسته ی منطقی ای که در هسته ی فیزیکی مجزا قرار داره ، اجراش کنن وگرنه (اگه کدهای نخ ، سبک باشه) در هسته ی منطقی ای که درون یک هسته ی فیزیکی قرار داره ، اجراش کنن (که در این گزینه ی دوم ، سوئیچ سریعتر ، مهمتر هه)
اولا که سیستم عامل ، نخ ها را به اون ترتیبی که گفته بودم (قضیه ی Priority) به پردازنده (هسته های منطقی) ارسال میکنه .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
دوما هسته های منطقی ، طبق قضیه ای که گفتم ، عمل میکنن .
در هر لحظه ، بخشی از کدهای یه نخ را اجرا میکنن و طبق محاسباتشون (اینکه چقدر منتظر داده ی جدیدش میمونن تا به اون هسته ی منطقی برسه و یا اینکه چقدر اون هسته گرم شد و ...) متوقف اش میکنن و اطلاعات این نخ را ذخیره میکنن و به نخ دیگه ای سوئیچ میکنن و بخشی از کدهای اون نخ را انجام میدن و این روند همینطور ادامه داره .
درباره ی دستورالعمل ها ، اطلاع خاصی ندارم .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
ان شاء ا... موفق باشی برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
Bookmarks