Лабы по UNIX / UNIX6
.doc
ЛАБОРАТОРНАЯ РАБОТА № 6 (время выполнения -- 2 часа)
Тема: ”Управление процессами”
Процессы в UNIX играют ключевую роль. ОС представляет собой многозадачную среду, в которой одновременно выполняется несколько программ. Каждая программа может стартовать и завершать множество процессов в течение своего исполнения. От оптимального планирования процессов и числа одновременно выполняющихся процессов зависит загрузка процессора, что в итоге влияет на производительность системы в целом.
1. Наблюдение за процессами
ps |
информация об активных процессах |
pgrep |
поиск процессов по заданному шаблону, выводит список PID и к.с., запустившей процесс (исполняемого файла) |
prstat |
информация о системных процессах |
2. Управление процессами
2.1. Задание переменных среды
export |
Экспортирование переменной среды |
env |
Просмотр переменных среды |
2.2. Запуск процессов в фоновом режиме
& |
Запуск процесса в фоновом режиме |
nohup |
Незавершение процесса после завершения сеанса пользователя |
2.3. Планирование процесса (назначение приоритета)
Приоритет процесса -- целочисленное значение, которое динамически вычисляется и обновляется на основе некоторых различных факторов. Чем меньше уровень приоритетности, тем процесс предпочтительнее. Приоритеты с одинаковым уровнем приоритетности помещаются в очередь выполнения для данного значения приоритета. При освобождении ЦП планировщик выбирает процессы из начала непустой очереди с меньшим значением уровня приоритета.
Процесс в UNIX имеет 2 ассоциированных с ним значения приоритета -- запрошенный приоритет относительно других процессов (NI) и приоритет, присваиваемый процессу ОС (PRI). Процессу по умолчанию присваивается NI, равный NI его родительского процесса. Доступные значения приоритетов -- от -20(самый высокий) до +20 (самый низкий). Процессы пользователя -- от 0 до +20.
nice |
Запуск процесса с заданным приоритетом |
renice |
Изменение приоритета процесса |
priocntl |
Изменение приоритета процесса |
Примеры
Повышение приоритета процесса
nice -5 my_command
Изменение приоритета процесса
renice -n 5 -p 8200
priocntl -s -p -5 -i pid 8200 для процесса 8200
priocntl -s -p -5 -i pid 8200 для всех потомков 8200
2.4. Сигналы
Сигналы являются простейшей формой межпроцессного взаимодействия. Сигнал может быть отправлен процессу либо ядром, либо другим процессом с помощью системного вызова kill(). Символьные имена сигналов и их расшифровка - в файле <signal.h>. Для отправки сигналов используются команды kill, pkill.
Пример
pkill -9 my_prog
Если сигнал не задан, то по умолчанию SIGTERM.
Пример
my_program &
kill $! (переменная $! содержит PID последнего
запущенного процесса,
по умолчанию посылается SIGTERM)
Реакция на сигналы
При получении сигнала процесс может действовать 3 способами
- проигнорировать сигнал (trap “ “ сигнал)
- выполнить (восстановить) действия по умолчанию (trap сигнал)
- перехватить (”перехитрить”) сигнал (trap команда сигнал)
Сигналы SIGKILL и SIGSTOP нельзя ни перехватить, ни проигнорировать.
2.5. Планирование работ
ОС Solaris поддерживает 2 способа пакетной обработки данных -- crontab и at.
Демон cron планирует системные события в соответствии с командами, заданными в файле crontab.
Формат файла crontab
минута час день_месяца месяц день_недели команда
Пример
0 12 5,20 * * echo "Получите зарплату" > /dev/console
Планирование одиночного системного события (команда at)
Пример
at 07:45am today who>/tmp/log
УПРАЖНЕНИЯ
-
Запустите терминал. Определите PID процесса, который ассоциируется с запущенным терминалом.
-
Запустите другой терминал. Остановите первый запущенный терминал, послав ему сигнал STOP.
-
Убедитесь, что первый терминал действительно остановлен.
-
Сделайте так, чтобы остановленный терминал продолжил свою работу (пошлите ему сигнал CONT)
-
Напишите shell-программу, выполняющую бесконечный цикл, одну итерацию в секунду. Запустите ее в фоновом режиме. Остановите программу.
-
Напишите программу, которая выдает в бесконечном цикле сообщение, заданное как аргумент. Как остановить такую программу?
-
Запустите программу из предыдущей задачи с пониженным приоритетом. Как повысить ее приоритет? Как запустить несколько таких программ одной командной строкой? Как переключаться между ними? Остановите запущенные Вами программы.
-
Запустите вновь программу из задачи 5 в фоновом режиме и завершите сеанс. Вновь зарегистрируйтесь. Работает ли Ваша программа? Сделайте так, чтобы запущенная Вами в фоновом режиме программа продолжала работать после Вашего выхода из системы.
-
Напишите программу, которая сообщает имя переданного ей сигнала и записывает его в файл с указанием времени события.
-
Напишите программу manager, которая запускает две другие написанные Вами программы с разными приоритетами. Эти программы должны периодически добавлять в файлы некоторую информацию разного объема. При превышении заданного объема одним из файлов manager прекращает выполнение обеих программ и выводит имя той из них, которая создала больший файл.
-
Напишите программу-диспетчер, которая запускала бы две другие shell-программы, каждая из которых выводила бы в цикле сообщение о своей работе. Цель программы–диспетчера – обеспечить псевдопараллельную работу этих программ, поочередно выделяя квант времени для каждой, но так, чтобы в каждый момент времени работала бы только одна программа.
-
Установите в качестве первичного приглашения идущие часы, меняющие свои показания каждые 10 секунд.
-
Напишите программу-будильник, которая работает в фоновом режиме и в указанное время напоминает пользователю о важном деле.
-
Напишите программу, которая, работая в фоновом режиме, в указанное время отключает пользователя от системы.
-
Напишите shell-программу, которая в фоновом режиме запускает другую shell-программу, указанную ей в качестве аргумента, и печатает сообщение:
«имя запущенной программы» already started
и ждет завершения программы, после чего сообщает:
«имя запущенной программы» finished