Практическая работа 5 Процессы в операционной системе linux цель работы
Скачать 473.85 Kb.
|
1 Практическая работа 5 Процессы в операционной системе LINUX Цель работы: Ознакомиться на практике с понятием процесса в операционной системе. Приобрести опыт и навыки управления процессами в операционной системе Linux. План проведения работы: 1. Используя теоретические сведения изучите порядок работы с текстовым редактором Vi и создайте два сценария для исследования процессов. 2. Следуя указаниям ознакомьтесь на практике с командами и сигналами для управления процессами: запуском, остановкой, переводом на передний план, удалением процесса и др. 3. Составьте отчет. Краткие теоретические сведения: 1. Устройство Linux: ядро и процессы. Главная, постоянно находящаяся в оперативной памяти, часть ОС Linux называется ядром (Kernel). Ядро ОС обрабатывает прерывания от устройств, выполняет запросы системных процессов и пользовательских приложений, распределяет виртуальную память (см. рис. 1). Пользовательские процессы не могут непосредственно, например, порождать другие процессы, производить чтение или запись на диск, выводить данные на экран или создавать гнездо (socket) для обмена по сети. Для выполнения этих действий они должны воспользоваться сервисами ядра. Обращения за такими услугами называются системными вызовами. Ядро обслуживает запросы процессов. Что же такое процесс? Процесс можно представить себе как виртуальную машину, отданную в распоряжение одной задачи. Каждый процесс считает, что он на машине один и может распоряжаться всеми ее ресурсами. На самом же деле процессы надежно изолированы друг от друга, так что крушение одного не может повредить всей системе. Рис. 1. Устройство Linux 2 Процесс - это объект ОС Linux, который состоит из адресного пространства памяти и набора структур данных. По сути, процесс это запущенная программа или служба. Каждый запущенный процесс в ОС Linux может породить дополнительные процессы. Процесс, запустивший новый процесс называется родительским процессом. Новый процесс по отношению к создавшему его процессу называется дочерним. Процессы - это не то же самое, что задачи: процессы являются частью операционной системы, тогда как о задачах известно только командному процессору, в котором они вы- полняются. Работающая программа заключает в себе один или более процессов; задача со- стоит из одной или более программ, выполняемых в виде команд командного процессора. Каждый процесс в ОС Linux характеризуется набором атрибутов, который отличает данный процесс от всех остальных процессов. К таким атрибутам относятся: * Идентификатор процесса (PID) . Каждый процесс в системе имеет уникальный идентификатор. Каждый новый запущенный процесс получает номер на единицу больше предыдущего. * Идентификатор родительского процесса (PPID). Данный атрибут процесс полу- чает во время своего запуска и используется для получения статуса родительского процесса. * Реальный и эффективный идентификаторы пользователя (UID, EUID) и груп- пы (GID, EGID). Данные атрибуты процесса говорят о его принадлежности к кон- кретному пользователю и группе. Реальные идентификаторы совпадают с иденти- фикаторами пользователя, который запустил процесс, и группы, к которой он при- надлежит. Эффективные - от чьего имени был запущен процесс. Права доступа процесса к ресурсам ОС Linux эффективными идентификаторами. Если на испол- няемом файле программы установлен специальный бит SGID или SUID, то процесс данной программы будет обладать правами доступа владельца исполняемого фай- ла. Для управления процессом (например, kill) используются реальные идентифи- каторы. Все идентификаторы передаются от родительского процесса к дочернему. Для просмотра данных атрибутов можно воспользоваться командой ps , задав жела- емый формат отображения колонок. * Приоритет или динамический приоритет (priority) и относительный или стати- ческий (nice) приоритет процесса. Статический приоритет или nice-приоритет лежит в диапазоне от -20 до 19, по умолчанию используется значение 0. Значение – 20 соответствует наиболее высокому приоритету, nice-приоритет не изменяется планировщиком, он наследуется от родителя или его указывает пользователь. Ди- намический приоритет используется планировщиком для планирования выполне- ния процессов. Этот приоритет хранится в поле prio структуры task_struct процесса. Динамический приоритет вычисляется исходя из значения параметра пicе для дан- ной задачи путем вычисления надбавки или штрафа, в зависимости от интерактив- ности задачи. Пользователь имеет возможность изменять только статический прио- ритет процесса. При этом повышать приоритет может только root. В ОС Linux су- ществуют две команды управления приоритетом процессов: nice и renice. * Состояние процесса. В ОС Linux каждый процесс обязательно находится в одном из перечисленных ниже состояний и может быть переведен из одного состояния в другое системой или командами пользователя. Различают следующее состояния процессов: o TASK_RUNNING — процесс готов к выполнению или выполняется (runnable). Обозначается символом R. o TASK_INTERRUPTIBLE - ожидающий процесс (sleeping). Данное состояние означает, что процесс инициализировал выполнение какой-либо системной операции и ожидает ее завершения. К таким операциям относятся ввод/вывод, завершение дочернего процесса и т.д. Процессы с таким состоянием обознача- ются символом S. 3 o TASK_STOPPED - выполнение процесса остановлено (stopping). Любой процесс можно остановить. Это может делать как система, так и пользователь. Состоя- ние такого процесса обозначается символом Т. o TASK_ZOMBIE - завершившийся процесс (zombie). Процессы данного состоя- ния возникают в случае, когда родительский процесс, не ожидая завершения дочернего процесса, продолжает параллельно работать. Процессы с таким со- стоянием обозначаются символом Z. Завершившиеся процессы больше не вы- полняются системой, но по-прежнему продолжают потреблять ее не вычисли- тельные ресурсы. o TASK_UNINTERRUPTIBLE -непрерываемый процесс (uninterruptible). Процес- сы в данном состоянии ожидают завершения операции ввода-вывода с прямым доступом в память. Такой процесс нельзя завершить, пока не завершится опе- рация ввода/вывода. Процессы с таким состоянием обозначаются символом D. Состояние аналогично TASK_INTERRUPTIBLE, за исключением того, что процесс не возобновляет выполнение при получении сигнала. Используется в случае, когда процесс должен ожидать беспрерывно или когда ожидается, что некоторое событие может возникать достаточно часто. Так как задача в этом состоянии не отвечает на сигналы, TASK_UNINTERRUPTIBLE используется менее часто, чем TASK_INTERRUPTIBLE. Каждый процесс выполняется в собственной виртуальной памяти, в которую никакой другой процесс вмешаться не может. Этим и обеспечивается устойчивость всей системы. Таблица процессов С точки зрения ядра процесс представляет собой запись в таблице процессов. Запись в таблице процессов и пространство процесса вместе составляют контекст, или окружение, процесса. В него входят: PID — идентификатор процесса. PPID — идентификатор родительского процесса. TTY — имя управляющего терминала - терминала, с которого запущен процесс. WD — текущий каталог процесса, от которого отсчитываются относительные пути. RID, RGID — реальные ID и групповой ID пользователя, запустившего процесс. EUID, EGID — эффективные ID и GID. NICE — показатель уступчивости. Чем выше показатель уступчивости, тем ниже приоритет. Категории процессов Процессы делятся на три категории: Системные процессы - являются частью ядра и всегда расположены в оперативной памяти. Системные процессы не имеют соответствующих им программ в виде испол- няемых файлов и запускаются при инициализации ядра системы. Выполняемые ин- струкции и данные этих процессов находятся в ядре системы, таким образом, они мо- гут вызывать функции и обращаться к данным, недоступным для остальных процес- сов. Системными процессами, например, являются: shed (диспетчер свопинга), vhand (диспетчер страничного замещения), kmadaemon (диспетчер памяти ядра). Демоны - это неинтерактивные процессы, которые запускаются обычным образом — путем загрузки в память соответствующих им программ (исполняемых файлов), и вы- полняются в фоновом режиме. Обычно демоны запускаются при инициализации си- стемы (но после инициализации ядра) и обеспечивают работу различных подсистем: системы терминального доступа, системы печати, с истемы сетевого доступа и сете- вых услуг, почтовый сервер, dhcp-сервер и т. п. Демоны не связаны ни с одним поль- зовательским сеансом работы и не могут непосредственно управляться пользовате- лем. Большую часть времени демоны ожидают пока тот или иной процесс запросит определенную услугу, например, доступ к файловому архиву или печать документа. 4 Прикладные (пользовательские) процессы. К прикладным процессам относятся все остальные процессы, выполняющиеся в системе. Как правило, это процессы, порож- денные в рамках пользовательского сеанса работы. Например, команда ls породит со- ответствующий процесс этого типа. Важнейшим прикладным процессом является ко- мандный интерпретатор (shell), который обеспечивает вашу работу в LINUX. Он за- пускается сразу же после регистрации в системе. Прикладные процессы могут выпол- няться как в интерактивном, так и в фоновом режиме, но в любом случае время их жизни (и выполнения) ограничено сеансом работы пользователя. При выходе из си- стемы все прикладные процессы будут уничтожены. 2. Сценарии в Linux. Активные и фоновые процессы. Исполняемые файлы в Linux бывают двух видов. Первый – это файлы в собственно исполняемом (executable) формате. Как правило, такие файлы – результат компиляции программ, написанных на одном из языков программирования. Второй вид исполняемых файлов – сценарии. Сценарий – это текстовый файл, предназначенный для обработки какой-нибудь утилитой. Чаще всего такая утилита – это интерпретатор некоторого языка программирования, а содержимое такого файла – программа на этом языке. Запустить сценарий на исполнение можно командой sh имя_сценария Для того чтобы запустить процесс сценария параллельно, достаточно добавить в конец командной строки символ "&": sh имя_сценария& Процесс, запускаемый параллельно, называется фоновым (background). Активный процесс, foreground process - процесс, имеющий возможность вводить данные с терминала. В каждый момент у каждого терминала может быть не более одного активного процесса. Фоновый процесс, background process - процесс, не имеющий возможности вводить данные с терминала. Пользователь может запустить любое, но не превосходящее заранее заданного в системе, число фоновых процессов. 3. Команды для управления процессами в Linux Моментальный снимок протекающих в системе процессов можно посмотреть с помощью команды ps (process status). Без аргументов она покажет список процессов, связанных с текущей консолью (или виртуальным терминалом). Список возможных ключей команды можно, как обычно, получить по команде ps –help: -р < список_PID> : только процессы с указанными ID; -u < список_USERID > : только процессы, запущенные указанными пользователями; -е : все процессы в системе; -f : полная форма вывода; -Н : вывод иерархии процессов в форме дерева. Представление о динамике процессов дает команда top. Она выводит список процессов, отсортированный по количеству занятой памяти или использованного процессорного времени, и обновляет его через указанные промежутки времени (по умолчанию через каждые 3 секунды). Команда bg (back ground), запускает в фоне последний остановленный процесс. Команды запуска процессов Команда nice используется для запуска еще не запущенных процессов с заданным приорите- том. Команда renice используется для изменения приоритета уже запущенных процессов. Для просмотра запущенных процессов в ОС Linux используются утилиты top - Вывести список процессов 5 ps - Интерактивно наблюдать за процессами (в реальном времени) uptime - Посмотреть загрузку системы w - Вывести список активных процессов для всех пользователей free - Вывести объем свободной памяти pstree - Отображает все запущенные процессы в виде иерархии К командам управления процессами относятся команды nice и renice , описанные выше, а также: kill - Завершить процесс (или послать ему сигнал). pkill - Отправка сигнала процессу по имени или другому атрибуту. killall - Завершить процесс по имени. pgrep - Просматривает запущенные процессы, и выводит на стандартный вывод спи- сок идентификаторы процессов, которые соответствуют критериям отбора. Все кри- терии должны совпадать. sleep - Приостанавливает выполнение на заданное ЧИСЛО секунд. fuser - Определенея того, какой процесс держит открытым какой-то файл или сокет. Команда kill посылает сигнал процессу с указанным идентификатором (pid). Используется в следующей форме: kill [-номер] pid Здесь pid – это идентификатор процесса, которому посылается сигнал, а номер – номер сиг- нала, который посылается процессу. Послать сигнал (если у вас нет полномочий суперполь- зователя) можно только процессу, у которого эффективный идентификатор пользователя совпадает с идентификатором пользователя, посылающего сигнал. Если параметр –номер отсутствует, то посылается сигнал SIGTERM, обычно имеющий номер 15, и реакция на него по умолчанию – завершить работу процесса, который получил сигнал. (побробнее см. kill .) Чтобы завершить какой-нибудь процесс, нужно послать ему сигнал с помощью команды kill. Для этого необходимо узнать Pid процесса с помощью команды ps (например, Pid процесса равен 11839) и послать процессу сигнал на завершение, например сигнал SIGKILL: kill -9 11839 или kill –SIGKILL 11839 или kill –KILL 11839 Ход работы: 1. Загрузите операционную систему не root, а пользователем. 2. Найдите файл c образом ядра. Выясните по имени файла номер версии Linux. 3. Посмотрите процессы ps –f (с использованием man ps). 4. Напишите с помощью редактора vi два сценария loop и loop2. Текст сценариев: Loop: while true; do true; done Loop2: while true; do true; echo ‘Hello’; done 5. Запустите loop2 на переднем плане: sh loop2. 6. Остановите, послав сигнал STOP. 7. Посмотрите последовательно несколько раз ps –f. Запишите полученные сооб- щения, сделайте выводы. 8. Убейте процесс loop2, послав сигнал kill -9 PID. Запишите полученное сообще- ние. 9. Запустите в фоне процесс loop: sh loop&. Не останавливая, посмотрите несколько раз: ps –f. Запишите полученные значения, сделайте выводы. 10. Завершите процесс loop командой kill -15 PID. Запишите полученные значения, сделайте выводы. 6 11. Запустите в фоне процесс loop: sh loop&. Не останавливая завершите командой kill -9 PID. 12. Запустите еще один экземпляр оболочки: bash. 13. Запустите несколько процессов в фоне. Повторите несколько раз данную про- цедуру. Запишите результаты просмотра командой ps –f. 14. Выполните индивидуальное задание к работе. 15. Оформите отчет по лабораторной работе. Содержание отчета: 1. Титульный лист. 2. Название и цель работы. 3. Краткое теоретическое описание. 4. Результаты выполнения работы, выводы. Индивидуальные задания Задание состоит из двух частей: Часть I и Часть II. Часть I одинаковая для всех (выполнять всем вариантам), Часть II — четыре пункта заданий по вариантам. Часть I (выполняют все). 1) Запустить в консоли на выполнение три задачи, две в интерактивном режиме, одну - в фоновом. 2) Перевести одну из задач, выполняющихся в интерактивном режиме, в фоновый режим. 3) Провести эксперименты по переводу задач из фонового режима в интерактивный и наоборот. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли или используя команду script. Кратко поясните результаты выполнения команд. Часть II (выполнять по вариантам). Вариант 1. 1) Сгенерировать информацию — полный листинг о всех процессах системы. 2) Завершить выполнение двух процессов, владельцем которых является текущий пользователь. Первый процесс завершить с помощью сигнала SIGTERM, задав его имя, второй — с помощью сигнала SIGKILL, задав его номер. 3) Определить идентификаторы процессов, владельцем которых не является root. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 2. 1) Получить следующую информацию о процессах текущего пользователя: идентификатор и имя владельца процесса, статус и приоритет процесса. 2) Завершить выполнение двух процессов, владельцем которых является текущий пользователь. Первый процесс завершить с помощью сигнала SIGINT, задав его имя, второй — с помощью сигнала SIGQUIT, задав его номер. 3) Определить идентификаторы и имена процессов, идентификатор группы которых не равен идентификатору группы текущего пользователя. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. 7 Вариант 3. 1) Сгенерировать следующую информацию о m (m>2) процессах системы, имеющих значение идентификатора больше заданного n: флаг — сведения о процессе, статус, PID, PPID, приоритет, использованное время и имя программы. 2) Завершить выполнение двух процессов, владельцем которых является текущий пользователь. Первый процесс завершить с помощью сигнала SIGKILL, задав его имя, второй — с помощью сигнала SIGINT, задав его номер. 3) Через символ « : » вывести идентификаторы процессов, для которых родителем является командный интерпретатор. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 4. 1) Сгенерировать следующую информацию — полный листинг в длинном формате о процессах текущего пользователя: PID, PPID, выделенное время ЦП, время запуска, размер образа. 2) С помощью сигнала SIGTSTP (используя комбинацию клавиш и команду kill) приостановить выполнение процесса, владельцем которого является текущий пользователь. Через несколько секунд возобновить выполнение процесса. 3) Определить идентификатор и имя процесса, созданного последним пользователем root. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 5. 1) Отобразить информацию о процессах указанного пользователя в виде иерархии, вывод отсортировать по значениям PID. 2) С помощью сигнала SIGSTOP приостановить выполнение процесса, владельцем которого является текущий пользователь. Через несколько секунд возобновить выполнение процесса. 3) Определить идентификаторы и имена процессов, не связанных с указанным терминалом. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 6. 1) Отобразить информацию о процессах, начиная с указанного идентификатора, с выделением цветом текущего процесса и его предков. 2) Завершить выполнение процесса, владельцем которого является текущий пользователь, с помощью сигнала SIGINT двумя способами: задав имя сигнала и используя комбинацию клавиш. 3) Запустите редактор nano, определите приоритет редактора. Запустите новый процесс данного редактора с увеличенным на 2 значением приоритета. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 7. 1) Вывести информацию о состоянии процессов системы в реальном режиме с обновлением один раз в 5 секунд. Отсортировать вывод по идентификатору пользователя по возрастанию и убыванию. 8 2) Завершить выполнение процесса, владельцем которого является текущий пользователь, с помощью сигнала SIGQUIT двумя способами: задав имя сигнала и используя комбинацию клавиш. 3) Измените на 2 единицы приоритет процесса, запущенного из командного интерпретатора. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 8. 1) Сохранить в файл мгновенное состояние процессов системы указанного пользователя. 2) Послать сигнал SIGINT (по имени и по номеру сигнала) всем процессам, запущенным командой vi. Сообщить, успешно ли был послан сигнал. 3) Измените на 3 единицы приоритеты процессов, владельцем которых является текущий пользователь. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 9. 1) Отобразить информацию о трех заданных процессах в реальном режиме, одному из процессов переназначить приоритет, не выходя из команды. 2) Послать сигнал на безусловное завершение (по имени и по номеру сигнала) процессу по его имени, установить подтверждение завершения. 3) Выведите статистику работы системы с момента последней загрузки. 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. Вариант 10. 1) Вывести информацию о состоянии процессов системы в реальном режиме с сортировкой по PID. Завершить один из процессов, владельцем которого является текущий пользователь, не выходя из команды. 2) С помощью сигнала SIGKILL завершить самый новый процесс, владельцем которого является текущий пользователь. 3) Определите информацию о работающем в системе пользователе (имя, время входа в систему, время простоя и т.д.). 4) В отчете предоставьте все шаги ваших действий путем копирования с консоли. Кратко поясните результаты выполнения всех команд. |