برنامه سازی پیشرفته
درس متنی
جلسه 17برنامه سازي همروند
خلاصه نکات کلیدی
همروندی ابزاری قدرتمند برای افزایش کارایی و پاسخگویی است، اما نیازمند درک عمیق مفاهیم و مدیریت دقیق چالشهاست.
تمایز بین فرایند و نخ در مدیریت منابع و ایزولهسازی اهمیت دارد.
شرایط رقابتی، بنبست و گرسنگی از جمله مشکلات رایج در سیستمهای همروند هستند.
مکانیزمهای همگامسازی (قفلها، سمافورها، متغیرهای شرطی) برای جلوگیری از این مشکلات و تضمین صحت اجرای برنامهها ضروری هستند.
انتخاب ابزار و الگوی مناسب برای پیادهسازی برنامه سازی همروند، تاثیر بسزایی در موفقیت پروژه دارد.
تمرین پایان فصل
مقدمه و مفاهیم پایه
- تعریف: برنامه سازی همروند به اجرای چندین بخش از یک برنامه یا چندین برنامه به طور همزمان اشاره دارد. این برخلاف برنامه سازی ترتیبی است که دستورات به صورت خطی و پشت سر هم اجرا میشوند.
- هدف: افزایش کارایی، پاسخگویی بهتر، و استفاده بهینه از منابع سیستم (مخصوصا پردازندههای چند هستهای).
- تمایز با پردازش موازی: همروندی به معنای همزمان بودن شروع و اجرا است، در حالی که موازیسازی به معنای اجرای واقعی همزمان در واحدهای پردازشی مجزا است. همروندی میتواند روی یک هسته نیز پیادهسازی شود (مثلاً با زمانبندی).
۲. واحدها و ساختارهای همروند
- فرایند (Process): یک نمونه اجرایی از برنامه که شامل فضای آدرس مستقل، منابع سیستمی (فایلها، سوکتها) و نخهای اجرایی است. فرایندها ایزوله هستند و ارتباط بین آنها نیازمند مکانیزمهای خاص (IPC) است.
- نخ (Thread): واحد سبکتری از اجرا در درون یک فرایند. نخها فضای آدرس مشترک با فرایند والد خود دارند و منابع را به اشتراک میگذارند. این اشتراکگذاری باعث افزایش کارایی و سادگی ارتباط بین نخها میشود، اما چالشهای همگامسازی را نیز به همراه دارد.
- تفاوت کلیدی: هزینه ایجاد و مدیریت فرایندها بالاتر از نخها است. اشتراکگذاری منابع در نخها سادهتر اما نیازمند دقت بیشتر در مدیریت همزمانی است.
۳. چالشهای برنامه سازی همروند
- شرایط رقابتی (Race Condition): زمانی رخ میدهد که خروجی محاسبات به ترتیب اجرای نخها یا فرایندها بستگی داشته باشد و این ترتیب غیرقابل پیشبینی باشد. این وضعیت منجر به نتایج نادرست و غیرقابل تکرار میشود.
- بنبست (Deadlock): وضعیتی که دو یا چند فرایند/نخ منتظر منابعی هستند که توسط یکدیگر نگه داشته شدهاند و هیچکدام قادر به ادامه اجرا نیستند.
- گرسنگی (Starvation): وضعیتی که یک فرایند/نخ به دلیل اولویتبندی یا زمانبندی نامناسب، هرگز به منابع مورد نیاز خود دسترسی پیدا نمیکند.
- همگامسازی (Synchronization): مکانیزمهایی برای کنترل دسترسی به منابع مشترک و مدیریت ترتیب اجرای عملیات بین واحدهای همروند، به منظور جلوگیری از شرایط رقابتی و تضمین صحت نتایج.
۴. مکانیزمهای همگامسازی
- بخش بحرانی (Critical Section): قسمتی از کد که در آن به منابع مشترک دسترسی وجود دارد. باید اطمینان حاصل شود که در هر لحظه، تنها یک واحد اجرایی (نخ/فرایند) در بخش بحرانی مربوط به یک منبع مشترک قرار دارد.
- قفلها (Locks/Mutexes): مکانیزمهایی که به یک نخ/فرایند اجازه میدهند تا یک منبع مشترک را “قفل” کند و از دسترسی سایرین به آن جلوگیری نماید تا زمانی که قفل را “باز” کند.
- سِمافورها (Semaphores): شمارندههایی که برای کنترل دسترسی به مجموعهای از منابع یا مدیریت عملیات بین فرایندها/نخها استفاده میشوند. میتوانند برای پیادهسازی قفلها و موارد پیچیدهتر نیز به کار روند.
- متغیرهای شرطی (Condition Variables): مکانیزمی که به نخها اجازه میدهد منتظر وقوع یک شرط خاص بمانند و پس از وقوع آن، توسط نخ دیگری که شرط را ایجاد کرده، بیدار شوند. این مکانیزم اغلب همراه با قفلها استفاده میشود.
- اتمیک بودن عملیات (Atomic Operations): عملیاتی که به صورت غیرقابل تقسیم اجرا میشوند؛ یعنی یا به طور کامل انجام میشوند یا اصلاً انجام نمیشوند و در طول اجرای آنها، هیچ واحد اجرایی دیگری نمیتواند وضعیت میانی آن را مشاهده یا تغییر دهد.
۵. الگوهای طراحی همروند (Concurrency Design Patterns)
- کپی-تغییر-بازنویسی (Copy-on-Write): تکنیکی برای به اشتراکگذاری دادهها به صورت ایمن. دادهها به صورت اشتراکی خوانده میشوند و تنها زمانی که نیاز به تغییر باشد، یک کپی از داده ایجاد شده و تغییرات روی آن اعمال میشود.
- مولد/مصرفکننده (Producer-Consumer): الگویی که در آن یک یا چند واحد اجرایی (مولد) داده تولید کرده و در یک بافر مشترک قرار میدهند، و یک یا چند واحد اجرایی دیگر (مصرفکننده) دادهها را از بافر برداشته و پردازش میکنند.
- حسابدار ( ப்ப்): الگویی برای پیادهسازی شمارندهها یا جمعکنندههای توزیع شده به صورت همروند.
- ماشین وضعیت (State Machine): استفاده از ماشینهای وضعیت برای مدیریت حالتهای مختلف یک سیستم همروند و اطمینان از انتقالهای صحیح بین حالتها.
۶. ابزارها و زبانهای برنامه سازی
- محیطهای POSIX Threads (pthreads): کتابخانهای استاندارد در سیستمهای شبه یونیکس برای ایجاد و مدیریت نخها.
- APIهای ویندوز: مکانیزمهای مشابه برای مدیریت نخها و همگامسازی در سیستمعامل ویندوز.
- زبانهای سطح بالا: زبانهایی مانند Java (با
synchronized,java.util.concurrent), C++ (با<thread>,<mutex>), Python (باthreading,multiprocessing), Go (با Goroutines و channels) مکانیزمهای قدرتمندی برای برنامه سازی همروند ارائه میدهند. - کتابخانهها و فریمورکها: استفاده از کتابخانههای تخصصی برای مدیریت وظایف همروند، صفهای کار (Task Queues) و پردازش توزیع شده.
خلاصه نکات کلیدی
- همروندی ابزاری قدرتمند برای افزایش کارایی و پاسخگویی است، اما نیازمند درک عمیق مفاهیم و مدیریت دقیق چالشهاست.
- تمایز بین فرایند و نخ در مدیریت منابع و ایزولهسازی اهمیت دارد.
- شرایط رقابتی، بنبست و گرسنگی از جمله مشکلات رایج در سیستمهای همروند هستند.
- مکانیزمهای همگامسازی (قفلها، سمافورها، متغیرهای شرطی) برای جلوگیری از این مشکلات و تضمین صحت اجرای برنامهها ضروری هستند.
- انتخاب ابزار و الگوی مناسب برای پیادهسازی برنامه سازی همروند، تاثیر بسزایی در موفقیت پروژه دارد.
تمرین پایان فصل
- یک سناریوی فرضی تعریف کنید که در آن اجرای ترتیبی دستورات منجر به نتایج نادرست میشود (مثال: یک شمارنده مشترک که توسط دو نخ افزایش مییابد). مشکل را توضیح دهید.
- چگونه میتوان با استفاده از یک قفل (Mutex) از بروز شرایط رقابتی در سناریوی بالا جلوگیری کرد؟ کد شبه (pseudo-code) آن را بنویسید.
- تفاوت اصلی بین بنبست (Deadlock) و گرسنگی (Starvation) را توضیح دهید.
- الگوی مولد/مصرفکننده را شرح دهید و بگویید در چه نوع مسائلی کاربرد دارد.
- چرا مدیریت صحیح حافظه و اشتراکگذاری دادهها در برنامههای همروند حیاتی است؟
دروس متنی
#1
جلسه 1 آشنایی با زبان جاوا
#2
جلسه 2ویژگی هاي زبان جاوا ◦
#3
جلسه 3 اولین برنامه در جاوا ◦
#4
جلسه 4 مفاهیم اولیه برنامه سازي در جاوا
#5
جلسه 5 مقدمه اي بر طراحی و برنامه سازي شیءگرا
#6
جلسه 6 برنامه سازي شیءگرا در جاوا
#7
جلسه 7وراثت
#8
جلسه 8چندریختی
#9
جلسه 9(interface) واسط
#10
جلسه 10آزمون نرم افزار
#11
جلسه 11الگوهاي طراحی
#12
جلسه 12 (Refactoring) بازآرایی کد
#13
جلسه 13مدیریت خطا و استثنا
#14
جلسه 14 (Generics) داده هاي عام
#15
جلسه 15 (Containers) مجموعه ها و ظرف ها
#16
جلسه 16فایل، جویبار و شبکه
#17
جلسه 17برنامه سازي همروند
#18
جلسه 18 Reflection
#19
جلسه 19مفاهیم پیشرفته و تکمیلی
مشاهده دروس کامل
بررسی صفحه یادگیری دوره