تعویض زمینه

**تعویض زمینه** یا **سودهی به بافت**  در رایانش -که گاهی در کتاب‌های فارسی «تعویض متن» یا «برگرداندن متن» ترجمه می‌شود- به فرایند ذخیره کردن و بازیابی وضعیت (زمینهٔ) یک گفته می‌شود؛ به طوری که اجرای آن بتواند بعداً از همان نقطه ادامه یابد. این کار به چند اجازه می‌دهد تا از یک 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 و نظیر آن، دارای پشتیبان سخت‌افزاری برای تعویض زمینه هستند.

مانند دیگر وظایفی که در سخت‌افزار اجرا می‌شود، این مورد نیز به نظر می‌رسد که نسبت به نرم‌افزار سریع‌تر انجام شود. اگرچه شاخهٔ اصلی سیستم‌عامل‌ها نظیر مایکروسافت ویندوز و لینوکس از این ویژگی استفاده نمی‌کنند. این مورد می‌تواند به خاطر دو دلیل اصلی زیر باشد:
* تعویض زمینهٔ سخت‌افزاری تمام ثبات‌ها را نگهداری نمی‌کند (تنها ثبات‌های اصلی و نه ثبات‌های ممیز شناور)
* وابسته به کارایی مسئله و … تعویض زمینهٔ نرم‌افزاری می‌تواند تنها ثبات‌های مورد نیاز را انتخاب و ذخیره کند در حالی که تعویض زمینهٔ سخت‌افزاری تقریباً تمام ثبات‌ها را ذخیره می‌کند؛ چه مورد نیاز باشند و چه نباشند.

## منابع

* 

رده:فرایند (رایانه)
رده:فناوری‌های سیستم‌عامل