nice - اولویت‌بندی فرایندها

nice - یکی از قابلیت‌های انعطاف پذیری گنو/لینوکس اولویت‌بندی به فرایندها (پروسه‌ها) است.

شکل کلی دستور:

# nice [options]

قبل از اینکه شروع به توضیح و مثال از این دستور، بهتراست در مورد فرایند (پروسه)، انواع فرایندها و... کمی توضیح دهم.

اولین سوالی که باید پرسیده شود این است که فرایند چیست؟

به عبارت ساده، یک فرایند، یک قرارداد نامگذاری مورد استفاده توسط لینوکس به عهده نقش یک برنامه‌ی در حال اجرا است.

فرایندها مجموعه‌ای از قوانینی هستند که توسط آن هر برنامه خاص باعث استفاده از منابع در یک بازه‌ی زمانی می‌شود که در اختیار می‌گیرد.

هر فرایند در حال اجرا بر روی یک سیستم، شماره شناسه (ID) خاص خود را دارد که به آن شماره شناسه فرایند (PID) گویند که توسط آن می توان آن را نظارت و اداره است.

هسته یا کرنل سیستم عامل، اطلاعاتی خوبی از این فرایندها دارد که به چندی از آن می‌پردازیم:

  • وضعیت فرایند

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

هر فرایند شامل والدی است که والد آن، آن فرایند را به دلیلی ایجاد کرده است. حال اگر ما یا برنامه‌‌ای، فرایندی را که دارای فرزند است از بین ببرد یا آن‌ را kill کنیم، پروسه‌ی فرزند چه می‌شود؟ اگر کرنل آن را بی‌استفاده ببیند و چون این فرایند، فرایند والدی ندارد، آن را فرزند فرایند مادر یا همان فرایند شماره یک (init) در نظر می‌گیرد. این فرایند ایجاد شده، یک نوع از فرایندهای زامبی است .

نکته: فرایندهای زامبی kill نمی‌شوند.

برای این‌که متوجه بشوید چه تعداد فرایند در سیستم عامل شما به صورت زامبی درآمده می‌توانید از دستور زیر استفاده کنید:

top |egrep -i "zombie"

خروجی:

Tasks: 179 total,   1 running, 178 sleeping,   0 stopped,   0 zombie
Tasks: 179 total,   3 running, 176 sleeping,   0 stopped,   0 zombie
Tasks: 179 total,   1 running, 178 sleeping,   0 stopped,   0 zombie
Tasks: 179 total,   2 running, 177 sleeping,   0 stopped,   0 zombie

همین‌طور که در خروجی دستور بالا می‌بینید، ستون آخر برای مشخص کردن تعداد زامبی های موجود است.

توجه دارید که در دستور بالا سه حالت دیگر فرایندها، قابل مشاهده هستند. برای مثال، در اولین بار ۱ فرایند در حال اجرا، ۱۷۸ خواب، و ۰ فرایند متوقف شده و زامبی دیده می شود.

  • اولویت به فرایندها برای اجرا

بحث اصلی ما که در ادامه توضیح داده خواهد شد.

  • اطلاعات مربوط به منابع مورد استفاده
  • صاحب یک فرایند
  • و...

همین‌طور که در ابتدا گفتم ما با دستور nice می‌توانیم برای شروع یک فرایند، اولویتی دهیم.

اولویت چیست؟

برای این‌که مفهوم اولویت را بهترمتوجه بشوید یک‌بار از دستور قدرتمند top خروجی بگیرید:

top
 PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND          
 3457 masoud    20   0  106m  26m  12m R  23.9  0.6   1:44.04 gtk-gnash         
 2793 masoud    -5   0  739m 266m  38m R   9.0  6.6  18:58.40 firefox           
 1121 root      20   0 91008  33m 6448 S   6.6  0.8   7:01.77 Xorg              
 3471 masoud    20   0 92700  15m  10m S   2.0  0.4   0:00.73 gnome-terminal    
 1991 masoud    20   0  227m  71m  30m S   1.7  1.8   0:38.95 compiz            
 3401 root      20   0     0    0    0 R   1.3  0.0   0:08.50 kworker/0:0       
 3468 root      20   0     0    0    0 S   1.3  0.0   0:00.24 kworker/1:5       
  253 root      20   0     0    0    0 S   0.3  0.0   0:06.01 kworker/1:3       
 1047 mysql     20   0  311m  33m 5804 S   0.3  0.8   0:03.02 mysqld            
 2955 masoud    20   0  101m  22m  12m S   0.3  0.6   0:11.02 gtk-gnash         
 3530 masoud    20   0  5200 1408 1032 R   0.3  0.0   0:00.38 top

به ستون NI و PR توجه کنید که به ترتیب مخفف NICE و PRIORITY می باشد .

در ستون PR ما اعدادی را خواهیم دید که بازه‌ی عددی آن ها بین 20- (منفی بیست) و 19 و یا 20 است، که بشترین اولویت برای فرایندهایی است که عدد آن 20- است و به همین ترتیب رو به بالا اولویت ها کم می شود، برای مثال اولویت 5- از 5 بیشتر است.

در خروجی بالا من به مرورگر فایرفاکس اولویت 5- دادم که نسبت به بقیه فرایندها، دارای اولویت بالاتری است .

در ستون NI، عددی را نشان می‌دهد که فرایند با آن عدد شروع به فعالیت کرده است. دقت کنید که بحث اصلی ما دقیقا همین جاست .

ما می‌توانیم با دستور nice اولویت اولیه به آن اختصاص دهیم، برای این‌که خوب متوجه بشوید من دستور top که هنوز باز نکرده‌ام و مایل هستم اولویت بالایی به آن بدهم از دستور زیر استفاده می‌کنم:

#nice -n -10 top -i

 1121 root      20   0 87800  34m 6660 S   3.3  0.9   9:39.21 Xorg              
 4566 masoud    20   0 93196  15m  11m S   1.0  0.4   0:00.90 gnome-terminal    
 1991 masoud    20   0  228m  72m  30m S   0.7  1.8   1:03.56 compiz            
 2097 masoud    20   0 41876 9840 7764 S   0.3  0.2   0:00.43 gnome-screensav   
 2955 masoud    20   0  101m  22m  12m S   0.3  0.6   0:15.20 gtk-gnash         
 3553 root      20   0     0    0    0 R   0.3  0.0   0:08.39 kworker/0:1       
 4627 root      10 -10  5204 1396 1028 R   0.3  0.0   0:00.07 top

همین‌طور که در خروجی خط آخر می‌بینید، دستور nice با گزینه‌ی اختیاری n-و مقدار 10-به دستور top اولویت اولیه‌ی 10- داده است.

چرا نیازی به اولویت ابتدایی یک فرایند هست؟

اگر یک کاربر عادی هستید با صداقت می‌شود گفت : هیچ نیازی به آن ندارید! چرا که خود سیستم عامل با توجه به الگوریتم‌های هوشمندی (مثل Round-robin یا Multilevel feedback queue) این‌کار را انجام می‌دهد. ولی اگر یک برنامه‌نویس و یا طراح هستید و با برنامه‌های مختلف سروکار دارید، حتماً این دستور مورد استفاده‌ی شما قرار خواهد گرفت.

نکته: سیستم بیشتر فرایندها را، اولویت اولیه‌ی 0 قرار می دهد.

گزینه اختیاری:

n-: از این گزینه‌ی اختیاری برای تخصیص مقادیر استفاده می‌شود. که مقدار پیش‌فرض آن 10 می‌باشد.

نکته: می‌توان از این گزینه‌ی اختیاری استفاده نکرد و صریحاً به آن مقدار داد، ولی باید توجه داشت که حتما یک علامت -به ابتدای آن اضافه کنید.

مثال:

#nice -10 top -i

توجه داشته باشید که به دستور top اولویت 10 (نه 10-) دادیم و برای اولویت 10- به این صورت عمل می‌کنیم:

#nice --10 top -i