رایانش هم‌رو یا رایانش همزمان  نوعی رایانش است که در آن چندین محاسبه به صورت همروند (یعنی در بازه‌های زمانی مشترک و روی‌هم) اجرا می‌شود - به جای آنکه پشت‌سر‌هم باشند (که در این حالت قبل از شروع دومی، اولی باید تمام شود).

محاسبات همزمان نوعی محاسبات است که در آن چندین محاسبه همزمان – در طول مدت زمانی با هم تداخل دارند - به جای اینکه به طور متوالی ، با یک تکمیل قبل از شروع بعدی انجام می‌شود.

این خاصیت یک سیستم است - چه برنامه ای ، رایانه‌ای یا شبکه ای - که در آن یک نقطه اجرای جداگانه یا "موضوع کنترل" مجزا برای هر فرآیند وجود دارد .  سیستم همزمان یک سیستم است که در آن محاسبات می تواند پیشرفت کند بدون اینکه منتظر بماند تمام محاسبات دیگر انجام شود. محاسبات همزمان نوعی برنامه‌نویسی مدولار است. در الگوی خود ، یک محاسبه کلی به زیرمجموعه‌ها تبدیل شده است که ممکن است همزمان انجام شود. پیشگامان در زمینه محاسبات همزمان شامل هموار میشود.

مقدمه 
مفهوم محاسبات همزمان اغلب با مفهوم مرتبط اما متمایز محاسبات موازی اشتباه گرفته می شود ، [2] [3] اگرچه هر دو را می توان به عنوان "چندین فرآیند در همان مدت زمان اجرا" توصیف کرد. در محاسبات موازی ، اجرای در همان لحظه فیزیکی اتفاق می‌افتد: به عنوان مثال: در پردازنده‌های جداگانه یک ماشین چند پردازنده ، با هدف سرعت بخشیدن به محاسبات –– محاسبات موازی بر روی یک پردازنده تک (یک هسته‌ای) غیرممکن است ، زیرا فقط یک محاسبه در هر لحظه ممکن است رخ دهد(در طول هر چرخه ساعت واحد) . در مقابل ،محاسبات همزمان شامل طول عمر فرایند است که با هم همپوشانی دارد ، اما اجرای آن نباید در همان لحظه اتفاق بیفتد. هدف در اینجا الگوبرداری از فرایندهای موجود در دنیای خارج است که همزمان اتفاق می افتد ، مانند چندین مشتری که به طور همزمان به یک سرور دسترسی دارند. ساختار سیستم‌های نرم‌افزاری که از چندین قطعه همزمان تشکیل شده اند ، می توانند برای مقابله با پیچیدگی، صرف‌نظر از اینکه قطعات به صورت موازی اجرا شوند  می‌تواند مفید باشد. {4}:1

ببه عنوان مثال ، فرآیندهای همزمان با یکپارچه کردن مراحل اجرای هر فرآیند از طریق برش های به اشتراک گذاری زمان می توانند بر روی یک هسته انجام شوند: فقط یک فرآیند در یک زمان اجرا می شود ، و اگر در طول برش زمانی خود کامل نشود ، متوقف می شود ، فرآیند دیگری متوقف می شود. شروع یا از سر گرفته می شود و بعداً مراحل اصلی از سر گرفته می شود. به این ترتیب ، چندین فرآیند به صورت جزئی در یک لحظه اجرا می شوند ، اما فقط یک فرآیند در آن لحظه اجرا می شود. (نیاز به استناد).

محاسبات همزمان ممکن است به صورت موازی انجام شود ، [2] [5] برای مثال ، با اختصاص هر فرآیند به یک هسته پردازنده یا هسته پردازنده جداگانه ، یا توزیع یک محاسبه در یک شبکه. اما به طور کلی ، زبانها ، ابزارها و تکنیک های برنامه نویسی موازی ممکن است برای برنامه نویسی همزمان مناسب نباشد و بالعکس. (نیاز به استناد)

زمان بندی دقیق اجرای وظایف در یک سیستم همزمان بستگی به زمانبندی دارد و وظایف همیشه نباید همزمان انجام شوند. به عنوان مثال ، با توجه به دو وظیفهT1 و) :T2نیاز به استناد(

T1ممکن است قبل از T2اجرا یا به پایان برسد یا برعکس (سریال و متوالی)

T1و T2 ممکن است بصورت متناوب اجرا شوند (سریال وهمزمان(

T1 و T2 ممکن است همزمان در همان لحظه از زمان اجرا شوند (موازی و همزمان)
 

کلمه "دنباله" به عنوان یک متضاد برای "همزمان" و "موازی" استفاده می شود. هنگامی که اینها به طور مشخص می شوند ، همزمان / دنباله ای و موازی / سریال به عنوان جفت های مخالف استفاده می شوند. [6] برنامه ای که در آن وظایف یک بار اجرا شود (یک سریال و بدون موازی) بدون در هم آمیختن (پی در پی ، بدون همزمانی: هیچ کاری شروع نمی شود تا اینکه کار قبلی تمام شود) به یک برنامه سریال گفته می شود. مجموعه ای از کارهایی که می توانند به صورت سریال برنامه ریزی شوند ، سریال هستند که کنترل همزمانی را ساده می کند. (نیاز به استناد).

هماهنگی دسترسی به منابع مشترک 
اصلی ترین چالش در طراحی برنامه های همزمان ، کنترل همزمان است: حصول اطمینان از توالی صحیح تعامل یا ارتباطات بین اجرا های مختلف  

محاسباتی ، و هماهنگی دسترسی به منابعی که در بین اجرا ها مشترک هستند(5) مشکلات بالقوه شامل شرایط مسابقه ، بن بست و گرسنگی منابع است .به عنوان مثال ، الگوریتم زیر را در نظر بگیرید تا برداشت ها را از یک حساب تأیید نشان داده شده توسط مانده منابع مشترک :

1-  بول برداشت (برداشت داخلی)

2- اگر (تعادل> = برداشت

3- تعادل  = برداشت

4- (بازگشت درست است؛)

5- برگشت خطا

فرض کنید تعادل = 500 ، و دو موضوع همزمان باعث می شود تماسها گرفته(300) و خارج شوند (350). اگر خط 3 در هر دو عملیات قبل از خط 5 اجرا شود ، هر دو عملیات می یابند که تعادل> = برداشت به صورت صحیح ارزیابی می شود و اجرای آن به کم کردن مقدار برداشت ادامه 

می یابد. با این حال ، از آنجا که هر دو فرآیند برداشت های خود را انجام می دهند ، در کل مبلغ برداشت شده بیشتر از مانده اصلی خواهد بود. این نوع مشکلات با منابع مشترک از استفاده از کنترل همزمان استفاده می کند یا الگوریتم های غیر مسدود کننده.

مزایا 
مزایای محاسبات همزمان شامل موارد زیر است:
 افزایش توان عملیاتی برنامه execution اجرای موازی یک برنامه همزمان اجازه می دهد تعداد وظایف انجام شده در یک زمان معین متناسب با تعداد پردازنده ها مطابق قانون گوستافسون افزایش یابد. پاسخگویی بالا برای برنامه های ورودی / خروجی — ورودی / خروجی فشرده بیشتر برای انجام عملیات ورودی یا خروجی صبر می کنند. برنامه نویسی همزمان اجازه می دهد تا زمان صرف شده برای انتظار برای یک کار دیگر استفاده شود.  ساختار برنامه مناسب تر برخی از مشکلات و دامنه های مشکل از مناسب برای نمایش به عنوان وظایف یا فرآیندهای همزمان مناسب هستند.(نیاز به استناد).

مدل ها برای درک و تجزیه و تحلیل سیستم های محاسبات همزمان شامل موارد زیر است :
 مدل بازیگر
 مدل قابلیت شی برای امنیت
 خودکار / ورودی
 حافظه کاربردی نرم‌افزار (STM)
 پتری
 محاسبات فرایند مانند
 حساب محیطی
 حساب سیستمهای ارتباطی (CCS)
 ارتباط فرایندهای متوالی (CSP)
 پیوستن به حساب
 π- حساب

پیاده‌سازی 
ببرای اجرای برنامه های همزمان می توان از چندین روش مختلف استفاده کرد ، مانند اجرای هر یک از اجرای محاسباتی به عنوان یک فرآیند سیستم عامل یا اجرای فرایندهای محاسباتی به عنوان مجموعه موضوعات در یک فرآیند سیستم عامل واحد.

تعامل و ارتباطات 
در برخی از سیستم های محاسبات همزمان ، ارتباط بین اجزای همزمان از برنامه نویس پنهان است (به عنوان مثال ، با استفاده از آینده) ، در حالی که در برخی دیگر باید صریحاً اداره شود. ارتباطات صریح را می توان به دو طبقه تقسیم کرد:

 ارتباطات حافظه مشترک
 مؤلفه های همزمان با تغییر محتوای مکان های حافظه مشترک(نمونه هایی از جاوا و سی شارپ) ارتباط برقرارمیکنند این سبک از برنامه نویسی همزمان معمولاً برای هماهنگی بین موضوعات نیاز به استفاده از نوعی از قفل کردن (به عنوان مثال،صدا زدن، سمفورها یا مانیتورها) دارد. گفته می شود، برنامه ای که بطور صحیح هر یک از این موارد را پیاده سازی می کند ، بدون خطر است.

 ارتباط عبور پیام
 مؤلفه های همزمان با تبادل پیام ها ارتباط برقرار می کنند (نمونه هایی ازMPI ، GO، Scala  Erlang  و( occam. تبادل پیام ممکن است به صورت غیر همزمان انجام شود یا ممکن است از یک سبک "همزمان" همزمان استفاده شود که در آن فرستنده تا زمان دریافت پیام مسدود می شود. ارسال پیام ناهمزمان ممکن است قابل اعتماد یا غیرقابل اعتماد باشد (که گاهی به آن "ارسال و دعا" نیز گفته می شود). استدلال همگام سازی پیام بسیار آسان تر از استدلال در حافظه مشترک است ، و به طور معمول یک شکل قوی تر از برنامه نویسی همزمان تلقی می شود. [نیاز به استناد] طیف گسترده ای از تئوری های ریاضی برای درک و تحلیل سیستم های ارسال پیام در دسترس است. از جمله مدل بازیگر و حسابگرهای مختلف انتقال پیام می تواند از طریق پردازش متقارن متقارن ، با یا بدون انسجام حافظه پنهان حافظه مشترک ، به طور مؤثر اجرا شود.  حافظه مشترک و همزمانی ارسال پیام ویژگی های عملکرد متفاوتی دارند. به طور معمول (اگرچه نه همیشه) ، سربار حافظه در هر فرایند و سربار تغییر وظیفه در سیستم ارسال پیام کمتر است ، اما سربار انتقال پیام از تماس مکالمه بیشتر است. این اختلافات غالباً تحت تأثیر عوامل دیگر عملکرد قرار دارد.

تاریخچه 
محاسبات همزمان از سالهای 19 و اوایل قرن 20 از کارهای قبلی در مورد راه‌آهن و تلگراف ایجاد شده است و برخی از اصطلاحات به این دوره مانند سمفورها مربوط است. اینها برای پاسخ به این سؤال است كه چگونه می توان چندین قطار را در همان سیستم راه آهن اداره كرد (جلوگیری از برخورد و حداكثر بهره وری) و چگونگی اداره انتقال چندگانه بر روی یك مجموعه مشخص از سیم (بهبود كارآیی) از جمله از طریق تقسیم زمان چند برابر (1870 ).

مطالعه آکادمیک الگوریتم های همزمان در دهه 1960 آغاز شد و دیجکسترا (1965) به عنوان اولین مقاله در این زمینه شناخته شد و محرومیت متقابل را شناسایی و حل کرد. (7)

شیوع 
همزمانی در محاسبات گسترده است ، از سخت افزار سطح پایین در یک تراشه به شبکه های جهانی رخ می دهد.نمونه های زیر:
 کانال
 کوروتین
 آینده و وعده‌ها

در سطح سیستم عامل:
 وظیفه رایانه، اعم از وظیفه مشترک چند وظیفه ای و پیشگیرانه تقسیم
 زمانیکه پردازش دسته ای متوالی مشاغل را با استفاده همزمان از یک سیستم جایگزین می‌کند.
 روند
 نخ

در سطح شبکه، سیستم‌های شبکه به‌طور کلی با ماهیت خود همزمان هستند، زیرا از دستگاه‌های جداگانه تشکیل شده‌اند.

زبانهایی که از برنامه‌نویسی همزمان پشتیبانی می‌کنند 
زبانهای برنامه نویسی همزمان زبان های برنامه نویسی هستند که از سازه های زبانی برای همزمانی استفاده می کنند. این سازه ها ممکن است شامل چند رشته ، پشتیبانی از محاسبات توزیع شده ، انتقال پیام ، منابع مشترک (از جمله حافظه مشترک) یا آینده و وعده ها باشد. چنین زبانهایی گاهی به عنوان زبانهای همگرا محور یا زبانهای برنامه نویسی همزمان محور توصیف می شود.

امروزه متداول ترین زبان های برنامه نویسی که دارای سازه های خاص برای همزمانی هستند Java و C # هستند. هر دوی این زبانها اساساً از یک مدل همزمانی حافظه مشترک استفاده میکنند، و از قفل ارائه شده توسط مانیتورها استفاده می شود (اگرچه مدل های ارسال پیام در بالای مدل حافظه مشترک مشترک وجود دارد). از بین زبانهایی که از الگوی همگام سازی پیام انتقال استفاده می کنند  احتمالاً ارلانگ امروزه بیشترین کاربرد را در صنعت دارد.نیاز به استناد.

بسیاری از زبانهای برنامه نویسی همزمان بیشتر به عنوان زبان های تحقیقاتی (به عنوان مثال Picو نه به عنوان زبان هایی برای استفاده در تولید ، توسعه یافته اند.) با این حال زبانهایی مانند ارلانگ ، لیمبو و اوکام در 20 سال گذشته در زمانهای مختلف شاهد استفاده صنعتی بوده اند. زبانهایی که همزمانی نقش مهمی را ایفا می کنند عبارتند از :

هدف کلی Ada با پشتیبانی بومی برای ارسال پیام و همزمانی مبتنی بر نظارت  بر انها هست .

Alefهمزمان با ارسال موضوعات و پیام برای برنامه نویسی سیستم در نسخه های اولیه برنامه 9 از آزمایشگاه های بل انجام میگیرد.

یادداشت 
 این تخفیف موازی داخلی یک هسته پردازنده ، مانند خطوط لوله یا دستورالعمل های بردار شده است. یک ماشین تک هسته ای یک هسته ای ممکن است قادر به موازی بودن مانند پردازنده پردازنده باشد، اما پردازنده به تنهایی چنین نیست.

منابع 
1-پترسون و هنسی 2013 ، ص. 503

"Making reliable distributed systems in the presence of software errors"(PDF)

برنامه نویسی همزمان و موازی در جولیا

https://juliacon.talkfunnel.com/2015/21-concurrent-and-parallel-programming-in-julia

پترسون ، دیوید ا.؛ هنسی ، جان ال (2013). سازمان و طراحی رایانه: رابط سخت افزار / نرم افزار. مجموعه مورگان کافمن در معماری و طراحی رایانه (چاپ 5). مورگان کافمن شابک 978-0-12407886-4 رسانه های مربوط به برنامه نویسی همزمان در Wikimedia Commons

کتابخانه مجازی سیستمهای همزمان می باشد.

پیوند به بیرون 
 
 Concurrent Systems Virtual Library

اختراع‌های هلندی
ادسخر دیکسترا
رایانش همروند
فناوری‌های سیستم‌عامل
ویکی‌سازی رباتیک