روزنامه جام جم
صفحه اصلی روزنامه درباره ما ارتباط با ما پیوندها راهنمای سایت بورسبورس آب و هواآب و هوا انتشاراتانتشارات اشتراکاشتراک آرشیو روزنامهآرشیو روزنامه
چهارشنبه 01 شهريور 1396 / 30 ذی القعدة 1438 / a 23 Aug 2017
صفحه اول روزنامه
سياسي
راديو و تلويزيون
اقتصاد
فرهنگي
جامعه
ورزش
دانش
جهان
حوادث
ايران زمين
گفتگو
سلامت
انديشه
صفحه آخر
جستجوی پیشرفته
ضمائم
ویژه نامه ها
کليک
نسخه چاپی فرستادن با پست الکترونیک
يكشنبه 08 بهمن 1391 - ساعت 19:00
شماره خبر: 100770952960
پردازش موازي در دات‌نت
در شماره‌های پیشین در مورد برنامه‌نویسی غیرهمزمان (Asynchronous Programming) مطالب متعددی نوشتیم، توضیح دادیم که مزایای استفاده از این روش به مراتب بیشتر از برنامه‌نویسی همزمان (Synchronous Programming) است، اما به همان نسبت تشخیص خطا و مدیریت آن نیز به زمان بیشتری نیاز دارد و در بعضی مواقع در صورت استفاده نادرست از منابع ممکن است برنامه‌ شما بخوبی کار نکند و خروجی مورد نظر را به شما ندهد.

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

در همین زمان پروژه‌ای در مایکروسافت با نام Parallel Fx ـ که یک چارچوب کاری برای استفاده از برنامه‌نویسی موازی بود ـ توسعه داده شد. این پروژه که با استفاده از ویژگی‌های نسخه #C توسعه یافته بود به مرور بهتر شد تا جایی که در دات نت ۴ به عنوان یکی از کتابخانه‌های اصلی به شمار رفت. این پروژه مقدمه‌ای برای بهتر شدن زبان#C در نسخه ۵ شد.

قبل از این‌که در مورد نسخه ۵#C بخواهیم توضیحی بدهیم، مقدمه‌ای از برنامه‌نویسی موازی در دات​نت را بررسی می‌کنیم.

در برنامه‌نویسی همروند شما چند Task را که هیچ رابطه‌ای بین آنها نیست در یک محیط همروند اجرا می‌کنید. این موضوع مشکلات خود را دارد، Task‌ها از منابع مشترک استفاده می‌کند و این منابع را بین خود به اشتراک می‌گذارند. این امر مشکل منابع اشتراکی را به وجود می‌آورد، در واقع Task‌های شما به صورت Thread‌هایی است که از منابع مشترک استفاده می‌کند و این Thread‌ها مشکل deadlock و data race را به وجود می‌آورد.

اما در برنامه‌نویسی موازی یک Task به تعدادی Task‌ مرتب به هم تقسیم و در همان محیط همروند اجرا می‌شود. شاید فکر کنیم زمانی که این وظایف در ارتباط با هم هستند بعضی از مشکلات موجود در حالت همروند به قوت خود باقی بماند؛ اما شما چند وظیفه مرتبط به هم ایجاد کرده‌اید و مشکلی مانند deadlock هنوز به وقت خود باقی است. مساله مهم‌تر این است که خطایابی این سیستم نسبت به حالت قبلی پیچیده و سخت‌تر است و همین طور ارتباط بین این وظایف و انتقال اطلاعات بین آنها. اما نگران نباشید اینجاست که Parallel Fx به کمک شما می‌آید و مشکلات شما را حل می‌کند.

در Parallel Fx کلاس Task جای Thread را گرفته و امکان اجرای موازی کارها را به شما می‌دهد و شما می‌توانید کار خود را به مراتب سریع‌تر از چند نخی و حتی برنامه‌نویسی غیرهمزمان انجام دهید، حال بگذارید چند مثال در این مورد بنویسیم تا با این کتابخانه و کار با آن آشنا شویم.

Task t = Task.Factory.StartNew(() =»

{

Console.WriteLine("I am the first task");

});

var t2 = t.ContinueWith(delegate

{

‌/‌‌/‌simulate compute intensive

Thread.Sleep(5000);

return "Tasks Example";

});

در کد بالا ما یک Task با استفاده از Lambda Expression ایجاد می‌کنیم سپس با استفاده از تابع ContinueWith به آن می‌گوییم هر زمان که کارش تمام شد، این کار را انجام دهد. t2 به صورت غیرموازی اجرا می‌شود.

در کتابخانه Parallel Fx‌ کلاس‌های متعددی برای کارهای متفاوت وجود دارد، یکی از آنها کلاس Parallel است که به شما اجازه می‌دهد براحتی حلقه‌های طولانی خود را در یک محیط موازی انجام و زمان اجرای آنها را کاهش دهید:

Stopwatch watch;

watch = new Stopwatch();

watch.Start();

for (int i = 0; i « 10; i++)

{

Thread.Sleep(1000);

}

watch.Stop();

Console.WriteLine("Serial Time: " + watch.Elapsed.Seconds.ToString());

watch = new Stopwatch();

watch.Start();

System.Threading.Tasks.Parallel.For(0, 10, i =»

{

Thread.Sleep(1000);

});

watch.Stop();

Console.WriteLine("Parallel Time: " + watch.Elapsed.Seconds.ToString());

کد بالا دو کار یکسان را ده بار اجرا می‌کند. انتظاری که شما دارید این است که زمان هر دو یکسان باشد اما همان طور که درخروجی خواهید دید، زمان حلقه اول که به صورت همروند اجرا می‌شود ده ثانیه و حلقه دوم سه ثانیه است (این مقدار در سیستم‌های مختلف با هسته‌های مختلف متفاوت است).

امیر بهاءالدین سبط​الشیخ


نظر خوانندگان:
لطفاً نظرات را فارسی وارد کنید
نام:    پست الکترونیک: