Европейский Университет в Санкт-Петербурге
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 1716 / 298 | Оценка: 4.30 / 3.85 | Длительность: 16:22:00
ISBN: 978-5-94774-820-8
Лекция 7:

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

Диспетчер

Когда поток готов к выполнению, он помещается в очередь отправки на выполнение. Каждый процессор (в многопроцессорной системе) имеет отдельный набор очередей отправки. Состояние ожидания в очереди отправки называется состоянием выполнения (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
Пример 7.1. Результат работы команды ps c ключами -L и -c

Вывод этой команды здесь сильно сокращен: процессов в системе на самом деле всегда значительно больше. Сейчас нам интересны прежде всего колонки 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
Пример 7.2. Результат работы команды dispadmin -c TS -g

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

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

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

В таблицах диспетчера указываются относительные приоритеты (которые имеют силу внутри класса планирования ). Глобальный (иначе говоря - абсолютный) приоритет вычисляется из относительного в соответствии с табл. 7.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
Пример 7.3. Таблица диспетчера

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