Table of Contents
Concurrency و Multithreading مفاهیم اصلی در علوم کامپیوتر است که اجازه می دهد مهندسان به ساخت سریع، پاسخگو و مقیاس پذیر نرم افزار، به عنوان سیستم به طور فزاینده ای متکی بر پردازنده های چند هسته ای و معماری توزیع شده، تسلط بر این موضوعات برای مقابله با تنگناهای عملکردی، اطمینان از یکپارچگی داده ها و دستیابی به استفاده از منابع کارآمد ضروری است.
Concurrency چیست؟
Concurrency به توانایی یک سیستم برای رسیدگی به وظایف متعدد در دوره های زمانی همپوشانی اشاره می کند، لزوما به این معنی نیست که وظایف در همان لحظه دقیق اجرا می شوند (parallelism ، بلکه سیستم می تواند پیشرفت در چندین کار را با ترکیب کردن Concurrency از طریق تداخل و پاسخگویی، به ویژه در برنامه های تعاملی / یا برنامه های تعاملی بهبود بخشد.
Concurrency را می توان از طریق چندین مکانیسم به دست آورد:
- [در این میان] [در این میان] چند کتاب [[[۱]] [۱] [۱۰] [۳] [۳] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۱] [۱] [۳] [۱]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳]]] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [
- [FLT 1] پردازش چند پردازش [FLT 1] - فرآیندهای متعدد که ممکن است بر روی هسته های جداگانه CPU اجرا شود.
- برنامه نویسی ناهمزمان - عملیات غیر بلوکی که اجازه می دهد یک رشته واحد برای رسیدگی به بسیاری از وظایف (به عنوان مثال، با استفاده از callbacks، آینده یا async / await).
سیستم عامل های مدرن و زمان اجرا، ارزهای اولیه مانند موضوعات، فرآیندها و حلقه های رویداد را فراهم می کند. درک تجارت بین این رویکردها یک مهارت بنیادی برای مهندسان است.
برای یک شیرجه عمیق تر در مدل های ارز، خواندن وکیپزیاس را در مورد ارز در نظر بگیرید.
درک Multithreading
Multithreading یک پیاده سازی خاص از concurrency است که در آن یک فرآیند تک رشته های چندگانه را ایجاد می کند که فضای حافظه و منابع را به اشتراک می گذارد.هر رشته دارای پشته تماس و برنامه ضد، اما همه موضوعات در یک فرآیند می تواند خواندن و نوشتن برای حافظه جمعی مشترک است.این دسترسی مشترک هر دو یک قدرت و یک آسیب پذیری است.
جنبه های کلیدی چند جلدی عبارتند از:
- و یا در این میان، به صورت مستقیم و با استفاده از آن، به صورت مستقیم یا به صورت زیر به صورت زیر به صورت زیر به صورت زیر به صورت زیر ساخته شده است.
- [در این باره] [و] [و] [از این رو] چرخه حیات [و [و] [و] [و [از جمله] [و] [و]] [و [از نو، قابل اجرا، مسدود، انتظار، زمان انتظار و پایان دادن [در انتظار].
- تغییر متن - سوئیچ های سیستم عامل بین رشته ها، باعث برخی از سربار.
- منابع به اشتراک گذاشته شده [FLT 1] - ساختارهای داده، فایل ها و اتصالات باید از دسترسی همزمان محافظت شوند.
Multithreading به ویژه برای وظایف CPU که می تواند موازی (به عنوان مثال پردازش تصویر، شبیه سازی های علمی) و برای وظایف I / O-bound مفید است که در آن موضوعات می توانند منتظر داده ها باشند در حالی که دیگران کار می کنند (به عنوان مثال، سرورهای وب) اما استفاده نادرست می تواند منجر به اشکالات ظریف مانند شرایط نژاد، قفل های مرده، و حالت ناسازگار شود.
برای راهنمایی عملی در مورد Multithreading Java، آموزش Java Concurrency یک منبع عالی است.
تفاوت های کلیدی بین Concurrency و Multithreading
اگرچه اغلب به صورت متناوب استفاده می شود، اما همزمان و چند خواندن مفاهیم متمایز هستند. جدول زیر تفاوت های اصلی را برجسته می کند (با استفاده از یک لیست معنایی):
- Concurrency یک ملک از یک سیستم است - می تواند چندین کار را به طور همزمان انجام دهد.این ممکن است از طریق تکنیک های چند جلدی، چند پردازش یا ناهمزمان به دست آید.
- [FLT 1] [FLT 1: 1] یک تکنیک برنامه نویسی است که از چندین رشته در یک فرآیند واحد برای دستیابی به ارز استفاده می کند.
- Concurrency بر برنامه های ساختار بندی تمرکز دارد تا وظایف متعدد را به صورت یک بار انجام دهد، در حالی که Multithreading یک جزئیات پیاده سازی سطح پایین است.
- Multithreading شامل حافظه مشترک است که چالش هایی مانند شرایط مسابقه و مشکلات سازگاری حافظه را معرفی می کند. Concurrency در سطح بالاتر (به عنوان مثال، مدل بازیگر) ممکن است از حالت مشترک اجتناب کند.
- یک سیستم می تواند بدون استفاده از موضوعات در همه جا (به عنوان مثال، برنامه نویسی مبتنی بر رویداد با یک رشته واحد) همزمان باشد.
- موازی واقعی نیاز به چندین هسته CPU دارد، اما می توان با استفاده از زمان، یک هسته واحد را شبیه سازی کرد.
سوالات رایج در مورد Concurrency و Multithreading برای مهندسان
مهندسان اغلب بر توانایی خود در مورد برنامه های همزمان و کد چند منظوره با اشکال زدایی آزمایش می شوند.در زیر چندین سوال گسترده با توضیحات دقیق وجود دارد.
1.چگونه از شرایط نژادی جلوگیری می کنید؟
یک وضعیت نژادی زمانی اتفاق می افتد که دو یا چند رشته دسترسی به داده های مشترک همزمان داشته باشند و نتیجه نهایی بستگی به زمان اجرای آنها دارد.
- [[۱] [۱۰] [۱] [۱۰]] - اطمینان حاصل کنید که تنها یک رشته می تواند در یک زمان وارد یک بخش بحرانی شود.
- [[۱] [۱۰] [۱۰] [۱۰] [۱]] - کنترل دسترسی به یک استخر محدود از منابع.
- عملیات های آئوتوmic - از دستورالعمل های سطح CPU (به عنوان مثال مقایسه و-swap) برای به روز رسانی های ساده استفاده کنید.
- [[۱] [۱۰] - [۱] - ۲] - اجازه دهید که متن های همزمان اما منحصر به فرد نوشته شود.
- اشیاء بی نظیر [FLT 1] – داده هایی را به اشتراک بگذارید که نمی توانند اصلاح شوند، و به طور کامل از بین بردن نژادها.
- [[۱] [۱۰]-۱۰] ذخیره سازی محلی [FLT ۱] - هر رشته را به صورت خود کپی کنید.
انتخاب مکانیسم بستگی به ماهیت منابع مشترک و ویژگی های عملکردی مورد نیاز دارد.
بن بست چیست و چگونه می توان از آن اجتناب کرد؟
Deadlock وضعیتی است که دو یا چند رشته هر کدام منتظر یک منبع هستند که توسط یک رشته دیگر نگهداری می شود و باعث می شود همه به طور نامحدود متوقف شوند: شرایط کلاسیک برای Deadlock عبارتند از: محرومیت متقابل، نگه داشتن و انتظار، هیچ گونه پیش خالی و تکنیک های اجتناب از دایره ای عبارتند از:
- سلسله مراتب منبع - یک سفارش جهانی برای منابع اختصاص دهید و به موضوعات برای به دست آوردن قفل در آن سفارش نیاز دارد.
- [در این باره] [در این باره]، [و] [از این رو] [و] [به] [و [از این رو] [در قیامت]] [و [از روی]] قفل [و [در قیامت] باز می شود] و پس از یک دوره ی خاص، قفل را باز می کند.
- [در این میان] [در این صورت] [به صورت مستقیم] تشخیص داده می شود که به بن بست اجازه می دهد که رخ دهد، اما مکانیسمی برای شکستن آنها (به عنوان مثال، اصطلاح یک رشته).
- برنامه نویسی بدون قفل [FLT 1] - از عملیات اتمی برای جلوگیری از قفل ها استفاده کنید.
مهندسان باید به دقت الگوهای خرید قفل و آزمایش را تحت قرارداد سنگین برای گرفتن قفل های بالقوه طراحی کنند.
۳- هماهنگ سازی موضوعات چگونه بر عملکرد تاثیر می گذارد؟
Synchronization تضمین سازگاری داده ها اما معرفی سربار.The key Performance-offs عبارتند از:
- [در این میان]، هنگامی که بسیاری از افراد سعی می کنند یک قفل را به دست آورند، اجرای آن را به صورت منظمی کاهش می دهند.
- تغییر متن - موضوعات که بر قفل ها قفل می کنند، سیستم عامل را مجبور به تغییر زمینه می کنند، که گران است.
- {FLT 1} - به اشتراک گذاری داده های قابل تغییر حافظه ذخیره سازی CPU را، افزایش ترافیک حافظه.
- جرم و رسوم - قفل های دانه دار ضخیم (به عنوان مثال، یک قفل جهانی) ساده سازی تصحیح اما محدود کردن ارز؛ قفل های دانه دار (به عنوان مثال، قفل های پیاده روی) بهبود موازییسم اما افزایش پیچیدگی و قفل مرده.
استراتژی های مدرن مانند قفل کردن قفل، قفل های خواندن و ساختارهای داده همزمان (به عنوان مثال، به تعادل ایمنی و سرعت کمک می کنند.
{{توضیح: | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
کلمه کلیدی تضمین می کند که ارزش متغیر همیشه از حافظه اصلی خوانده شده و نوشته شده است، جلوگیری از نخ محلی مشکل دید را حل می کند: نوشتن برای یک متغیر متغیر فرار بلافاصله برای تمام رشته ها قابل مشاهده است، با این حال FLT:0not تضمین اتمی برای عملیات ترکیبی (به عنوان مثال برای کنترل استفاده می شود.
۵- یک استخر نخ چیست و چه زمانی باید از آن استفاده کنید؟
یک استخر رشته مجموعه ای از موضوعات از قبل ایجاد شده است که می تواند برای اجرای وظایف استفاده شود. مزایای شامل کاهش سربار از ایجاد thread و پارگی، زمان پاسخ بهبود یافته و استفاده از منابع کنترل شده ایده آل برای رسیدگی به بسیاری از کارهای کوتاه مدت یا I / O-bound، مانند خدمت به درخواست های HTTP شامل پیاده سازی های رایج است.5 در جاوا و پایتون.
مراقبت باید به اندازه مناسب استخر گرفته شود: تعداد بسیار کمی از رشته های زیرکونک های CPU را کم می کنند، در حالی که بسیاری از آنها باعث تغییر بیش از حد زمینه و مصرف حافظه می شوند.
قانون Amdahl چیست و چرا برای عملکرد چند رشته ای اهمیت دارد؟
قانون Amdahl بیان می کند که سرعت یک برنامه با استفاده از پردازنده های متعدد توسط بخش متوالی برنامه محدود می شود. Mathly: [سرعت = 1 / ((1 - P) + P / N) [FLT 1]، که P بخش موازی قابل توجه و N تعداد پردازنده ها است.
بهترین تمرین ها برای مهندسانی که با Concurrency کار می کنند
برای نوشتن کد منسجم و با عملکرد بالا، این دستورالعمل ها را دنبال کنید:
- انتزاع سطح بالاتر [FLT 1] - استفاده از خدمات اجرایی، استخرهای رشته و مجموعه های همزمان به جای مدیریت موضوعات خام.
- داده های قابل استفاده را ابتدا [FLT 1] - از حالت جهش یافته مشترک در هر کجا که ممکن است استفاده کنید.
- ظرفیت قفل [FLT 1] را در نظر بگیرید، فقط برای کوتاه ترین زمان لازم برای انجام عملیات بحرانی قفل کنید.
- استفاده از الگوریتم های بدون قفل برای عملیات ساده - متغیرهای اتمی و مقایسه- و-swap می تواند کارآمد تر از قفل ها باشد.
- آزمون تحت ارز واقعی [FLT 1] - استفاده از ابزار تست استرس و مواد مخدر برای تشخیص نژادها، قفل های مرده و فساد داده ها.
- [[۱] [۱۰] [۱۰] [۱] [۱۰] [۱]] [۱]] [۱] [۱] [۱] [۱]] [۱]] [۱] [۱] [۱۰] [۱]] [۱۰] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۵] [۱] [۱] [۱] [۱]]]] [۱]]]] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱]]] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱
- گزینه های جایگزین - مدل های بازیگر (به عنوان مثال، Akka)، انتقال پیام یا جریان های واکنشی برای کاهش وضعیت مشترک را بررسی کنید.
درک کامل از پلت فرم زیر زمینه (به عنوان مثال، مدل حافظه جاوا، موضوعات POSIX یا پایتون GIL) برای اشکال زدایی رفتار عجیب و غریب ضروری است.
نتیجه گیری
Concurrency و Multithreading فقط مفاهیم نظری نیستند؛ آنها ابزارهای عملی هستند که به طور مستقیم بر کیفیت نرم افزار تاثیر می گذارند.با یادگیری برای شناسایی شرایط نژادی، جلوگیری از قفل های مرده و مدیریت محتوای منابع، مهندسان می توانند سیستم هایی را طراحی کنند که هر دو سریع و قابل اعتماد هستند. سوالات مصاحبه برجسته در این مقاله نشان دهنده نقطه شروع مطالعه عمیق تر به عنوان چند هسته ای و محاسبات توزیع شده برای تکامل توانایی در مورد هر مهندس اجرای مهارت های فعلی برای هر مهندس اجرایی باقی می ماند.
در این باره بخوانید: در این باره به بررسی نکاتی که در مورد آن نوشته شده است، پرداخته شده است.