سلام
وقتی از thread و نخ ها استفاده میکنیم ، مگه واقعا از چند هسته بصورت همزمان استفاده میشه؟
یعنی مثلا وقتی دو نخ (مثلا یه نخ اصلی به همراه یه نخ دیگه که کلا بشه 2 تا) را اجرا میکنیم ، در این حالت ، واقعا از 2 هسته (ی منطقی) استفاده میشه؟
اگه نه ، پس چرا در کد زیر ، واقعا از 2 هسته برام استفاده میکنه؟ :
private void TransparentControl4_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(this.NewThreadMethod));
thread.Start();
for (long i = 0; i < 10000000000; i++)
{
}
MessageBox.Show("main thread loop finished");
}
private void NewThreadMethod()
{
for (long counter = 0; counter < 10000000000; counter++)
{
}
MessageBox.Show("new thread loop finished");
}
پردازنده ی من 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 هسته و همینطور به تعداد نخ هایی که ایجاد میکنید ، در هسته های منطقی مختلف ، بصورت همزمان اجرا میشه .
و سئوال دوم اینکه پس اگه Thread و نخ ها را وقتی با هم اجرا میکنیم ، توی هسته های مختلف بصورت همزمان اجرا میشن ، پس کلاس Parallel دیگه به چه کاری میاد و به چه دردمون میخوره؟
یا به عبارتی ، بنابراین ، تفاوت کلاس Thread و Parallel در کجاست و چه زمانی از کلاس Thread و چه زمانی از کلاس Parallel استفاده میشه و موارد استفاده ی هر کدوم ، در کجاست؟
چون Parallel را تا جایی که میدونستم برای این بود که کدهاش بصورت موازی در هسته های مختلف ، بصورت همزمان اجرا میشه ، حال اینکه این کار با کلاس Thread هم انجام میشه .
سوم اینکه (هر چند ربط مستقیمی به این سئوالات نداره) درباره ی kernel time در task manager کسی میدونه توضیح بده؟ این ، همون مقدار انتظار یا سربار اون هسته ی منطقی را نمایش میده؟