گزینه 4 درست است.
یک فایل سرور چندنخی را در نظر بگیرید که با هر درخواست جدید از یک مشتری، یک نخ مجزا ساخته میشود. اگرچه ساخت نخها بر ساخت فرایندها ارجحیت دارد، اما یک سرور چندنخی مشکلات خاص خودش را دارد:
- سربار زمانی ایجاد نخ با ورود هر درخواست (رد گزینه 1)
- سربار زمانی حذف نخ در پایان انجام عملیات سرویس به هر درخواست
- اگر با ورود هر درخواست یک نخ ایجاد شود محدودیتی در تعداد نخهای همروند فعال در سطح هسته وجود ندارد که باعث اتلاف شدید منابع مانند CPU و حافظه خواهد شد.
یک راه حل برای این مشکل، حوضچه نخ (Thread Pool) است. ایده پشت حوضچه نخ این است که در آغاز فرایند، تعدادی نخ ساخته شود و این نخها در یک حوضچه قرار داده شوند که در آنجا در انتظار برای کار منتظر مینشینند (رد گزینه 1). در این ایده آسنکرون (رد گزینه 2)، وقتی سرور یک درخواست جدید دریافت میکند، به جای ایجاد یک نخ، آن درخواست را به حوضچه نخ تسلیم میکند و خودش برمیگردد و منتظر درخواست بعدی میشود. اگر در حوضچه، نخ آزاد و منتظر کار وجود باشد، بیدار میشود و سرویس به درخواست را فوراً شروع میکند. اگر حوضچه خالی باشد، task درخواستی در صف قرار داده میشود تا یکی از نخهای مشغول کارش تمام شده و آزاد شود و یکی از درخواستهای درون صف را تحویل بگیرد. اگر یک نخ آزاد شود و صف خالی باشد، دوباره به حوضچه رفته و منتظر مینشیند. تعداد نخهای حوضچه تابع پیچیدهای از تعداد CPU، اندازه حافظه و میانگین تعداد درخواست همروند مشتریان است. در برخی از سیستمهای پیچیده، تعداد نخهای حوضچه میتواند بر حسب بار سیستم به صورت پویا تغییر کند (مانند Apple's GCD).
مزایای روش حوضچه نخ:
- سرویس به درخواست با یک نخ موجود سریعتر از ایجاد یک نخ جدید است.
- محدودیت در تعداد نخهای همروند فعال در سطح هسته مانع از اتلاف منابع و امکان اجرا با وجود منابع محدود میشود.
برای رد گزینه 3 باید بگوییم که جدا کردن taskهایی که باید انجام شوند (نخهای سطح کاربر) از ایجاد نخ (در سطح هسته)، امکان بکارگیری راهبردهای مختلف برای اجرای taskها را فراهم میکند (مثلاً اجرای یک task پس از یک تأخیر مشخص یا به صورت متناوب).