همزمانی (Concurrency)
همزمانی به این معناست که یک برنامه همزمان در حال پیشبرد چندین وظیفه است. اگر کامپیوتر فقط یک پردازنده (CPU) داشته باشد، ممکن است برنامه نتواند چندین وظیفه را دقیقاً در یک لحظه انجام دهد، اما وظایف به طور همزمان در داخل برنامه در حال پردازش هستند. این بدین معناست که برنامه، بدون اینکه یک وظیفه را کاملاً به پایان برساند، وظیفه دیگری را شروع میکند.
برای توضیح بهتر، میتوان مثالی از زندگی واقعی زد: چالشی وجود دارد که شما باید هم یک کیک بزرگ را بخورید و هم یک آهنگ کامل بخوانید. شما برنده میشوید اگر بتوانید سریعتر از دیگران هم کیک را بخورید و هم آهنگ را به پایان برسانید. قانون این است که باید همزمان کیک بخورید و آهنگ بخوانید، اما چگونگی انجام این کار به خود شما بستگی دارد. میتوانید ابتدا کل کیک را بخورید و بعد کل آهنگ را بخوانید، یا میتوانید نصف کیک را بخورید و نصف آهنگ را بخوانید و این روند را تکرار کنید.
همزمانی به این معناست که چندین وظیفه به طور همزمان اجرا میشوند، اما نه الزاماً به صورت فیزیکی و همزمان. در یک پردازنده تکهستهای، CPU تصمیم میگیرد که کدام وظیفه را ابتدا اجرا کند، یا ممکن است بخشی از یک وظیفه و سپس بخشی از وظیفه دیگر را اجرا کند. دو وظیفه میتوانند همزمان شروع شوند، اجرا شوند و به پایان برسند، به این معنا که وظیفه دوم ممکن است قبل از اتمام وظیفه اول شروع شود. این موضوع بستگی به معماری سیستم دارد. به طور خلاصه، همزمانی به معنای اجرای چند وظیفه به طور همزمان است، اما نه الزاماً به صورت همزمان واقعی.
موازیسازی (Parallelism)
موازیسازی به این معناست که یک برنامه وظایف خود را به وظایف کوچکتری تقسیم میکند که میتوانند به صورت موازی پردازش شوند، مثلاً روی چندین پردازنده به طور همزمان.
موازیسازی نیاز به وجود دو وظیفه مجزا ندارد. بلکه ممکن است بخشهای مختلف یک وظیفه یا چندین وظیفه به طور همزمان اجرا شوند. این کار با استفاده از معماری چندهستهای CPU انجام میشود، به طوریکه هر هسته به یک وظیفه یا زیر وظیفه اختصاص داده میشود.
اگر به مثال قبلی بازگردیم، این بار همچنان قانون این است که شما باید همزمان بخوانید و کیک بخورید، اما این بار شما در یک تیم دو نفره بازی میکنید. احتمالاً شما کیک را میخورید و دوستتان آهنگ میخواند (چون او بهتر میخواند و شما بهتر کیک میخورید). بنابراین این بار وظایف واقعاً به طور همزمان انجام میشوند و این همان موازیسازی است.
موازیسازی به سختافزاری با چندین واحد پردازشی نیاز دارد. در یک پردازنده تکهستهای ممکن است همزمانی وجود داشته باشد، اما موازیسازی نخواهد بود. موازیسازی نوع خاصی از همزمانی است که در آن وظایف واقعاً به طور همزمان اجرا میشوند.
تفاوت بین برنامهنویسی موازی و برنامهنویسی همزمان
حال بیایید تفاوتهای اصلی بین همزمانی و موازیسازی را فهرست کنیم. به عنوان مثال، کتاب "هنر همزمانی" این تفاوت را به این صورت تعریف میکند:
یک سیستم زمانی همزمان گفته میشود که بتواند از دو یا چند عملیات به صورت همزمان پشتیبانی کند. یک سیستم زمانی موازی گفته میشود که بتواند از دو یا چند عملیات به صورت همزمان (فیزیکی) پشتیبانی کند.
مفهوم کلیدی و تفاوت اصلی بین این تعاریف، عبارت "در حال پیشرفت" است. این تعریف میگوید که در سیستمهای همزمان، چندین عملیات میتوانند به طور همزمان در حال پیشرفت باشند (اما الزاماً اجرا نمیشوند). در حالی که در سیستمهای موازی، چندین عملیات به طور همزمان اجرا میشوند. در واقع، همزمانی و موازیسازی از نظر مفهومی تا حدی همپوشانی دارند، اما عبارت "در حال پیشرفت" آنها را متمایز میکند.
همزمانی به معنای پردازش همزمان چندین وظیفه است. موازیسازی به معنای اجرای همزمان چندین وظیفه است.
یک برنامه میتواند همزمان باشد اما موازی نباشد، یعنی چندین وظیفه را همزمان پردازش کند، اما هیچ دو وظیفهای به طور همزمان (فیزیکی) اجرا نشوند.
یک برنامه میتواند موازی باشد اما همزمان نباشد، یعنی چندین زیر وظیفه از یک وظیفه را به طور همزمان در یک پردازنده چندهستهای اجرا کند.
یک برنامه میتواند نه موازی باشد و نه همزمان، یعنی تمام وظایف را به صورت ترتیبی، یکی پس از دیگری پردازش کند.
یک برنامه میتواند هم موازی و هم همزمان باشد، یعنی چندین وظیفه را به طور همزمان و به طور فیزیکی روی یک CPU چندهستهای اجرا کند.
رفرنس :
https://medium.com/@itIsMadhavan/concurrency-vs-parallelism-a-brief-review-b337c8dac350