ریسه (رایانه)

چپ
در علوم رایانه، اجرای یک ریسه اجرایی یا رشته اجرایی (به انگلیسی: Thread) کوچترین توالی از دستورالعمل‌های برنامه‌ریزی شده‌است که زمان‌بند سیستم‌عامل می‌تواند آن‌ها را به شکل مستقل مدیریت کند. یک ریسه، یک فرایند سبک‌وزن است. پیاده‌سازی ریسه‌ها و فرایندها از یک سیستم‌عامل به سیستم‌عامل دیگر متفاوت است اما در اکثر موارد، ریسه در داخل یک فرایند قرار می‌گیرد. چندین ریسه می‌توانند در داخل یک فرایند یکسان قرار داشته باشند و منابع (مثل حافظه) را در میان خود به اشتراک بگذارند در صورتی که فرایندهای متفاوت این منابع را به اشتراک نمی‌گذارند. به ویژه اینکه، ریسه در یک فرایند دستورالعمل (کد قابل اجرا) و متن خود (ارزش هر متغیر در هر لحظه معین) را به اشتراک می‌گذارد.
در سیستم تک‌پردازنده‌ای، چندریسمانی به صورت عمده توسط تقسیم-زمانی چندگانه (به انگلیسی: time-division multiplexing) به صورت برنامه چندکاره اجرا می‌شود و واحد پردازش مرکزی (CPU) در بین ریسه‌های نرم‌افزاری متفاوت تعویض می‌شود. این تعویض زمینه به گونه‌ای اجرا می‌شود که کاربر تصور می‌کند ریسه‌ها یا وظایف؛ هم‌زمان اجرا می‌شوند. در سیستم‌های چند پردازنده‌ای یا چندهسته‌ای، ریسه‌ها می‌توانند به صورت جداگانه و هم‌زمان توسط هر کدام از پردازنده‌ها یا هسته‌ها اجرا شوند. در حالت چندپردازنده‌ای، سیستم عامل ممکن است از ریسمان‌های سخت‌افزار که برای بهره‌برداری بهتر از پردازنده مرکزی؛ در پشتیبان سخت‌افزار موجود است استفاده کند و این حالت با ریسمان‌های نرم‌افزاری که به‌طور کامل توسط نرم‌افزار بدون دخالت پردازنده مرکزی ساخته می‌شوند؛ متفاوت است.
زمان‌بندی پردازش در اغلب سیستم عامل‌های امروزه به‌طور مستقیم از هر دو حالت ریسمان‌های اشتراک زمانی و چندپردازنده‌ای پشتیبانی می‌کنند. هسته سییستم عامل به برنامه‌ها این اجازه را می‌دهد که ریسمان‌ها را توسط بازبینی واسط فراخوان سیستمی اداره کند. برخی از پیاده‌سازی ریسمان‌ها؛ ریسمان‌های هسته نامیده می‌شوند، در حقیقت فرایندهای سبک وزن نوع خاصی از ریسمان‌های هسته هستند که وضعیت و اطلاعات مشابه را به اشتراک می‌گذارند.
برنامه‌ها می‌توانند ریسمان‌های فضای کاربر را برای ایجاد وقفه در عملکرد خود توسط زمان‌سنج، ارسال سیگنال یا روش‌های دیگر استفاده کنند. به‌طور مثال اد هوک و قبضه‌کردن از این دسته‌اند.
ریسمان‌ها در مقابل فرایندها
ریسمان‌ها با چندکارگیپردازش رایانه سنتی؛ در موارد زیر تفاوت دارند:
فرایندها عمدتا مستقل هستند، در حالیکه ریسمان‌ها به صورت زیرمجموعه‌هایی از فرایند به حساب می‌آیند.
فرایندها به نسبت ریسمان‌ها اطلاعات بیشتری را حمل می‌کنند، با در نظر گرفتن اینکه چندین ریسمان در یک فرایند حالت‌های فرایند را به خوبی حافظه و دیگر منابع به اشتراک می‌گذارند.
فرایند دارای چندین فضای آدرس مجزا است، که ریسمان‌ها این فضای آدرس‌ها را به اشتراک می‌گذارند.
فرایند تنها بر روی سیتم‌های ارائه‌کننده ماشین‌های ارتباط بین پردازشی اثر متقابل می‌گذارد.
تعویض زمینه در بین ریسه‌ها در یک فرایند عموما سریع‌تر از تعویض زمینه در بین فرایندها است.
سیستم‌هایی مانند ویندوز ان‌تی (به انگلیسی: Windows NT) و اواس/۲ (به انگلیسی: OS/2) به عنوان سیستم‌هایی با ریسمان‌های ارزان و فرایندهای گران شناخته شده‌اند؛ در سیستم عامل‌های دیگر تفاوت زیادی به جز در هزینه فضای آدرس وجود ندارد.
چندریسمانی
چندریسمانی به‌طور عمده در سیستم عامل‌های چندوظیفه‌ای پیدا می‌شود. چندریسمانی یک مدل گسترده در برنامه‌نویسی و اجرا است که اجازه می‌دهد چند ریسمان در یک فرایند اجرا شوند. این ریسمان‌ها منابع فرایند را به اشتراک می‌گذارند، اما می‌توانند به‌طور مستقل اجرا شوند. مدل برنامه‌نویسی ریسمانی توسعه‌پذیری خوبی را توسط اجرای هم‌زمان ایجاد می‌کند. چندریسمانی همچنین می‌تواند در یک فرایند تنها برای رایانش موازی در سیستم چندپردازشی به کار رود.
برنامه‌های کاربردی چندریسمانی مزیت‌های زیر را دارا هستند:
پاسخدهی: در برنامه‌های تک ریسه‌ای، اگر ریسه اجرایی اصلی در اجرای یک وظیفه طولانی مسدود شود، تمام برنامه کاربردی می‌تواند متوقف شود. با انتقال این وظیفه طولانی‌مدت به ریسه کارگر که یکجا با ریسه اجرایی اصلی فعالیت می‌کند، این امکان وجود دارد که برنامه کاربردی بتواند به ورودی پاسخگو باشد در حالی که وظیفه اجرایی در پس زمینه اجرا می‌شود. به عبارت دیگر، در بسیاری حالات چندریسمانی بودن تنها راه برای پاسخگو نگه داشتن برنامه کاربردی نیست، به وسیله ورودی و خروجی غیرد همزمان یا سیگنال‌های یونیکس امکان دستیابی به نتیجه مشابه وجود دارد.
اجرای سریعتر: این مزیت چندریسمانی به برنامه اجازه می‌دهد که در سیستم رایانه‌هایی که دارای چندین پردازنده یا پردازنده‌های چندهسته‌ای هستند؛ سرعت عملکرد را افزایش دهد، یا از ماشین پردازش خوشه‌ای بگذرد؛ زیرا به‌طور طبیعی ریسمان‌های یک برنامه در همرندی اجرا خود را قرض می‌دهند.
مصرف منابع کمتر: با استفاده از ریسمان‌ها، یک برنامه کاربردی می‌تواند به‌طور هم‌زمان به چندین مشتری خدمات دهد و از منابع کمتری نسبت به زمانی که مجبور به کپی کردن فرایند است؛ استفاده کند. برای مثال وب‌سرور آپاچی، که از مخرنی از شنونده و ریسمان‌های سرور برای گوش دادن به درخواست‌های ورودی و پردازش این درخواست‌ها استفاده می‌کند.
ساده‌سازی اشتراک و ارتباطات: برخلاف فرایندها، که نیازمند ارسال پیام یا اشتراک حافظه برای اجرای ارتباط بین پردازشی هستند، ارتباطات در بین ریسمان‌ها بسیار ساده است. ریسمان‌ها به‌طور خودکار داده‌ها را به اشتراک می‌گذارند، کد و فایل‌ها و …، ارتباطات به‌طور وسیع ساده‌سازی شده‌اند.
موازی کردن: برنامه‌های کاربردی به دنبال بهره‌برداری از سیستم‌های چندهسته‌ای و چندپردازنده‌ای که توانایی استفاده از چندریسمانی برای تقسیم داده‌ها و وظایف در ریز-وظایف موازی را دارند؛ هستند. هر کدام از این وظایف در یک هسته جدا یا به صورت موازی در چندین هسته اجرا می‌شود. واحد پردازش گرافیکی محیط‌های محاسباتی مانند کودا و اوپن‌سی‌ال از مدل چندریسمانی استفاده می‌کنند که صدها هزار از این ریسمان‌ها به‌طورت موازی در تعداد زیادی هسته اجرا می‌شوند.
چندریسمانی معایب زیر را دارد:
همگام‌سازی: از آنجاییکه آن‌ها از فضای آدرسی مشترکی استفاده می‌کنند، برنامه‌نویس باید مراقب وضعیت رقابتی و دیگر عملکردهای غیربصری باشد. برای اینکه داده‌ها به‌طور صحیح اداره شوند، ریسه‌ها اغلب نیاز به یک وعده گاه در زمان اجرای فرایند داده دارند. همچنین ممکن است ریسمان‌ها نیازمند انحصار متقابل عملیات‌ها باشند (که اغلب از نشان‌بر استفاده می‌شود) تا از تغییر داده‌های مشترک که به‌طور هم‌زمان خوانده می‌شوند جلوگیری شود. بی‌دقتی در استفاده از این نکات ابتدایی ممکن است موجب بن‌بست شود.
ریسه فرایند را خراب می‌کند: یک عملیات غیرقانونی اجرا شده توسط یک ریسه تمام فرایند را خراب می‌کند، یک رفتار نادرست از ریسه می‌تواند تمام پردازش‌های باقی ریسمان‌ها در برنامه را مختل کند.
زمان‌بندی
زمان‌بندی ریسمان‌های سیستم عامل در یکی از دو راه:
چندوظیفه‌ای انحصاری عمدتا دیگاه برتری را مطرح می‌کند، به گونه‌ای که اجازه می‌دهد سیستم عامل تعیین کند که چه زمانی تعویض زمینه رخ می‌دهد. شرایط نامساعد برای چندریسمانی انحصاری این است که سیستم ممکن است تعویض زمینه در زمان نامناسب داشته باشد، که موجب معکوس کردن اولویت یا اثرات منفی دیگر می‌شود.
چندریسمانی تعاونی، به عبارت دیگر، اعتماد کردن به ریسمان‌ها برای رهاسازی کنترل؛ زمانی که در لحظه توقف قرار دارند است. اگر ریسه برای منبعی تا زمان آماده‌سازی آن منتظر بماند می‌توان ایجاد مشکل کند.
ریسمان‌هایی که وظایف را فراخوانی می‌کنند، ابتدا در عملکرد چندبرنامه‌ای OS/360 با تعداد متغیری از وظایف در ۱۹۶۷ ظاهر شدند.
تا اواخر دهه ۱۹۸۰، پردازنده‌ها در رایانه‌های رومیزی پشتیبانی زیادی از چندریسمانی نمی‌کردند، اگرچه ریسمان‌ها هنوز هم در آن رایانه‌ها استفاده می‌شد زیرا جابه جایی بین ریسمان‌ها بسیار سریعتر از تعویض زمینه کل فرایند بود. در اواخر دهه ۱۹۹۰، ایده اجرای دستور توسط چندین ریسه به‌طور همزمان، با نام چندریسمانی همزمان (به انگلیسی: simultaneous multithreading) شناخته شد، که رایانه‌های رومیزی با پردازنده‌های اینتلپنتیوم ۴ تحت عنوان فراریسمانی (به انگلیسی: hyper-threading) به آن دست یافتند. این طراحی در معماری اینتل کور و اینتل کور۲ کمی افت کرد، اما دوباره در معماری پردازنده‌های کور ای ۷ و برخی از کور ای ۳ و ۵ برقرار شد.
چندکارگی (رایانه)
پردازنده چندهسته‌ای
چندریسمانی
چندریسمانی همزمان
فراریسمانی