نمایش نتایج 1 تا 1 از 1

نام تاپیک: Win32 MultiThreading Performance

  1. #1

    Win32 MultiThreading Performance

    Win32 MultiThreading Performance


    هرگونه استفاده از مطالب فوق تنها با ذکر منبع و نویسنده مجاز است و استفاده از آن بهعنوان پروژه دانشجویی ممنوع است.

    با تشکر
    حاامد ذوالقدری

    چکیده

    این مقاله راهبردهایی را جهت باز نویسی برنامه های تک تردی بصورت برنامه های چند تردی مورد بحث قرار می دهد.همچنین کارایی محاسبات(Computation) چندتردی در مقابل محاسبات تک تردی برحسب توان عملیاتی و زمان پاسخدهی در پلت فرمهای win95وwinNT تحلیل می شوند.
    مقدمه
    بسیاری از مطالبی که در مورد مالتی تردینگ پیدا مبی کنید با مفاهیم همزمانی،همچون چگونگی سریالی کردن تردهاییکه از داده های مشترک استفاده می کنند،برخورد می نماید. این تمرکز بر روی همزمانی ارزشمند است زیرا همزمانی یک قسمت واجب و حتمی برنامه نویسی چند تردی می باشد.این مقاله یک قدم به عقب تر بر میدارد و از دیدگاهی دیگر بر چندتردی تمرکز دارد:
    چگونه میتوان یک محاسبه را به چند ترد تقسیم کرد؟
    نخستین بخش از این مقاله اپلی کیشن های چندتردی را از لحاظ لغوی بررسی نموده و زاویه دید سویت تست را مورد بحثقرار داده وچگونگی طراحی اپلی کیشن های سویت نمونه را توصیف می کند.
    بخش دوم نتایج تست را مورد بحث قرار داده و شامل توصیه هایست برای طراحی اپلی کیشن های چندتردی.
    لغت شناسی MultiThreading

    فرض کنید اپلی کیشنی دارید که مدتهای طولانی است که مدتهای طولانی است به خوبی کار می کندو قابل اعتماد است اما بصورت وحشتناکی کُند است و شما ایده هایی دارید که می خواهید با استفاده از انها از مالتی تریدینگ بهره خوبی بگیرید.قبل از شروع بکار چند لحظه صبر کنید،تله های زیادی وجود دارند که ممکن است باعث شوند شما معتقد شوید که یک طراحی چندتردی بخصوص خوب است،در حالیکه واقعیت چنین نیست.
    قبل از اینکه نتیجه گیری کنید که ما می خواهیم چه چیزی را در اینجا به شما منتقل کنیم، اجازه دهید ابتدا مواردی را که نمی خواهیم مطرح کنیم مورد بحث قرار دهیم:
    *ما با کتابخانه های مختلفی که امکان به دسترسی به چندتردی را در رابط برنامه نویسی اپلی کیشن (API)تحت Win32 فراهم می کنند کاری نداریم.اپلی کیشن سویت نمونه Thread.exe،با استفاده از APIچندتردی win32در کتابخانه کلاس مایکروسافت (MFC)نوشته شده است،اما اصلا اهمیت نمی دهیم که آیا از کتابخانه زمان اجرای C (CRT)،کتابخانه MFCیا APIwin32در ایجاد و نگهداری ترد استفاده شده است یا نه؟ بعنوان یک موضوع واقعی ،در پایان روز ، هر کدام از این کتابخانه ها با استفاده از CreateThraedبدرون سرویس سیستم win32فراخوانی می شوند تا یک تردکاری را ایجاد نمایند و خود چندتردی تئسط سیستم عامل انجام می گیرد.اینکه از کدامیک از مکانیزمهای کپسوله بندی استفاده می کنید برای اهداف این مقاله چندان تفاوتی نمی کند. هنگام استفاده از یک کتابخانه خاص ممکن است کارایی کاهش یابد و یا بهبود پیدا کند اما چیزی که اینجا بیشتر مورد نظر ماست ضروریات چندتردی است نه کتابخانه ای خاص.
    *موضوعات این مقاله به اپلیکیشن های چندتردی که برروی ماشین های تک پروسسوره اجرا می شوند مرتبط است.ماشین های چند پروسسوره در یک مقوله کاملا متفاوت قرار دارند و تقریبا هیچکدام از موضوعات این مقاله بر روی این ماشین ها بکاربرده نمی شوند.
    *در این مقاله گاهگاهی از لفظ "Computation" (محاسبه)استفاده می کنیم.یک محاسبه بعنوان یک ریزکار از اپلی کیشن شما تعریف می شود که ممکن است در قسمتهای مختلف اجرا شود و یا بعنوان یک کار کامل قبل،بعد و یا همزمان با یک محاسبه دیگر اجرا شود.
    بعنوان مثال اپلی کیشنی را در نظر بگیرید که داده هایی را از کاربر دریافت کرده و آنها را بر روی دیسک ذخیره می کند.میتوانیم تمام داده ها را بعنوان یک محاسبه و ذخیره کردن آنها را نیز بعنوان یک محاسبه دیگر در نظر بگیریم.بسته به چگونگی طراحی اپلی کیشن،ممکن است ذخیره کردن داده ها را پس از هر وارد کردن هر داده جدید انجام دهیم ویا منتظر باشیم تا کاربر تمام داده ها را وارد کندو سپس آنها را ذخیره کنیم.حالت رسمی تر می تواند بعنوان نمونه با استفاده از نوعی چندتردی پیاده سازی شودو یا در حالتی دیگر برنامه فقط با استفاده از یک ترد پیاده سازی شود.
    *طراحی برنامه های همروند یک پروسه کامل پچیده است .بعد از خواندن این مقاله شما باید قادر باشیدبا نگاه کردن به یک طراحی داد ه شده متوجه شوید که آیا ان طراحی داده شده کارایی کلی این اپلی کیشن را کاهش می دهد یا افزایش.
    *سمتی از رویه طراحی اپلی کیشن های چندتردی مشخص می کنند که در کجا دسترسی به داده می تواند سبب بروز برخورد بین تردهای مختلف گردد و نیز چگونه با استفاده از همزمانی تردها از چنین برخوردهایی جلوگیری کنیم.از این موضوع به عنوان "Thread Serialization" یاد می شود. برای مباحث این مقاله فرض می کنیم محاسبه هاییکه وجود دارند هیچگونه داده مشترکی ندارند وبنابراین نیاز به سریالی کردن ندارند.
    این شرط ممکن است کمی محدود کننده به نظر برسد اما در نظر داشته باشید ممکن است هیچ بحث نوعیی از اپلی کیشن های چندتردی همزمان مطرح نباشدزیرا هر سریالی کردن را مجبور به پیروی از الگوی انتظار نموده و رفتن یونیک را به تردهای همزمان اعمال می کند که بصورت مستقیم بر کارایی تاثیر دارد.
    بسیاری از اعمال(I/O)تحت win32به دو دسته تقسیم می گردند:
    1.همزمان
    2.غیر همزمان
    که در بسیاری از موارد یک طراحی چند تردی با استفاده از همزمانی I/Oمیتواند تقریبا با استفاده از I/Oتک تردی غیر همزمان.
    این مقاله تبدیل I/Oهای تک تردی غیر همزمان را بعنوان یک چند تردی مورد بحث قرار نمی دهد. توجه داشته باشید که با توجه به چگونگی طراحی سیستم win32 مکانیزم هایی که سبب ترجیح I/Oهای همزمان بر I/O های غیر همزمان می شوند بسیار کم اند.
    *چندتردی و رابط گرافیکی کاربر با همدیگر به خوبی کار نمی کنند.در این مقاله چنین در نظر می گیریم که کاریکه می تواند بوسیله یک ترد پس زمینه انجام گیرد بهیچوجه از GUIویندوز استفاده نمی کند،نوع تردهاییکه ما با آنها برخورد می کنیم صرفا
    “Worker Thread” هستندکه کارهای پس زمینه را انجام می دهند و نیازی به محاوره مستقیم با کاربر ندارند.
    *در مقابل محاسبه های محدود ،محاسبه های نامحدود وجود دارند.یک مثال از این نوع محاسبه ها ترد گوش دادن در یک اپلی کیشن سرور می باشد که برای هیچ کار خاصی بکار گرفته نمی شود و فقط منتظر می ماند تا یک Clientبه Serverمتصل شود.پس از انکه یک Client وصل شد آن ترد یک پیغام را جهت اطلاع به ترد اصلی می فرستد و دوباره به حالت گوش دادن بر میگردد تا Clientبعدی وصل شود.بصورت معمول مادامیکه یک عملگر I/O غیر همزمان بکار گرفته شده است یک چنین محاسبه هایی نمی توانند بعنوان یک اپلی کیشن رابط کار در همان ترد بکاربرده شوند.ما در این مقاله با محاسبه های محدودی سروکار داریم که ریز کارهایی از اپلی کیشن هایی هستند که بعد از یک زمان محدود به پایان می رسند.

    --------------------
    Versus I/O-Bound Computations CPU-Bound
    یکی از مهمترین فاکتورهاییکه مشخص می کند که آیا یک محاسبه داده شده کاندید خوبی برای یک ترد جداگانه هست یا نه اینست که آیا ترد CPU-Boundاست یاI/O-Bound . یک محاسبه CPU-Bound که در بیشتر زمانش از CPUاستفاده می کند نمونه هایی از محاسبه های CPU-Bound به شرح زیرند:
    *محاسبه های ریاضی پیچیده،همانند دستکاریهای ماتریس ها،کار بر روی گرافها، محاسبات گرافیکی Off-Screen
    *کار بر روی فایل های تصویری مقیم در حافظه همانند اسکن کردن یک تصویر حافظه از یک فایل متنی برای یک رشته داده شده.
    در مقایسه با CPU-Boundها، I/O-Boundها محاسبه هایی هستند که بیشتر وقت خود را صرف انتظار برا ی درخواست I/O جهت کامل کردن کارشان می کنند.در بسیاری از سیستمهای عامل مدرن ،دستگاه I/O تازه وارد شده به صورت غیر همزمان یا بوسیله یک پردازشگر اختصاصی عملیات ورودی-خروجی یا بوسیله یک هندلر وقفه کاراسرویس داده می شود و درخواست I/O از یک اپلی کیشن فراخوانی ترد را تا کامل شدن I/Oبه تعویق می اندازند.تردهاییکه بیشتر وقتسان را صرف انتظار برای یک درخواست I/O میکنند در تلاش برای گرفتن CPU با دیگر تردها رقابت نمی کنند. بنابراین محاسبه های I/O-Bound ممکن نیست کارای تردهای دیگر را به اندازه محاسبه های CPU-Bound کاهش دهند.

    Goals Of MultiThreading Designs
    قبل از انکه در مورد چند تردی کردن اپلی کیشن تان فکر کنید بهتر است از خود بپرسید که اهداف اینکار چیست؟
    چندتردی چند مزیت بالقوه دارد:
    *افزایش کارایی
    *افزایش توان عملیاتی
    *قابلیت بالا در پاسخدهی به کاربر
    اجازه دهید هر کدام از موارد فوق را توضیح دهیم:
    Performance
    کارایی را به صورت ساده بعنوان کل زمان منقضی برای یک محاسبه یا مجموعه ای از محاسبه های داده شده تعریف می کنند.
    بر اساس تعریف،مقایسه کارایی فقط در مورد محاسبه های محدود صورت می گیرد.می خواهید باور کنید یا نه ،اما سناریو هایی که در انها چند تردی سبب افزایش کارایی می گردد مواردی محدود اند.دلایل این مامر واضح نیستند اما کاملا معقولند:
    *مادامیکه یک اپلی کیشن بر روی یک ماشین چند پروسسوره اجرا می شود(ماشینی که در آن ریزکارها می توانند واقعا به صورت موازی اجرا شوند) محاسبه های CPU-Bound در حالت چندتردی نمی توانند سریعتر از حالت تک تردی اجرا شوند علت این امر این است که محاسبات چه بصورت یک تکه بزرگ باشند چه بصورت قطعه قطعه بایستی توسط همان یک CPU ی تنها انجام پذیرند.بعنوان یک قانون یک مجموعه از محاسبه ها هنگامیکه بصورت چندتردی انجام می شوند دیرتر از زمانیکه بصورت ترتیبی انجام می شوند پایان می یابند زیرا در حالت چندتردی سربار اضافی برا یتولید تردها ونیز سویئچ کردن CPU بین تردها بوجود می اید.طبیعتا بایستی نقاطی وجود داشته باشد که در آن نتایج یک محاسبه بایستی به هر طریقی با محاسبه های دیگر همزمان شود،بدون توجه به اینکه کدام محاسبه نخست باید پایان یابد.بعنوان مثال ، اگر چند ترد برای خواندن چندین فایل بصورت همزمان بداخل حافظه بکار برده شوند این بسیار محتمل است که بدون توجه به ترتیبی که در ان فایلها پردازش می شوند ،در بعضی از نقاط اپلی کیشن قبل از پردازش بایستی منتظر خواندن تمام داده ها به داخل حافظه باشد.
    برای اهداف این مقاله ما کارایی را برحسب زمان elapse که آن کل زمانی است که محاسبه برای کامل شدن به ان نیاز دارد اندازه گیری می کنیم.
    توان عملیاتی (یا پاسخگویی) به میانگین زمان دورگشت برای هر محاسبه بستگی دارد. بعنوان مثالی برای مشخص شدن توان عملیاتی یک سوپرمارکت(ابزار همیشگی مجسم سازی برای سیتم عاملها) را در نظر بگیرید:
    فرض کنید یک محاسبه در هر بار وارسی به یک مشتری سرویس می دهد.یک محاسبه یا می تواند برای هر مشتری یک شمارنده وارسی جدا باز کند و یا برای همه مشتری ها از همان یک شمارنده استفاده کند.برای آنکه شمارنده ما درست باشد نیاز داریم در حالت اول فقط یک صندوقدار (بیچاره) به همه مشتری ها سرویس دهد به توجه به اینکه انها در یک یا چند شمارنده وارسی به صف شده اند.چنین ابرصندوقداری با سرعت بالا از یک شمارنده به شمارنده دیگر می رود و در هر لحظه فقط یک ایتم را از یک مشتری می گیرد و سپس به مشتری دیگر سرویس می دهد. چنین ابر صندوقداری شبیه CPUی است که در بین چندین محاسبه در حال سوئیچ کردن است.
    همانطوریکه در بخش کارایی دیدیم در حالتیکه چندین صف وارسی باز است زمان کلی که برای خدمت کردن به همه مشتریها لازم است کاهش نمی یابد،زیرا بدون توجه به اینکه آیا مشتری ها از یک یا چندین صف وارسی مختلف سرویس داده می شوند یا نه همیشه همان یک صندوقدار است که بایستی همه کارها را انجام دهد.بهرحال ، اغلب مشتریان یک ابرصندوقدار را بر فقط یک صف وارسی ترجیح می دهند. علت این امر ان است که معمولا کارت های مشتریان با هم فرق می کند تعدادی از انها ایتم کمی و تعدادی نیز ایتم های زیادی در کارت خرید خویش دارند.
    اگر شما تا بحا ل خواسته باشید فقط دو نوع جنس خریداری کنید و پشت سر کسی قرار گرفته باشید که می خواهد برای 24 نفر خرید انجام دهد انگاه متوجه خواهید شد که من در مورد چه موضوعی حرف میزنم.!
    در هر حالت اگر صندوقداری بجای ایستادن در یک صف با سرعتی بالا به شما سرویس دهی کند، شما احتمالا اهمیت نمی دهید که آیا کمی یا بیشتر زمان زمان می گیرد تا خرید شما کامل گردد زیرا در هر صورت خرید دو آیتمی تقریبا با سرعتی بالا صورت می گیرد و کارت خرید 24 نفری در یک شمارنده متفاوت قرار میگیرد بنابراین کار شما با سرعت مناسبی صورت می گیرد.
    بنابراین، توان عملیاتی معیاریست برای مشخص نمودن اینکه چگونه بسیاری از محاسبه ها می توانند در یک زمان داده شده صورت گیرند.
    اگر وارد سوپرمارکتی شوید و امیدوار باشید که کارتان پس از 2 دقییه پایان یابد ولی 2 ساعت منتظر می مانید فقط به خاطر انکه پشت سر یک نفر قرار گرفته اید که می خواهد خرید زیادی انجام دهد در اینصورت می گویید که پیشرفت شما کثیف(Lousy)بوده است .
    برای اهداف این مقاله زمان پاسخدهی برای یک محاسبه را برابر با زمانی که طول می کشد تا ان محاسبه به پایان برسد تقسیم بر زمانی که برای پایان یافتن آن متصور شدده بودیم در نظر می گیریم. بنابراین محاسبه ای که انتظار میزود بعد از 10 میلی ثانیه به پایان برسد ولی 20 میلی ثانیه زمان می گیرد دارای زمان پاسخدهی 2 است، اما اگر همان محاسبه بعد از 200 میلی ثانیه پایان پذیرد(احتمالا به علت قرار گرفتن پشت سر یک محاسبه طولانی)،زمان پاسخدهی 20 خواهد بود.واضح است هرچه زمان پاسخدهی کمتر باشد، بهتر است.
    همانطوریکه بعدا خواهیم دید ،توان عملیاتی متواند فاکتور مهمی در معرفی چند تردی به درون یک اپلی کیشن باشد حتی اگر کارایی کلی کاهش یابد.بهر حال برای آنکه کارایی بصورتی مناسب توسط توان عملیاتی اندازه گیری شود شرایط مشخصی باید در نظر گرفته شود:
    1.هر محاسبه باید از بقیه مستقل باشد تا نتایج محاسبه به محض تمام شدنش قابل استفاده باشد.اگرشما عضوی ازیک تیم فوتبال دانشگاهی هستیدومی خواهید از یک سوپرمارکت خرید کنید برایتان فرقی نمکند که اول خرید خود را انجام دهید یا در صف منتظر بمانید واخرین نفر خریدتان را انجام دهید چون در حالت تا زمانیکه همه اعضای تیم به داخل اتوبوس برنگشته اند اتوبوس حرکت نخواهد کرد.
    همانگونه که قبلا یاداوری کردیم ،بسیاری از اپلی کیشن ها زودتر یا دیرتر محاسبات خود را به صورت صریح یا ضمنی همزمان می کنند.بعنوان مثال اگر اپلی کیشن شما داده هایی را از فایل هایی مجزا بصورت همزمان جمع اوری می کند شما احتمالا می خواهید نتیجه را بر روی صفحه نمایش نشان دهید یا انها را در یک فایل دیگر ذخیره نمایید.در حالت رسمی تر (نمایش نتایج بر روی صفحه نمایش)شما باید مطلع باشید که بیشتر سیستمهای گرافیکی نوعی بسته بندی یا سریالی کردن داخلی را انجام می دهندکه ممکن است تا زمانیکه همه خروجی جمع اوری نشده اند چیزی را نشان ندهد،بنابراین ممکن است تمام مزایایی که شما از پردازش فایلها بدست می اورید هنگامیکه کسی یا چیزی(اپلی کیشن، سیتم عامل یا حتی کاربر) نتایج را به شکلی سریالی کند،از بین برود.
    2.محاسبات مضمونا،بایستی اندازه های مختلفی داشته باشند:اگر هر خریدار سوپرمارکت بخواهد فقط دو قلم داده خریداری نمایدسر صندوقدار کار فوق العاده ای انجام نمی دهد اگر کارش این باشد که بین 3 رجستر موقت که هر کدام به یک مشتری با فقط دو قلم داده (یا 3 یا 4 قلم داده)سرویس می دهند ،امد و شد داشته باشد ،بنابراین هر مشتری بایستی n بار منتظر بماند تا خریدش به پایان برسد،که بدتر از حالتی است که همه مشتریان در یک خط منتظر باشند.
    3.اگر زمان اجرای محاسبات از قبل مشخص باشد ، یک پروسه سریالی بهتر از یک پروسه چند تردی خواهد بود ،کافیست محاسبات با یک ترتیب صعودی چیده شده باشند.در مثال سوپر مارکت،بصف کردن مشتریها بر حسب تعداد کالاهای مورد نیازشان مطابق با این مساله خواهد بود،ایده پشت این مساله بدین صورت است:
    مشتریهایی که قصد خرید تعداد کالا های کمتری دارند اگر به خاطر این کار کوچک شان کمتر منتظر بمانند مورد احترام قرار گرفته اند امامشتریهایی که قصد خرید تعاد کالا های بیشتری دارند بهرحال به خاطر تعداد کالاهای زیاد مورد نیازشان هم که شده مجبورند وقت بیشتری را صرف نمایند.
    اگر زمان بین وقوع دو رویداد را بصورت تقریبی می دانید اما اپلی کیشن شما نمی تواند این رویداد ها را مرتب کند شما باید زمانتان را جهت یک تحلیل بدترین حالت تلف کنید،در یک چنین تحلیلی فرض شما بر این است که محاسبات در یک نظم زمانی صعودی مرتب نشده اند بلکه برعکس در یک ترتیب نزولی قرار گرفته دارنداین سناریو بر حسب زمان پاسخگویی بدترین حالت در نظر گرفته می شود .
    آخرین ویرایش به وسیله Identifier : پنج شنبه 13 مهر 1385 در 20:24 عصر دلیل: این پست به دلیل تکراری بودن بطور خودکار ادغام شده است.

تاپیک های مشابه

  1. مقاله - MultiThreading چیست؟
    نوشته شده توسط علیرضا مداح در بخش مقالات مرتبط با Microsoft .Net Framework
    پاسخ: 12
    آخرین پست: جمعه 27 اسفند 1389, 22:29 عصر
  2. MultiThreading
    نوشته شده توسط yavari در بخش VB.NET
    پاسخ: 1
    آخرین پست: پنج شنبه 31 خرداد 1386, 16:15 عصر
  3. Multithreading in Visual Basic.NET
    نوشته شده توسط بابک زواری در بخش VB.NET
    پاسخ: 0
    آخرین پست: پنج شنبه 06 بهمن 1384, 00:29 صبح
  4. MultiThreading
    نوشته شده توسط soccer player در بخش C#‎‎
    پاسخ: 4
    آخرین پست: سه شنبه 20 دی 1384, 16:17 عصر
  5. Multithreading
    نوشته شده توسط Farhad.B.S در بخش برنامه نویسی در 6 VB
    پاسخ: 3
    آخرین پست: چهارشنبه 19 آذر 1382, 13:20 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •