PDA

View Full Version : سوال: چند پردازشی



baran_mehr
دوشنبه 30 دی 1387, 14:45 عصر
میشه در رابطه با چند پردازشی توضیح بدید. :متفکر:
اینکه چی هست؟ دستوراتش چیه؟ و چه مواقعی خوبه ازش استفاده کنیم

mpmsoft
سه شنبه 01 بهمن 1387, 11:52 صبح
یک نگاه به لینک زیر بنداز این مطلب هم توی سایت زیاد مطرح شده بود سرچ می کردی زودتر به نتیجه می رسی

http://www.taylorsnet.co.uk/SourceCodeDetail.aspx?SourceID=20

baran_mehr
سه شنبه 01 بهمن 1387, 22:52 عصر
سلام.
ممنون سایت خوبی بود. اما توی اون درباره این موضوع توضیح نداده فقط یه مثال زده .
مگه چند پردازشی رو با Thread انجام میدن؟

salehbagheri
چهارشنبه 02 بهمن 1387, 00:57 صبح
مگه چند پردازشی رو با Thread انجام میدن؟

تقريباً! در واقع معني كلمه چند پردازشي يعني Multi Threading !

از اين شيوه در جاهاي مختلف و بسياري استفاده ميشه! جستجو كنيد!

Mehdi Asgari
چهارشنبه 02 بهمن 1387, 03:20 صبح
سوالت به قدری کلی هست که یک جواب واحد و جامع براش پیدا نخواهی کرد.
ساده ترین جوابی که میتونم بدم اینه: "چند پردازشی همونطور که از اسمش بر می یاد ، پردازش بیش از یک عنصر به طور همزمان هست. این عنصر ها واحد های عملیاتی هستن ؛ یعنی کاری که توسط یه پردازنده انجام میشه"
این کار چه مزیتی داره ؟ سرعت اجرای برنامه ها بالا میره. معمولا (در مقیاس من و تو) واحدهای عملیاتی Thread نام دارن. هر برنامه متشکل از یک یا تعداد بیشتری thread هست. مثلا در برنامۀ Download manager یک (یا بیشتر) threadمسئول انجام دانلود و کارهای مربوط به شبکه و I/O هستن و یک (یا بیشتر) thread هم مسئول GUI و کارای گرافیکی و ... (یه مثال دیگه: برنامه ای داریم که قراره تا 100 هزار رقم عدد پی رو حساب کنه. مطمئنا این کار خیلی وقت گیره و اگه برنامۀ ما فقط یک thread داشته باشه و اون هم مشغول انجام محاسبات و ... بشه ، رابط برنامه یخ می زنه. حتما همچین تجربه ای داشتی ، برنامه ای هنگ می کنه و هر چی روش کلیک می کنی هیچ اتفاقی نمی افته . بعد یه پنجره می یاد که یه دکمۀ Cancel و یه End now داره. حالا در این سناریو می تونیم بخش محاسبۀ عدد pi رو بسپاریم به یه thread مجزا و رابط کاربر رو بدیم دست کاربر تا در حین انجام محاسبات بتونه از دیگر قابلیت های برنامه استفاده کنه.) (یه مثال دیگه: وقتی مدیا پلیرت در حال پخش موسیقیه ، میتونی بری تو library ، میتونی تنطیمات برنامه رو عوض کنی و ... ) {فکر کنم منظورم رو متوجه شدی}
خب ، اگه ما فقط یک پردازنده داریم ، چطور میتونیم به طور همزمان چندین کار رو انجام بدیم ؟
نمی تونیم. فقط توهم می زنیم که برنامه هامون دارن به صورت همزمان اجرا میشن ؛ در واقع سیستم عاملت (ویندوز ، لینوکس ، ...) بر اساس یه الگوریتمی با سرعت زیاد به برنامه ها وقت اجرا میده و اینقدر این کار رو سریع انجام میده که متوجه نمیشی. (در واقع نوبتی به برنامه ها اجازه میده که اجرا بشن.) اینو به خاطر بسپار: هر پردازنده در یک واحد زمانی فقط قادر به انجام یک کاره. حالا اگه یه سی پی یوی 2 هسته ای داری پس به طور واقعی (و نه توهم) میتونی همزمان دو کار رو انجام بدی. (تعمیمش بده به n)
یه تمرین کوچولو: task managerت رو اجرا کرده ، از منوی View گزینۀ Select Columns رو کلیک کن و از لیستی که ظاهر میشه کنار Threads یه تیک بزن. حالا OK کن و برگرد به تب Processes . یه ستون اضافه شده یه اسم Threads که نشون میده هر برنامه چند تا thread داره. (با یه برنامه ور برو و همزمان به کم و زیاد شدن تعداد thread هاش دقت کن)
هر برنامه ای که روی سیستمت در حال اجراست یه process رو تشکیل میده و هر process از چندین thread تشکیل میشه. واحد اجرای کد thread هست. ما در برنامه های ساده ای که می نویسیم از thread استفاده نمی کنیم (در واقع خیلی از برنامه نویسا از وجود همچین موجودی بی اطلاعن) بیشترین مورد کاربردی که thread ها در برنامه های معمولی (تک پردازشی) دارن جدا کردن رابط کاربری از عقب برنامه است (که داره کار اصلی رو انجام میده) حالا اگه یه سیستم داریم که بیش از یه پردازنده (هسته) داره ، می تونیم برنامه هامون رو طوری بنویسیم که چندین thread به طور همزمان چندین کار رو انجام بدن و در نتیجه سرعت اجرای برنامه بالاتر بره.
خب ، با این همه مزیت چرا ملت همۀ برنامه هاشون رو به صورت multi-threaded نمی نویسن ؟
لزوما چندپردازشی همیشه خوب نیست . باید نگاه کنی به مورد کاربردی که داری. اگه یه برنامه رو به شکل multi-threaded بنویسی ، ولی در واقع برنامه ات همون برنامۀ single-threaded باشه که فقط دوباره نویسیش کردی ، چیز زیادی به دست نمی یاری. ممکنه کندتر هم بشه (به خاطر context switching و مسائل مربوط به اشتراک منابع و ...)
در ضمن اگه به همین راحتی ها بود که مثلا با یه کلمۀ کلیدی برنامه هامون رو چندپردازشی کنیم که دیگه اصلا به شغل ما نیازی نبود. مشکلات زیادی در این مدل برنامه نویسی وجود دارن. مثلا در مدل shared-memory که مدل غالب و رایج برای برنامه نویسی موازی هست (استفاده شده در دات نت ، سی پلاس پلاس) (چندین thread به یک قسمت از حافظه دسترسی دارن) این مشکل به وجود می یاد که اگه دو thread هر کدوم قراره 10 بلوک اطلاعاتی رو در حافظه بنویسن و اولی که شروع کرد به نوشتن داده ها ، در بایت سوم دومی بیاد و شروع کنه همونجا اطلاعات رو بازنویسی کنه (یعنی قبل از اتمام کار اولی ، دومی بیاد گند بزنه به کارش) اون وقت تکلیف چیه ؟ فرض کن میتونیم هنگام انجام کارای حساس (مثلا تغییر در حافظه) اون قسمتی رو که نیاز داریم قفل کنیم. خب این خیلی خوبه. حالا اگه این اولی اومد اون حافظه رو قفل کرد (و دومی هم منتظره) و دیگه قفل رو باز نکرد (مثلا هنگ کرد) اون وقت تکلیف دومی چیه ؟ تا ابد منتظر بمونه ؟ (و خیلی مسائل دیگه که واردشون نمیشم)
البته مدل های دیگه ای هم داریم مثل Message passing (مورد استفاده در Erlang)؛ در این مدل (که مثل مدل زندگی واقعی می مونه) هر واحد کاری از بقیه مجزاست و حافظۀ خودش رو داره (همونطور که من و تو هر کدوم حافظه و مغز جدا داریم) و در صورت نیاز به دریافت/ارسال اطلاعات از/به دیگری ، یه پیام بهش می فرسته/می گیره (همونطور که من و تو برای برقراری ارتباط با هم از ارسال پیام (چشمک ، حرف ، sms ، مشت ، ...) استفاده می کنیم
در طراحی برنامه هایی که قراره به طور موازی اجرا بشن ، اولین و مهم ترین اصل ، طراحی برنامه به صورت n ماژول مجزا از هم هست (کار راحتی هم نیست که بتونی یه کار/الگوریتم رو به چند واحد تقسیم کنی و همۀ الگوریتم ها و مسائل هم قابل تقسیم نیستن)
یه مفهوم دیگه هم هست که زیاد واردش نمیشم و اون هم برنامه نویسی توزیعیه. (distributed programming) یعنی برنامه ای بنویسی که روی چند ماشین (کامپیوتر)اجرا بشه (به طور همزمان) و در نتیجه با استفاده از این اجرای موازی ، با سرعت/قدرت بالاتری محاسباتش رو انجام بده
در مورد این عبارات جستجو کرده و مطالعه کن:
Parallel Programming ،Multi-Core،Multi Threading ، Message Passing ، Shared Memory ، MPI ، Concurrency ، race condition ، deadlock ، Multi Processing ، cilk++ ، TBB ، Parallel FX ، openMP ، MISD ، MIMD
{به همین سادگی ها هم نبود ، ولی خیلی خودمونیش کردم که لااقل تصویر کلی دستت بیاد. چون بخوای همینطور بدون مقدمه و تجربه بخوای با مفاهیمش اصولی آشنا بشی تا مدتی مشکل خواهی داشت}
پ ن : به این نوع توضیحات میگن oversimplification ؛ دوستان حرفه ای در مورد جزئیات گیر ندید.

baran_mehr
چهارشنبه 02 بهمن 1387, 22:11 عصر
ممنون از دوستانه گلم.باید درباره این موضوع و توضیحات شما دوستان بیشتر تحقیق کنم.
از دوستان خواهش میکنم اگر برنامه ای در این رابطه دارن بگذارند تا ما هم استفاده کنیم.
ممنون

baran_mehr
چهارشنبه 02 بهمن 1387, 22:18 عصر
تا اونجایی که یادم میاد ما تو درس سیستم عامل یه بخش داشتیم مربوط بود به سیستم های چند پردازنده ای و چند پردازشی . تو یک قسمت داشتیم که: یه پردازش از قسمتهای کوچیک تر به نام Thread یا نخ تشکیل شده که هر Thread یک قسمت رو دست میگرفت و به صورت همزمان با هم کار میکردن و زمان Cpu رو بین خودشون تقسیم میکنن.
ایا دستور Thread که ما استفاده میکنیم داره با همون نخ های سیستم عامل کار میکنه یعنی مدیریت اونها رو داره؟
چطور میتونم چندین Thread رو همزمان از داخل برنامه کنترول کنم یعنی بگم به نوبت کار کنن؟

Mehdi Asgari
جمعه 04 بهمن 1387, 09:30 صبح
این مقاله واسه یه هفته قبله. بخونش: http://www.technicaltalk.net/index.php/topic,835.0.html
منبع: http://osnews.com/story/20833/Introduction_Parallel_Programming

Faizabadi
سه شنبه 15 دی 1388, 16:20 عصر
یه فایل PDF درباره Multi Threading در VB.Net برایت فرستادم