Европейский Университет в Санкт-Петербурге
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 1320 / 264 | Оценка: 4.34 / 3.65 | Длительность: 21:13:00
Лекция 9:

Управление процессами

Диспетчер

Когда поток готов к выполнению, он помещается в очередь отправки на выполнение. Каждый процессормногопроцессорной системе) имеет отдельный набор очередей отправки. Состояние ожидания в очереди отправки называется состоянием выполнения (RUN). Когда процессор освобождается, диспетчер берет поток с наивысшим приоритетом из очереди отправки этого процессора и помещает его в процессор. Теперь поток в состоянии "внутри процессора" (ONPROC) и может выполнять вычисления.

Поток может лишиться процессорного времени в данный момент и покинуть процессор по нескольким причинам:

  • поток занимает процессор, пока не закончится отведенный ему период времени (определяемый приоритетом потока). Такой период называется квантом. Поскольку процессы с большим приоритетом выбираются чаще, то квант обычно обратно пропорционален приоритету (процессы с большим приоритетом имеют меньшие кванты). Когда квант исчерпан, потоку присваивается приоритет нового уровня (значение tqexp). Такой уровень почти всегда ниже приоритета потока при старте. Это сделано для обеспечения справедливости при планировании;
  • поток ждет завершения ввода-вывода или разблокировки нужного ему ресурса, тогда он переходит в состояние "сна" (SLEEP). Проснувшимся потокам назначается более высокий приоритет, чем у них был до сна, чтобы они могли "наверстать упущенное";
  • ядро прервало поток; если прерванный поток долго ожидает внимания процессора, то его приоритет повышается до значения lwait. Так потоки компенсируют ожидание в очереди после прерывания.

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

Выяснить, с каким легковесным процессом ассоциирован конкретный процесс, и какой класс планирования ему назначен, можно с помощью команды ps и ключей –L и –с:

/usr/bin/ps –efcL

UID   PID  PPID LWP NLWP CLS  PRI  STIME     TTY   LTIME   CMD
root  0    0    1   1    SYS  96   00:23:03  ?     0:03    sched
root  1    0    1   1    TS   59   00:23:03  ?     0:00    /etc/init -
root  2    0    1   1    SYS  98   00:23:03  ?     0:00    pageout
root  3    0    1   1    SYS  60   00:23:03  ?     0:00    fsflush
root  314  1    1   1    TS   59   00:23:35  ?     0:00    /usr/lib/saf/sac -t 300
root  289  1    1   1    TS   59   00:23:32  ?     0:00    /usr/lib/snmp/snmpdx -y -c
                                                           /etc/snmp/conf
root  182  1    1   3    TS   59   00:23:22  ?     0:00    /usr/lib/autofs/automountd
root  182  1    2   3    TS   59   00:23:23  ?     0:00    /usr/lib/autofs/automountd
root  182  1    3   3    TS   59   00:25:23  ?     0:00    /usr/lib/autofs/automountd
root  207  1    3   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    4   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    5   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    6   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    7   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    8   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  207  1    9   18   TS   59   00:23:25  ?     0:00    /usr/sbin/nscd
root  193  1    11  13   TS   59   00:23:24  ?     0:00    /usr/sbin/syslogd
root  193  1    12  13   TS   59   00:23:24  ?     0:00    /usr/sbin/syslogd
root  193  1    13  13   TS   59   00:23:26  ?     0:00    /usr/sbin/syslogd
root  439  419  1   1    IA   39   00:24:42  pts/4 0:00    bash

Вывод этой команды сильно сокращен: процессов в системе на самом деле всегда значительно больше. Сейчас нам интересны прежде всего колонки LWP, CLS и PRI, в которых показаны номер легковесного процесса, класс планирования и глобальный приоритет соответственно.

Чем больше числовое значение глобального приоритета (значение PRI), тем выше глобальный приоритет процесса.

Мы видим, что многопоточные процессы (например, демон автомонтирования /usr/lib/autofs/automountd и демон протоколирования /usr/sbin/syslogd) могут одновременно иметь несколько LWP (в колонке NLWP указано количество LWP, с которыми ассоциирован процесс).

Настройка таблиц диспетчера

Таблицы диспетчера настраиваются с помощью команды dispadmin. Настройка выполняется следующим образом: вначале таблица диспетчера конкретного класса выводится в файл, затем файл редактируется в текстовом редакторе и загружается обратно в таблицу диспетчера. Вывод и загрузка таблицы осуществляется с помощью программы dispadmin.

Чтобы узнать, какие классы доступны для редактирования, следует запустить dispadmin с ключом –l и определить активные классы планирования:

dispadmin -l
CONFIGURED CLASSES ==================
SYS (System Class)
TS  (Time Sharing)
FX  (Fixed Priority)
IA  (Interactive)
RT  (Real Time)

Далее выводим таблицу диспетчера для выбранного класса (попробуем это на классе планирования с разделением времени – TS ):

dispadmin -c TS -g

# Time Sharing Dispatcher Configuration
RES=1000

ts_quantum  ts_tqexp  ts_slpret  ts_maxwait  ts_lwait      PRIORITY LEVEL
200         0         50         0           50        #   0
200         0         50         0           50        #   1
200         0         50         0           50        #   2
200         0         50         0           50        #   3
200         0         50         0           50        #   4
200         0         50         0           50        #   5
200         0         50         0           50        #   6
200         0         50         0           50        #   7
200         0         50         0           50        #   8
200         0         50         0           50        #   9
160         0         51         0           51        #   10
160         1         51         0           51        #   11
160         2         51         0           51        #   12
160         3         51         0           51        #   13
160         4         51         0           51        #   14
160         5         51         0           51        #   15
160         6         51         0           51        #   16
160         7         51         0           51        #   17
160         8         51         0           51        #   18
160         9         51         0           51        #   19
120         10        52         0           52        #   20
120         11        52         0           52        #   21
120         12        52         0           52        #   22
120         13        52         0           52        #   23
120         14        52         0           52        #   24
120         15        52         0           52        #   25
120         16        52         0           52        #   26
120         17        52         0           52        #   27
120         18        52         0           52        #   28
120         19        52         0           52        #   29
80          20        53         0           53        #   30
80          21        53         0           53        #   31
80          22        53         0           53        #   32
80          23        53         0           53        #   33
80          24        53         0           53        #   34
80          25        54         0           54        #   35
80          26        54         0           54        #   36
80          27        54         0           54        #   37
80          28        54         0           54        #   38
80          29        54         0           54        #   39
40          30        55         0           55        #   40
40          31        55         0           55        #   41
40          32        55         0           55        #   42
40          33        55         0           55        #   43
40          34        55         0           55        #   44
40          35        56         0           56        #   45
40          36        57         0           57        #   46
40          37        58         0           58        #   47
40          38        58         0           58        #   48
40          39        58         0           59        #   49
40          40        58         0           59        #   50
40          41        58         0           59        #   51
40          42        58         0           59        #   52
40          43        58         0           59        #   53
40          44        58         0           59        #   54
40          45        58         0           59        #   55
40          46        58         0           59        #   56
40          47        58         0           59        #   57
40          48        58         0           59        #   58
20          49        59         32000       59        #   59

Первая строка, в которой указано значение RES, определяет, в чем измеряется время во всей таблице приоритетов данного класса. Величина RES фактически задает дискретность измерения времени для столбца ts_quantum таблицы диспетчера. Ее значение по умолчанию 1000. Изменять дискретность не рекомендуется. Обратная к RES величина равна 0,001, и это интерпретируется как одна тысячная секунды, т.е. одна миллисекунда. Стало быть, по умолчанию время в столбце ts_quantum измеряется в миллисекундах.

Как было показано в разделе "Диспетчер" выше, смысл значений в столбцах таблицы диспетчера следующий:

  • ts_quantum представляет собой максимальный период времени (квант), в течение которого поток может оставаться в процессоре до того, как диспетчер изменит его приоритет;
  • ts_tqexp задает приоритет, который будет назначен потоку после того, как он будет удален из процессора, когда истечет его квант времени;
  • ts_slpret указывает приоритет, который будет иметь процесс, когда он будет обрабатываться после "сна", т.е. после ожидания завершения ввода-вывода или когда он дождется снятия блокировки с требуемого ему ресурса;
  • ts_maxwait указывает время в секундах, которое процесс будет оставаться в очереди, в случае, если его квант времени еще не истек; если он не использует свой квант времени в течение этого числа секунд, ему будет присвоен новый приоритет ts_lswait. Если ts_maxwait равно нулю, то принимается значение по умолчанию (одна секунда);
  • ts_lswait обозначает присваиваемый процессу приоритет, когда процесс на долгое время был вытеснен из процессора.

В таблицах диспетчера указываются относительные приоритеты (которые имеют силу внутри класса планирования). Глобальный (иначе говоря – абсолютный) приоритет вычисляется из относительного в соответствии с табл. 9.1.

Обратите внимание на то, что более высокоприоритетные процессы имеют меньшие кванты времени. Значение maxwait для самого выского приоритета, 59, настолько высоко, что ему придется ждать дольше других, если он лишится процессорного времени в пользу ядра (ядро имеет более высокий проритет, чем любой процесс разделения времени).

Посмотрим, как работает эта схема динамического назначения приоритетов. Предположим, процесс начал выполняться с приоритетом 0. Подождав, пока ему дадут управление в течение одной секунды ( ts_maxwait ), процесс получил новый приоритет 50 ( ts_lwait ).

Вместе с новым приоритетом процесс обрел новое значение кванта (меньшее, так как чем выше приоритет, тем меньше квант, для того, чтобы высокоприоритетные задачи не забивали процессор). Вместо прежних 200 миллисекунд процесс получил квант в 40 миллисекунд. Зато с этим приоритетом процесс получил возможность вытеснять из процессора менее приоритетные процессы.

Если процесс продолжает все время использовать процессорное время, не отвлекаясь на ввод-вывод (например, это вычислительный процесс программы моделирования полета ракеты), то по истечении кванта времени он получит новый приоритет 40 ( ts_tqexp ).

Дальнейшие назначения приоритетов показаны ниже:

Приоритет Квант
40 40
30 80
20 120
10 160
0 200
50 40
40 40
30 80
и т.д. и т.д.

Такая схема динамического назначения приоритетов позволяет быстро выполниться коротким высокоприоритетным процессам и дает возможность работать низкоприоритетным процессам. В то же время, процессы, постоянно потребляющие процессорное время, перемещаются к более низким приоритетам, получают большие кванты времени и будут больше времени проводить с низким приоритетом. Если же низкоприоритетный поток будет постоянно прерываться более высокоприоритетными, то его приоритет будет быстро повышен – как только пойдет ts_maxwait секунд. Фактически, это означает, что в сильно загруженной высокоприоритетными потоками системе низкоприоритетный поток через секунду будет становиться высокоприоритетным.

Класс реального времени (RT) описывается более простой таблицей диспетчера:

# Real Time Dispatcher Configuration RES=1000

TIME QUANTUM(rt_quantum)                 PRIORITY LEVEL
1000                               #     0
1000                               #     1
1000                               #     2
1000                               #     3
1000                               #     4
1000                               #     5
1000                               #     6
1000                               #     7
1000                               #     8
1000                               #     9
800                                #     10
800                                #     11
800                                #     12
800                                #     13
800                                #     14
800                                #     15
800                                #     16
800                                #     17
800                                #     18
800                                #     19
600                                #     20
600                                #     21
600                                #     22
600                                #     23
600                                #     24
600                                #     25
600                                #     26
600                                #     27
600                                #     28
600                                #     29
400                                #     30
400                                #     31
400                                #     32
400                                #     33
400                                #     34
400                                #     35
400                                #     36
400                                #     37
400                                #     38
400                                #     39
200                                #     40
200                                #     41
200                                #     42
200                                #     43
200                                #     44
200                                #     45
200                                #     46
200                                #     47
200                                #     48
200                                #     49
100                                #     50
100                                #     51
100                                #     52
100                                #     53
100                                #     54
100                                #     55
100                                #     56
100                                #     57
100                                #     58
100                                #     59

Потоки реального времени выполняются до завершения или до истечения их кванта (если в очереди стоят несколько потоков реального времени). Потокам реального времени присваивается самый высокий абсолютный приоритет, даже более высокий, чем потокам ядра, потому что относительные приоритеты отображаются в абсолютные, как показано в табл. 9.1.

Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.