Приоритет процессов

Приоритет процесса определяет, как часто данный процесс, по сравнению с другими процессами, стоящими в очереди на выполнение процессора, будет исполняться процессором.

Вы должны понять, что приоритет — понятие относительное. Ведь в данный момент в очереди на выполнение могут стоят двадцать процессов, а в следующий — два. Поэтому приоритет — это «плавающее» значение, которое определяет сама система в зависимости от текущей ситуации.

В Linux значение приоритета может быть равно числу в диапазоне сорока значений. Как же я туманно выразился. На самом деле, все зависит от версии ядра Linux. Значение приоритета может быть в диапазоне от -20 до 19 или от 0 до 39. В обоих случаях возможное значение ограничено сорока числами. В ядрах версии 2.6.х значение приоритета находится в диапазоне от 0 до 39.

Чем меньше число – тем выше приоритет процесса. То есть процесс с приоритетом 5 имеет больший приоритет, чем процесс с приоритетом 16.

Вы не можете непосредственно изменять приоритет процесса, это прерогатива операционной системы. Но Вы можете определить, на сколько больше или меньше процесс будет «нравиться» системе. Для этого следует использовать поле nice. То есть для изменения приоритета администратор должен изменять значение поля nice. Если значение nice равно нулю — значит, у программы приоритет не изменен. Если в поле nice записано отрицательное число – приоритет процесса увеличен, положительное — уменьшен.

Давайте посмотрим на соответствующие поля, показанные программой ps:

$ ps -t pts/1 -o pid,pri,ni,comm
  PID PRI  NI COMMAND
 4205  24   0 bash 
 4246  24   0 ps
$

Как видно из примера, у программ, выполняющихся на терминале pts/1, значение поля nice равно нулю. Следовательно, эти программы выполняются со стандартным приоритетом, установленным самой системой.

В следующем примере будут показаны программы с увеличенным приоритетом, которые в данный момент работают в системе (В качестве примера я хотел использовать программу ps «ps -e -o pid,pri,ni,comm», но почему-то значение поля приоритет выводилось неправильно. Нет в мире совершенства. Поэтому пришлось использовать top в командном режиме.)

$ top -b -n1 | grep "\-." | sed -e '1d'
    3 root      10  -5     0    0    0 S  0.0  0.0   0:00.04 events/0
    4 root      10  -5     0    0    0 S  0.0  0.0   0:00.01 khelper
    5 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
    7 root      10  -5     0    0    0 S  0.0  0.0   0:00.16 kacpid
  100 root      10  -5     0    0    0 S  0.0  0.0   0:00.07 kblockd/0
  146 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0
  147 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 xfslogd/0
  148 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 xfsdatad/0
  871 root      12  -4  1472  456  384 S  0.0  0.2   0:00.02 udevd
 1506 root      10  -5     0    0    0 S  0.0  0.0   0:00.07 ipw2100/0
$

Как видите, таких программ достаточно много.

Любой пользователь системы может изменить значение поля nice. Но существуют два ограничения:

  • Пользователь может изменить приоритет только у программ, выполняющихся с его правами.
  • Пользователь может только понизить приоритет (записать положительное число в поле nice).

Как обычно, суперпользователь может все! Он может изменить приоритет любому процессу системы, он может уменьшать и увеличивать приоритеты.

Для изменения приоритета можно воспользоваться программой top. Сначала получим список всех процессов выполняемых пользователем user1. Для краткости, заголовок top я буду удалять.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME #C COMMAND
 4316 user1     15   0  3332 1944 1192 S  0.0  0.8   0:00  0 bash
 4326 user1     16   0  2064 1060  832 R  0.0  0.4   0:00  0 top

Для изменения приоритета процесса используйте команду r.

PID to renice:
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME #C COMMAND
 4326 user1     16   0  2064 1060  832 R  0.3  0.4   0:00  0 top
 4316 user1     15   0  3332 1944 1192 S  0.0  0.8   0:00  0 bash

Программа попросит ввести PID процесса, которому следует изменить приоритет. Введите PID и нажмите Enter.

Renice PID 4326 to value:
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME #C COMMAND
 4326 user1     16   0  2064 1060  832 R  0.3  0.4   0:00  0 top
 4316 user1     15   0  3332 1944 1192 S  0.0  0.8   0:00  0 bash

Теперь программа просит ввести значение, которое будет записано в поле nice. Введем число 10 и нажмем Enter.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM   TIME #C COMMAND
 4316 user1     15   0  3332 1944 1192 S  0.0  0.8   0:00  0 bash
 4326 user1     26  10  2064 1060  832 R  0.0  0.4   0:00  0 top

Значение поля nice изменилось на 10. Соответственно изменилось и значение поля приоритета процесса.

Существуют еще две программы, которые можно использовать для изменения приоритета: nice и renice.