در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
با پیشرفت ساختار پردازندههای رایانه و ایجاد هستههای متعدد فیزیکی و مجازی در پردازشگرها اهمیت برنامهنویسی 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());
کد بالا دو کار یکسان را ده بار اجرا میکند. انتظاری که شما دارید این است که زمان هر دو یکسان باشد اما همان طور که درخروجی خواهید دید، زمان حلقه اول که به صورت همروند اجرا میشود ده ثانیه و حلقه دوم سه ثانیه است (این مقدار در سیستمهای مختلف با هستههای مختلف متفاوت است).
امیر بهاءالدین سبطالشیخ
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: