مقدمه

در درس قبل با پراسس‌ها و نحوه‌ی مشاهده و خاتمه دادن به آن‌ها آشنا شدیم. حال یک سؤال مهم مطرح می‌شود: وقتی چندین پراسس به صورت همزمان در حال اجرا هستند و منابع پردازنده (CPU) محدود است، سیستم عامل چگونه تصمیم می‌گیرد که کدام پراسس را زودتر اجرا کند؟ این تصمیم‌گیری توسط بخشی از هسته‌ی لینوکس به نام زمان‌بند (Scheduler) انجام می‌شود.

زمان‌بند دائماً در حال تخصیص زمان CPU به پراسس‌های مختلف است. اگرچه ما نمی‌توانیم به طور مستقیم به زمان‌بند دستور دهیم، اما می‌توانیم با تنظیم اولویت (Priority) یک پراسس، بر تصمیمات آن تأثیر بگذاریم. ما می‌توانیم به سیستم بگوییم که یک پراسس خاص (مثلاً یک کار محاسباتی سنگین در پس‌زمینه) اهمیت کمتری دارد و باید در برابر پراسس‌های دیگر «خوش‌رفتار» باشد. این کار با تغییر مقداری به نام «niceness» انجام می‌شود.

مفهوم مقدار nice

در لینوکس، اولویت هر پراسس با یک مقدار عددی به نام nice مشخص می‌شود. این عدد نشان می‌دهد که یک پراسس چقدر حاضر است در مقابل دیگر پراسس‌ها «خوش‌رفتار» یا «nice» باشد و منابع CPU را به آن‌ها واگذار کند.

محدوده‌ی مقدار nice از ۲۰- تا ۱۹+ است:

  • ۲۰- (کمترین مقدار): نشان‌دهنده‌ی بالاترین اولویت است. این پراسس «خوش‌رفتار» نیست و سعی می‌کند بیشترین سهم از CPU را به خود اختصاص دهد.
  • ۰ (مقدار پیش‌فرض): اولویت عادی است که تمام پراسس‌های آغاز شده توسط کاربران معمولی با آن شروع می‌شوند.
  • ۱۹+ (بیشترین مقدار): نشان‌دهنده‌ی پایین‌ترین اولویت است. این پراسس بسیار «خوش‌رفتار» است و به راحتی زمان CPU را به دیگران واگذار می‌کند.
یک رابطه‌ی معکوس وجود دارد: مقدار nice بالاتر به معنای اولویت پایین‌تر است. فقط کاربر ریشه (root) می‌تواند مقدار nice منفی (اولویت بالا) به یک پراسس اختصاص دهد. کاربران عادی فقط می‌توانند اولویت پراسس‌های خود را کاهش دهند (یعنی مقدار nice را افزایش دهند).

اجرای یک پراسس با اولویت مشخص: دستور nice

برای اجرای یک پراسس جدید با یک اولویت غیر پیش‌فرض، از دستور nice استفاده می‌کنیم. ساختار کلی آن به شکل nice -n level command است که در آن level همان مقدار nice مورد نظر ماست.

فرض کنید می‌خواهیم یک اسکریپت محاسباتی سنگین را اجرا کنیم، اما نمی‌خواهیم این کار باعث کندی سیستم و مزاحمت برای دیگر کاربران شود. ما آن را با اولویت پایین (مقدار nice بالا) اجرا می‌کنیم:

$ nice -n 15 ./heavy_computation.sh

برعکس، اگر یک کار بسیار حیاتی داریم و می‌خواهیم با بالاترین اولویت ممکن اجرا شود، (با دسترسی ریشه) به این صورت عمل می‌کنیم:

$ sudo nice -n -10 ./critical_task.sh

تغییر اولویت یک پراسس در حال اجرا: دستور renice

دستور nice برای پراسس‌های جدید است. اما اگر بخواهیم اولویت یک پراسسی که هم‌اکنون در حال اجراست را تغییر دهیم چه؟ برای این کار از دستور renice استفاده می‌کنیم. این دستور برای کار به شناسه‌ی پراسس (PID) نیاز دارد.

فرض کنید یک فرآیند پشتیبان‌گیری را اجرا کرده‌ایم و متوجه شده‌ایم که در حال مصرف مقدار زیادی از CPU است. ابتدا PID آن را با ps پیدا می‌کنیم و سپس با renice اولویت آن را کاهش می‌دهیم:

$ ps aux | grep "backup_script"
me        54321 85.0  5.2 ... ./backup_script.sh

$ sudo renice 12 -p 54321
54321 (process ID) old priority 0, new priority 12

مشاهده‌ی اطلاعات اولویت با top

دستور top یک ابزار بسیار قدرتمند برای مشاهده‌ی زنده‌ی وضعیت پراسس‌های سیستم است. این دستور مانند یک نسخه‌ی پویا و پیشرفته از ps عمل می‌کند و اطلاعات آن هر چند ثانیه یک بار بروز می‌شود. پس از اجرای top، دو ستون مرتبط با اولویت را خواهید دید:

  • NI: این ستون مقدار nice هر پراسس را نمایش می‌دهد. این همان مقداری است که ما با nice و renice کنترل می‌کنیم.
  • PR: این ستون اولویت واقعی پراسس در هسته‌ی سیستم را نشان می‌دهد که از روی مقدار NI محاسبه می‌شود.

با اجرای top می‌توانید تأثیر دستورات nice و renice را به صورت زنده مشاهده کنید. برای خروج از محیط top، کافیست کلید q را فشار دهید.