تعویض زمینه
تعویض زمینه یا سودهی به بافت در رایانش -که گاهی در کتاب‌های فارسی «تعویض متن» یا «برگرداندن متن» ترجمه می‌شود- به فرآیند ذخیره کردن و بازیابی وضعیت (زمینهٔ) یک گفته می‌شود؛ به طوری که اجرای آن بتواند بعداً از همان نقطه ادامه یابد. این کار به چند اجازه می‌دهد تا از یک CPU به صورت اشتراکی استفاده کنند و همچنین این قابلیت یکی از ارکان اساسی چندوظیفگی است. انجام این کار باعث تحمیل بار اضافه به سامانه می‌شود اما این بار اضافه آنقدر نیست که به خاطر آن از مزایای چندبرنامگی صرف نظر شود. جابجایی نوبت اجرا از یک به ‌ای دیگر نیاز به یک مدت زمان مشخص دارد. در طول انجام این فرآیند، ثبات‌های پردازهٔ فعلی باید ذخیره و ثبات‌های پردازهٔ جدید بارگذاری شوند و همین‌طور لیست‌ها و جداول خاصی هم باید به‌روز شوند.
عبارت «برگردان زمینه»، می‌تواند اشاره به برگردان زمینهٔ یک ثبات باشد. همچنین برگردان زمینه می‌تواند یک وظیفه، یک قاب پشته یا یک ریسه باشد.
در رایانش، یک تغییر زمینه عملیات ذخیرهٔ وضعیت یک فرآیند یا موضوع است؛ به طوری که بتوان آن را بازیابی کرد و بعداً اجرای آن را از سر گرفت. این به چندین پردازش اجازه می دهد تا واحد پردازشگر مرکزی (CPU) را با هم به اشتراک بگذارند و از ویژگی‌های اساسی سیستم‌عامل چند وظیفه‌ای است.
معنی دقیق عبارت «تعویض زمینه» متفاوت است. در زمینهٔ چند وظیفه ای، به روند ذخیره‌سازی حالت سیستم برای یک کار اشاره دارد. بنابراین می‌توان آن کار را متوقف کرد و کار دیگری را از سر گرفت. تعویض زمینه همچنین می‌تواند بر اثر یک وقفه اتفاق بیفتد؛ مانند زمانی که یک کار نیاز به دسترسی به ذخیره‌سازی دیسک دارد و باعث می شود زمان پردازنده برای کارهای دیگر آزاد شود. بعضی از سیستم‌عامل‌ها برای جابجایی بین وظایف حالت کاربر و حالت هسته به یک تعویض زمینه نیز نیاز دارند. روند تعویض زمینه می‌تواند بر کارآیی سیستم تأثیر منفی بگذارد.
متن تعویض ها معمولاً از نظر محاسباتی فشرده هستند و بیشتر طراحی سیستم‌عامل‌ها استفادهٔ بهینه از تعویض‌های زمینه‌ای است. جابجایی از یک فرآیند به فرآیند دیگر برای انجام امور مدیریتی به زمان مشخصی نیاز دارد که این فرآیند شامل اموری مثل ذخیره و بارگذاری ثبات‌ها و نقشه‌های حافظه، به‌روزرسانی جداول و لیست‌های مختلف و غیره می‌شود. آنچه در واقع در یک تعویض زمینه درگیر است به معماری‌ها، سیستم‌عامل‌ها و تعداد منابع به اشتراک گذاشته شده (رشته‌هایی که به همان فرآیند تعلق دارند در مقایسه با فرآیندهای غیر مرتبط منابع بسیاری را به اشتراک می گذارند. به عنوان مثال، در هستهٔ لینوکس تعویض زمینه شامل مواردی از قبیل تعویض ثبات‌ها ، اشاره‌گر پشته (رکورد اشاره‌گر پشته)، شمارندهٔ برنامه، پاکسازی بافر ترجمهٔ سمت (TLB) و بارگیری جدول صفحهٔ فرآیند بعدی برای اجرا -مگر اینکه فرآیند قدیمی حافظه را با حافظهٔ جدید به اشتراک بگذارد- می‌شود. بعلاوه، تعویض متن مشابه که بین رشته‌های کاربر، به ویژه رشته‌های سبز اتفاق می‌افتد و اغلب بسیار سبک است، باعث صرفه جویی و بازیابی می شود. در موارد شدید، مانند تعویض بین goroutines در زبان برنامه‌نویسی Go، یک تعویض زمینه معادل coroutine بازدهی است که فقط به مراتب گران‌تر از فراخوانی subroutine است.
در سامانه‌های چند وظیفه‌ای یا همان چندکارگی، زمان‌بند سامانه باید پردازنده را از پردازهٔ در حال اجرا گرفته و آن را به پردازهٔ دیگری برای اجرا شدن بدهد. همچنین ممکن است پردازه خودش را به حالت غیرقابل اجرا ببرد که در این صورت هم می‌توان پردازنده را از پردازه گرفت و به پردازهٔ دیگری داد. یک پردازه زمانی به حالت غیرقابل اجرا می‌رود که بخواهد یک عملیات ورودی/خروجی انجام دهد و مجبور باشد منتظر خاتمه یافتن این عملیات باشد. در سامانه‌هایی که به صورت غیر انحصاری هستند، زمانبند می‌تواند پردازه‌ای که همچنان در حال اجرا هست را هم تعویض کند. در این سامانه‌ها از یک وقفهٔ ساعت برای تعیین برش زمانی استفاده می‌شود. بدین صورت که هر پردازه می‌تواند به میزان یک برش زمانی اجرا شود، پس از پایان یافتن برش زمانی، پردازنده از پردازه گرفته شده و به پردازهٔ دیگری داده می‌شود. برش زمانی معمولاً چند بار در یک ثانیه اتفاق می‌افتد؛ بنابراین پردازنده در طی یک ثانیه به چند پردازه سوئیچ کرده و هر کدام را برای مدت زمانی به اندازهٔ یک برش زمانی اجرا می‌کند. وقفهٔ ساعت برای تضمین اینکه زمانبند کنترل را از پردازه گرفته و به پردازهٔ دیگری خواهد داد، استفاده می‌شود.
معماری‌های امروزه گردانندهٔ وقفه هستند. به این معنی که برای مثال اگر پردازنده از دیسک درخواست داده کند، نیاز نیست که در حالت انتظار مشغولی باقی بماند تا داده خوانده شود؛ بلکه می‌تواند بعد از دادن درخواست، به اجرای برنامه‌ای دیگر بپردازد. زمانی که خواندن داده از حافظه پایان یافت، پردازنده می‌تواند با ایجاد یک وقفه به خواندن دادهٔ آماده شده بپردازد که برای ایجاد این وقفه، برنامهٔ گرداننده وقفه (به انگلیسی: Interrupt handler) را فرا می‌خواند.
زمانی که یک وقفه رخ می‌دهد، سخت‌افزار به صورت خودکار بخشی از زمینه را تعویض می‌کند (دست کم به مقداری که اجازه دهد کدهای گردانندهٔ وقفه را بازیابی کند). براساس جزئیات مخصوص طراحی‌های سخت‌افزار و نرم‌افزار، ممکن است گرداننده زمینهٔ اضافی را نیز نگهداری کند. اغلب مقدار کمی از زمینه تغییر می‌کند تا زمانی که برای ایجاد وقفه صرف می‌شود؛ کاهش یابد. هسته برای مدیریت وقفه‌های فرآیند، زمانبندی خاصی ندارد اما به جای آن (اغلب در موارد ناتمام) زمینه در ابتدای گردانندهٔ وقفه مستقر می‌شود. زمانی که خدمات وقفه پایان می‌پذیرد، زمینه‌ای که قبل از وقفه موجود بود؛ بازیابی می‌شود و برنامهٔ متوقف شده می‌تواند اجرای خود را از حالت متوقف‌شده مجدداً شروع کند.
زمانی که یک جابجایی بین فضای کاربری و فضای هسته در سیستم‌عامل نیاز باشد، تعویض زمینه ضروری نیست؛ تغییر حالت به تنهایی یک تعویض زمینه به حساب نمی‌آید. اگرچه وابسته به نوع سیستم‌عامل ممکن است در این زمان تعویض زمینه نیز رخ دهد.
در یک تعویض، حالت اولین فرآیند (فرآیندی که در حال اجرا است و باید تعویض شود) به گونه‌ای باید ذخیره شود. بنابراین زمانی‌که زمانبند به اجرای فرآیند اولیه بازمی‌گردد، می‌تواند حالت خود را بازیابی کند و ادامه دهد.
حالت فرآیند شامل تمام ثبات‌هایی است که فرآیند ممکن است از آن‌ها استفاده کند؛ به خصوص شمارنده برنامه. به علاوه هر سیستم‌عاملی داده‌های خاصی دارد که ممکن است ضروری باشد. این داده‌ها معمولاً در ساختمان‌داده‌ای ذخیره می‌شوند که بلاک کنترل فرآیند (PCB) نامیده می‌شود.
به جای تعویض فرآیندها، برای اولین فرآیند PCB باید ایجاد شده و ذخیره شود. برخی اوقات PCBها بر روی پشتهٔ هر فرآیند در حالت هسته ذخیره می‌شوند (به‌طور متقابل در حالت کاربر و در پشته فراخوانی)، یا شاید برخی سیستم‌عامل‌های خاص از ساختمان‌داده‌ای برای تعریف این اطلاعات استفاده کنند. از آنجایی که سیستم‌عامل به تعویق انداختن کارامدی در اولین فرآیند اجرایی دارد، می‌تواند PCB و زمینهٔ لازم برای فرآیند دوم را بارگذاری کند. برای این منظور، شمارندهٔ برنامه از PCB بارگذاری می‌شود و بدین ترتیب اجرا می‌تواند در فرآیندی جدید ادامه یابد. فرآیندهای جدید از صف یا صف‌ها (اغلب با رجوع به صف آمادهٔ اجرا) انتخاب می‌شوند. فرآیند و ریسهٔ داری اولویت می‌تواند بر اجرای دیگر فرآیندها تأثیر بگذارد. فرآیندهایی با اولویت بالاتر ابتدا ریسمان‌های آماده برای اجرا را بررسی می‌کنند.
در نظر گرفتن یک عمل جمع اضافی حساب A = B + 1. این دستورالعمل در حافظهٔ دستورالعمل (Instruction Register) ذخیره می‌شود و شمارندهٔ برنامه افزایش می‌یابد. A و B از حافظه خوانده می‌شوند و به ترتیب در ثبات‌های R1 و R2 ذخیره می‌شوند. در این حالت، B + 1 به عنوان پاسخ نهایی در R1 محاسبه و نوشته می‌شود. در این عملیات چون خواندن و نوشتن متوالی وجود دارد و هیچ فراخوانی تابعی انجام نگرفته است، بنابراین در این حالت هیچ تعویض / انتظار زمینه‌ای اتفاق نمی افتد.
با این حال، دستورالعمل‌های خاصی به فراخوانی سیستم (System call) نیاز دارند که برای فرآیندهای انتظار / خواب به تعویض زمینه نیاز دارند. از یک کنترل‌کننده فراخوانی سیستم برای تعویض زمینه به حالت هسته استفاده می‌شود. عملکرد نمایشگر (دادهٔ x) ممکن است به دادهٔ x از دیسک و درایور دستگاه در حالت هسته نیاز داشته باشد. از این رو عملکرد display به حالت خواب می رود و در عملیات READ منتظر می‌ماند تا مقدار x را از دیسک دریافت کند. این باعث می شود برنامه منتظر بماند تا عملکرد تابع با tbe منتشر شود تا تنظیمات بیانیهٔ فعلی به حالت خواب درآید و منتظر بماند تا فراخوانی سیستم آن را بیدار کند. برای حفظ همزمانی اما برنامه باید مقدار جدید و روند خواب را دوباره با هم اجرا کند.
تعویض زمینه به تنهایی در زمان اجرای زمانبندی دارای هزینه در کارآیی است، فراوانی TLB و به‌طور غیر مستقیم به اشتراک‌گذاری حافظهٔ نهان CPU در میان چندین وظیفه موجب این هزینه‌هایند. تعویض در بین ریسمان‌های یک فرآیند می‌تواند سریع‌تر از تعویض میان دو فرآیند جدا رخ دهد؛ زیرا ریسمان‌ها می‌توانند نقشهٔ یک حافظه مجازی را به اشتراک بگذارند، بنابراین دیگر به TLB نیازی نیست.
تعویض زمینه اصولاً می‌تواند توسط نرم‌افزار یا سخت‌افزار انجام شود. برخی پردازنده‌ها مانند Intel 80386 و نظیر آن، دارای پشتیبان سخت‌افزاری برای تعویض زمینه هستند.
مانند دیگر وظایفی که در سخت‌افزار اجرا می‌شود، این مورد نیز به نظر می‌رسد که نسبت به نرم‌افزار سریع‌تر انجام شود. اگرچه شاخهٔ اصلی سیستم‌عامل‌ها نظیر مایکروسافت ویندوز و لینوکس از این ویژگی استفاده نمی‌کنند. این مورد می‌تواند به خاطر دو دلیل اصلی زیر باشد: