Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические рекомендации по выполнению лаборат...doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
3.24 Mб
Скачать

2 Изучение процессов и потоков в Linux

2.1 Цель работы

2.1.1 Изучить основные процессы, запускаемые OC Linux

2.1.2 Научиться управлять приоритетами запускаемых процессов

2.2 Приборы и оборудование

2.2.1 ПЭВМ типа IBM PC

2.2.2 ОС Linux

2.3 Порядок выполнения работы

2.3.1. Изучите теоретические сведения.

2.3.2. Запустите утилиту Монитор производительности (K/Система/KSysGuard).

2.3.3. Просмотрите запущенные процессы. Отсортируйте процессы по степени загрузки ЦП от наибольшего. Назовите этот процесс, определите его PID. Опишите его по следующей схеме:

- количество нитей исполнения;

- количество потомков процесса;

- общее время работы процесса в пользовательском режиме и в режиме ядра;

- определите UID и GID пользователя, создавшего процесс.

2.3.4. Отфильтруйте процессы, оставив «только системные». Дайте характеристику одному системному процессу (выбор процессов осуществляется на панели Таблица процессов в списке) по следующей схеме:

- идентификатор процесса и его название

- идентификатор пользователя и группы пользователя, запустившего процесс;

- приоритет процесса;

- размер виртуальной и физической памяти, занимаемой процессом;

- используя идентификатор породившего процесса, определите какой процесс являлся процессом-предком этого процесса (посмотрев, РРID описывающего процесса, найдите это число в PID и, тем самым определите процесс, который является процессом-предком данного процесса).

2.3.5. Отфильтруйте процессы, оставив «только пользовательские». Опишите только системные характеристики любого пользовательского процесса, относящие к дескриптору процесса.

2.3.6. Запустите программу Терминал (K\Система\Терминал). Обновите сведения в окне. Таблица процессов. Посмотрите, какой процесс был порожден и каков его приоритет. Имя процесса – konsole.

2.3.7. Уменьшите численное значение приоритета запущенного процесса, воспользовавшись контекстным меню процесса и, выбрав пункт меню Изменить приоритет процесса. Повлияло ли данное изменение на производительность приложения?

2.3.8. Запустите на выполнение программу Терминал.

2.3.9. Вывести информацию обо всех выполняющихся процессах с помощью команды ps aux:

Оставить в выводе предыдущей команды только системные процессы с помощью команды ps aux | grep -v user (часть процессов, выведенные в квадратных скобках, — это потоки ядра, исполняющие специальные функции. Можно выделить демонов — в столбце терминала они имеют символ «?». Например, системный журнал (syslog) или планировщик задач (cron))

2.3.11. Вывести иерархию процессов с помощью команды pstree. Какой процесс стоит в вершине иерархии?

2.3.12. Рассмотреть поведение процессов интерактивно с помощью команды top.

2.3.13. Отобразите все существующие в системе процессы командой ps aux. Приведите листинг команды и расшифруйте значение столбцов.

2.3.14. Определите nice-фактор процессов системы. Уменьшите nice-фактор процессов системы. Измените nice-фактор уже запущенного процесса. Листинг приведите в отчете.

2.3.15. Посмотрите перечень сигналов системы командой kill -l.

2.3.16. Наберите в терминале команду sleep 1000 &.

Затем проверьте, что процесс находится в состоянии ожидания, о чем нам говорит буква S в столбце STAT:

igor@ubuntu:~$ ps x | grep [s]leep PID TTY STAT TIME COMMAND 6301 pts/1 S 0:00 sleep 1000

Теперь пошлем процессу сигнал STOP. Для этого используем команду kill (kill -название процесса PID процесса):

igor@ubuntu:~$ kill -STOP 6301 [1]+ Stopped sleep 1000

Проверяем статус процесса: igor@ubuntu:~$ ps x | grep [s]leep PID TTY STAT TIME COMMAND 6301 pts/1 T 0:00 sleep 1000

Видим, что процесс действительно находится в состоянии “остановленный” (символ T в столбце STAT).

2.3.17. Теперь отправим процессу сигнал продолжения работы (CONT) и проверим состояние: igor@ubuntu:~$ kill -CONT 6301 igor@ubuntu:~$ ps x | grep [s]leep PID TTY STAT TIME COMMAND 6301 pts/1 S 0:00 sleep 1000

Если необходимо корректно завершить процесс, то необходимо послать ему сигнал TERM: igor@ubuntu:~$ kill -TERM 6301 igor@ubuntu:~$ ps x | grep [s]leep [1]+ Terminated sleep 1000 igor@ubuntu:~$ ps x | grep [s]leep

Если сразу же после посылки сигнала TERM выполнить команду ps x | grep [s]leep, то можно успеть увидеть сообщение о том, что процесс завершает работу, в при следующей попытке вывести информацию о нашем процессе sleep мы уже ничего не увидим - процесс прекратил существование. Команда kill без указания сигнала, по умолчанию передает процессу именно сигнал TERM. Поэтому можно было написать просто kill 6301.

2.3.18. Если необходимо срочно завершить процесс, или процесс не завершается по сигналу TERM, то тогда необходимо послать процессу сигнал KILL: igor@ubuntu:~$ sleep 1000 & [1] 6348 igor@ubuntu:~$ kill -KILL 6348 igor@ubuntu:~$ ps x | grep [s]leep [1]+ Killed sleep 1000

Если необходимо послать один и тот же сигнал нескольким процессам, то можно перечислить их через пробел: kill -TERM 2345 3456 4567.

Команда kill довольно ограничена в возможностях и не позволяет выполнять более сложные действия. Поэтому рассмотрим еще одну команду - killall. Основное преимущество этой команды, то что она умеет посылать сигналы всем процессам с одинаковым именем или всем процессам одного пользователя. Запустите несколько раз подряд команду sleep 1000 &:

igor@ubuntu:~$ ps x | grep [s]leep 6460 pts/1 S 0:00 sleep 1000 6461 pts/1 S 0:00 sleep 1000 6462 pts/1 S 0:00 sleep 1000 6463 pts/1 S 0:00 sleep 1000 6464 pts/1 S 0:00 sleep 1000 6465 pts/1 S 0:00 sleep 1000 6466 pts/1 S 0:00 sleep 1000

Теперь, чтобы завершить все процессы с именем sleep, достаточно набрать команду killall sleep: igor@ubuntu:~$ killall sleep [1] Terminated sleep 1000 [2] Terminated sleep 1000 [3] Terminated sleep 1000 [4] Terminated sleep 1000 [6]- Terminated sleep 1000 [7]+ Terminated sleep 1000 [5]+ Terminated sleep 1000

Выполните команду sleep 1000 & еще несколько раз, а затем зарегистрируйтесь в другой консоли от имени другого пользователя (например, test) и также от его имени выполните команду sleep 1000 &. Теперь вернитесь в свою консоль и просмотрите процессы sleep всех пользователей:

igor@ubuntu:~$ ps aux | grep [s]leep igor 6540 0.0 0.0 2952 628 pts/1 S 22:30 0:00 sleep 1000 igor 6541 0.0 0.0 2952 632 pts/1 S 22:30 0:00 sleep 1000 igor 6542 0.0 0.0 2952 628 pts/1 S 22:30 0:00 sleep 1000 test 6543 0.0 0.0 2952 632 pts/3 S 22:30 0:00 sleep 1000 test 6544 0.0 0.0 2952 628 pts/3 S 22:30 0:00 sleep 1000 test 6545 0.0 0.0 2952 628 pts/3 S 22:30 0:00 sleep 1000 test 6546 0.0 0.0 2952 632 pts/3 S 22:30 0:00 sleep 1000

2.3.19. Теперь для того, чтобы удалить процессы только пользователя test необходимо выполнить (от имени пользователя root) команду killall -u test: igor@ubuntu:~$ sudo killall -u test igor@ubuntu:~$ ps aux | grep [s]leep igor 6540 0.0 0.0 2952 628 pts/1 S 22:30 0:00 sleep 1000 igor 6541 0.0 0.0 2952 632 pts/1 S 22:30 0:00 sleep 1000 igor 6542 0.0 0.0 2952 628 pts/1 S 22:30 0:00 sleep 1000

Команда выше удалит не только процессы sleep, но вообще все процессы пользователя test. Если необходимо удалить конкретно процессы sleep, то тогда команду нужно было записать так: killall -u test sleep.

2.3.20. Если запустить команду killall c ключом -i, то перед посылкой сигнала будет запрашиваться подтверждение:

igor@ubuntu:~$ killall -i sleep Прибить sleep(6540) ? (y/N) n Прибить sleep(6541) ? (y/N) n Прибить sleep(6542) ? (y/N) n

2.3.21. Завершите сеанс работы c Linux.

2.3.22. Оформите отчет и сдайте его преподавателю.