یادداشت سردبیر: این مقاله گزیده‌ای انحصاری از کتاب «تأخیر» نوشتهٔ پکا انگبرگ است که به خوانندگان کمک می‌کند مشکلات تأخیر را تشخیص دهند و بر تکنیک‌های کم‌تأخیر مسلط شوند که تاکنون عمدتاً «دانش قبیله‌ای» بوده‌اند. می‌توانید سه فصل را به‌صورت رایگان از ScyllaDB دانلود کنید. و اگر واقعاً می‌خواهید در مورد تأخیر تحقیق کنید، در کنفرانس P99 CONF (رایگان و مجازی) به جامعه بپیوندید.

پردازش ناهمگام یک تکنیک قدرتمند برای بهبود هم‌روندی سیستم و پنهان‌سازی تأخیر در سیستم‌هایی است که کاهش بیشتر تأخیر در آن‌ها غیرعملی یا غیرممکن است. با انجام عملیات I/O به‌صورت ناهمگام و به تعویق انداختن کارهای غیرضروری، می‌توانید پاسخ‌دهی درک شده را به‌طور قابل توجهی بهبود بخشید، زیرا کاربران نهایی تأخیر را درک نمی‌کنند. در حالی که تکنیک‌هایی مانند پارتیشن‌بندی، حافظه‌نهان و سایر بهینه‌سازی‌های تأخیر می‌توانند تأخیر مطلق را کاهش دهند، پردازش ناهمگام یک استراتژی مکمل ارائه می‌دهد – تأخیر را با اجازه دادن به سیستم برای پاسخ‌دهی حتی زمانی که برخی عملیات زمان می‌برند، پنهان می‌کند.

«پردازش ناهمگام یک استراتژی مکمل ارائه می‌دهد – تأخیر را با اجازه دادن به سیستم برای پاسخ‌دهی حتی زمانی که برخی عملیات زمان می‌برند، پنهان می‌کند.»

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

پردازش ناهمگام در مقابل همگام

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

پردازش ناهمگام این محدودیت را برطرف می‌کند و اجازه می‌دهد چندین وظیفه به‌طور همزمان پیشرفت کنند. به‌عنوان مثال، یک سرور با استفاده از پردازش ناهمگام می‌تواند چندین درخواست مستقل را به‌طور هم‌روند با استفاده از مالتی‌پلکسینگ I/O، یک رابط سیستم‌عامل (OS)، برای بررسی وضعیت اتصالات مختلف پردازش کند. سپس سرور می‌تواند به رویدادها، مانند قابل خواندن یا قابل نوشتن شدن سوکت، واکنش نشان دهد تا یک درخواست را پردازش کند. به‌طور مشابه، سرور ناهمگام می‌تواند ارسال پاسخ را از طریق شبکه آغاز کند و سپس بدون انتظار برای پاسخ، روی کارهای دیگر کار کند.

پردازش ناهمگام مشابه برنامه‌نویسی هم‌روند است. با این حال، پردازش ناهمگام با برنامه‌نویسی هم‌روند تفاوت دارد زیرا دارای رابط‌های صریح است. به‌عنوان مثال، برنامه‌نویسی هم‌روند با استفاده از رشته‌ها (threads) به یک سرور اجازه می‌دهد یک درخواست را به‌صورت همگام پردازش کند در حالی که با جابجایی زمینه (context-switching) بین رشته‌ها، هم‌روندی را حفظ می‌کند. سرور فراخوانی‌های سیستمی send() و recv() را اجرا می‌کند که اگر چیزی برای خواندن از سوکت وجود نداشته باشد یا سوکت قابل نوشتن نباشد، مسدود می‌شوند. وقتی سرور مسدود می‌شود، سیستم‌عامل به رشتهٔ دیگری برای اجرای هم‌روند سوئیچ می‌کند. در مقابل، در پردازش ناهمگام، سرور از یک رابط مالتی‌پلکسینگ I/O برای بررسی وضعیت سوکت استفاده می‌کند. رابط مالتی‌پلکسینگ I/O به سرور می‌گوید کدام سوکت‌ها قابل خواندن هستند، و سرور می‌تواند بدون مسدود کردن رشته از آن‌ها بخواند. به‌طور مشابه، وقتی سرور یک پاسخ را ارسال می‌کند، از یک رابط ناهمگام برای ارسال پاسخ استفاده می‌کند، اما می‌تواند بلافاصله بدون مسدود شدن به کار ادامه دهد و اجازه دهد سیستم‌عامل پاسخ را در پس‌زمینه ارسال کند.

نمودار مقایسه پردازش همگام و ناهمگام

شکل 1 تفاوت بین پردازش همگام و ناهمگام را نشان می‌دهد (که همچنین در نوار کناری با عنوان «تفاوت‌های بین پردازش ناهمگام، هم‌روند و موازی» خلاصه شده است). در این مثال، ما دو وظیفه A و B داریم که باید اجرا شوند تا کار ما به طور کامل تمام شود. فرض کنید یک سیستم پس‌زمینه برای تکمیل یک درخواست دریافتی نیاز به برقراری ارتباط با سیستم‌های خارجی A و B دارد. در پردازش همگام، وظایف به ترتیب اجرا می‌شوند و کل زمان برابر با مجموع زمان‌های اجراست. در پردازش ناهمگام، وظایف هم‌پوشانی دارند و زمان کل برابر با حداکثر زمان اجرای هر وظیفه است. به این ترتیب تأخیر پنهان می‌شود.

نمایش مفهومی پنهان‌سازی تأخیر با پردازش ناهمگام

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