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