Главная страница
Навигация по странице:

  • Справочная информация Работу ОС UNIX можно представить в виде функционирования множества взаимосвязанных процессов. 1.ОПРЕДЕЛЕНИЕ ПРОЦЕССА

  • Атрибут процесса Назначение атрибута

  • 4. ПЛАНИРОВАНИЕ ПРОЦЕСС

  • КОМАНДЫ ДЛЯ РАБОТЫ С ПРОЦЕССАМИ

  • Команда Назначение команды Использование команды top

  • 8. МЕХАНИЗМЫ МЕЖПРОЦЕССНОГО ВЗАИМОДЕЙСТВИЯ

  • ПЕРЕДНИЙ ПЛАН И ФОНОВЫЙ РЕЖИМ

  • Перевод заданий в фоновый режим и уничтожение заданий

  • Приостановка и продолжение работы заданий

  • Лабораторная работа 8 работа в ос unix основы управления процессами


    Скачать 214.5 Kb.
    НазваниеЛабораторная работа 8 работа в ос unix основы управления процессами
    Дата21.05.2020
    Размер214.5 Kb.
    Формат файлаdoc
    Имя файлаlab8.doc
    ТипЛабораторная работа
    #124482


    Операционные системы

    Лабораторная работа №8
    РАБОТА В ОС UNIX: ОСНОВЫ УПРАВЛЕНИЯ ПРОЦЕССАМИ.

    ПРОЦЕССЫ В ОС UNIX. МЕЖПРОЦЕССОРНОЕ ВЗАИМОДЕЙСТВИЕ
    ПОСРЕДСТВОМ СИГНАЛОВ И НЕИМЕНОВАННЫХ КАНАЛОВ


    Основой операционной системы UNIX является подсистема управления процессами. Вся функциональность операционной системы, в конечном счете, определяется выполнением тех или иных процессов. Практически все действия ядра имеют отношение к процессам, будь то обслуживание системного вызова, генерация сигнала, размещение памяти, обработка особых ситуаций, вызванных выполнением процесса или обеспечением услуг ввода/вывода по запросу прикладного процесса.
    Учебное задание №1

    Освоение основ управления процессами в базовой пользовательской среде UNIX
    Для освоения основ управления процессами в базовой пользовательской среде UNIX выполните следующее задание:

    1. Ознакомьтесь с теоретическим материалом.

    2. С помощью команды ls -lFa определите права доступа к утилите passwd (исполняемый файл /usr/bin/passwd). Определите, позволяют ли Ваши права доступа изменять Ваш пароль, какие команды нужно использовать для изменения Вашего пароля? Попробуйте изменить Ваши права на изменение пароля с помощью команды
      chmod u+s

    3. Освойте работу с командой top и основными ее командами (вывод справки, уничтожение процесса, вывод определенного числа процессов и т.д.).

    4. Освойте работу с командой ps. Попробуйте запускать ее с различными аргументами. Если вывод команды не помещается на экране, используйте команду more. С помощью утилиты ps просмотрите список процессов, используемых в настоящее время в системе. Просмотрите первые 15 процессов этого списка. Просмотрите последние 20 процессов этого списка. Ключи -c, -v, -j, -u изменяют формат вывода команды. Попробуйте выполнить команду ps с каждым из этих ключей. Результаты сохраните в соответствующих файлах.

    5. Выведите в файл ps1.txt информацию обо всех процессах, запущенных в данный момент, связанных и не связанных с какими-либо терминалами. Вывод осуществить с сортировкой.

    6. Просмотрите файл ps1.txt с постраничным выводом.

    7. Выведите в файл отчета (ps2.txt) следующую информацию о запущенных Вами процессах: идентификатор процесса, терминал, идентификатор пользователя, приоритет, команда. Отсортировать по идентификатору процесса.

    8. Выведите в файл отчета информацию о процессах, запущенных пользователем root.

    9. Пошлите какому-либо процессу сигнал завершения (например, процессу sendmail, man и т.п.).

    10. Освойте работу с командами nice и renice.

    11. При помощи команд tty, w, uname, uptime выведите в файл info.txt имя текущего терминала, информацию о пользователях, работающих в системе, название и версию операционной системы, время работы системы.

    12. Просмотрите сигналы, используемые операционной системой, и их номера. Какой сигнал исполняется утилитой kill по умолчанию? Для каких сигналов нельзя изменить действия, установленные по умолчанию? Запустите в фоновом режиме утилиту, позволяющую записать список процессов, используемых в настоящее время в системе, в файл с именем myproc. Завершите работу этой утилиты с помощью посылки ей сигнала SIGTERM.

    13. Запустите несколько заданий (например, команд просмотра файлов less), возвращаясь в командную строку комбинацией клавиш Ctrl-Z и изучите действие команд jobs, fg, bg, kill, killall. Информацию об этих командах получите из электронного справочника man.

    14. Добавьте в начало файлов отчета строку с названием лабораторной работы, номером задания и Вашим именем.

    15. С помощью утилиты ps запишите в файл my_ps.txt список процессов, используемых в настоящее время в системе.

    16. Разработайте скрипт, в котором реализуется какой-либо сложный алгоритм поиска по файлу my_ps.txt, созданному в предыдущем пункте задания.

    17. Посчитайте, сколько процессов запущено с данного терминала.

    18. Удалите все файлы и подкаталоги, созданные во время сеанса работа с командным интерпретатором системы UNIX.

    ------------------------------------------------------------------------------------------------------------------------
    Справочная информация
    Работу ОС UNIX можно представить в виде функционирования множества взаимосвязанных процессов.
    1.ОПРЕДЕЛЕНИЕ ПРОЦЕССА

    При описании общих свойств ОС в некотором общеупотребительном смысле часто применяют слова «программа» и «задание»: «…вычислительная система исполняет одну или несколько программ, ОС планирует задания, программы могут обмениваться данными и т. д.». При этом одни и те же слова обозначали и объекты в статическом состоянии, не обрабатывающиеся вычислительной системой (например, совокупность файлов на диске), и объекты в динамическом состоянии, находящиеся в процессе исполнения.

    Термины «программа» и «задание» предназначены для описания статических, неактивных объектов. Программа же в процессе исполнения является динамическим, активным объектом.

    Процесс – это задание в ходе его выполнения. Он представляет собой исполняемый образ программы, включающий отображение в памяти исполняемого файла, полученного в ходе компиляции, стек, код и данные библиотек, а также ряд структур данных ядра, необходимых для управления процессом. Выполнение процесса заключается в точном следовании замкнутому набору инструкций, который не передает управление набору инструкций другого процесса; он считывает и записывает информацию в раздел данных и в стек, но ему недоступны данные и стеки других процессов.

    ОС UNIX является многозадачной системой, поэтому в ней параллельно выполняется множество процессов, их выполнение планируется ядром. Несколько процессов могут быть экземплярами одной программы. Процессы взаимодействуют с другими процессами и с вычислительными ресурсами только посредством обращений к операционной системе, которая эффективно распределяет системные ресурсы между активными процессами.Любой процесс может запускать другие процессы. Таким образом, процессы в среде UNIX образуют иерархическую структуру. На вершине этой структуры находится процесс init, являющийся предком всех остальных процессов.
    2. АТРИБУТЫ ПРОЦЕССОВ

    С каждым процессом связан набор атрибутов, которые помогают системе контролировать выполнение процессов и распределять между ними ресурсы системы. В таблице 1 приведены основные атрибуты процессов ОсUNIX.

    Таблица 1

    Атрибут процесса

    Назначение атрибута

    Идентификатор процесса (process ID)

    Целое число, однозначно идентифицирующее процесс. Процесс с идентификатором 1 – это процесс init, который является предком любого другого процесса в системе и связан с каждым процессом. Процесс идентификатором 0 – это процесс свопинга (swapping), он создается "вручную" в результате загрузки системы.

    Идентификатор родительского процесса (parent process ID)

    Целое число, однозначно идентифицирующее родительский процесс.

    Идентификатор группы процессов (process group ID)

    Процессы могут объединяться в группы. Каждая группа обозначается идентификатором группы. Процесс, идентификатор которого совпадает с идентификатором группы, называется лидером группы

    Идентификатор сеанса (session ID)

    Каждая группа процессов принадлежит к сеансу. Сеанс связывает процессы с управляющим терминалом. Когда пользователь входит в систему, все создаваемые им процессы будут принадлежать сеансу, связанному с его текущим терминалом

    Программное окружение

    Это набор строк, заканчивающихся нулевым символом. Строки называются переменными окружения и имеют следующий формат:

    имя переменной = значение переменной

    Дескрипторы открытых файлов

    Дескриптор файла — некоторое число, которое используется для обращения к файлу. При запуске процесс наследует дескрипторы от родительского процесса

    Текущий рабочий каталог

    Это каталог, от которого система производит разрешение относительных имен

    Текущий корневой каталог

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

    Идентификаторы пользователя и группы

    С каждым процессом связаны действительные идентификаторы пользователя (real user ID) и группы (real group ID), совпадающие с соответствующими идентификаторами пользователя, запустившего процесс. Кроме того, с процессом связаны эффективные идентификаторы пользователя (effective user ID) и группы, определяющие права процесса в системе. Обычно, действительные и эффективные идентификаторы совпадают

    Приоритет (nice


    Значение nice ("дружелюбность") показывает готовность процесса уступить свое процессорное время другим процессам. Чем больше значение nice, тем ниже приоритет процесса


    3. ВЫПОЛНЕНИЕ ПРОЦЕССА

    Выполнение процесса осуществляется ядром системы. Подсистема управления процессами отвечает за синхронизацию процессов, взаимодействие процессов, распределение памяти и планирование выполнения процессов.

    Процесс в системе UNIX является объектом, создаваемым в результате выполнения системного вызова fork(). Каждый процесс, за исключением нулевого, порождается другим процессом в результате запуска операции fork(). Процесс, запустивший операцию fork(), называется родительским, а вновь созданный процесс – порожденным. Каждый процесс имеет одного родителя, но может породить много процессов. Ядро системы идентифицирует каждый процесс по его уникальному номеру –идентификатору процесса PID.

    Пользователь, транслируя исходный текст программы, создает исполняемый файл, который состоит из нескольких частей:

    • набора "заголовков", описывающих атрибуты файла;

    • текста программы;

    • представления на машинном языке данных, имеющих начальные значения при запуске программы на выполнение, и указания на то, сколько пространства памяти ядро системы выделит под неинициализированные данные, так называемые bss ("block started by symbol" – "блок, начинающийся с символа");

    • некоторых других секций, таких как информация символических таблиц.

    Ядро загружает исполняемый файл в память при выполнении системной операции exec, при этом загруженный процесс состоит по меньшей мере из трех частей: текста, данных и стека. Области текста и данных соответствуют секциям текста и bss-данных исполняемого файла, а область стека создается автоматически и ее размер динамически устанавливается ядром системы во время выполнения.

    Процесс в системе UNIX может выполняться в двух режимах:

    • в режиме задачи процесс выполняет инструкции прикладной программы, системные структуры данных ему недоступны;

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


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

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

    Когда процесс запускает системную операцию exec, ядро системы выделяет области оперативной памяти (ОП) под новый процесс и освобождает области памяти вызывающего процесса. Если процесс запускает операцию fork, ядро удваивает размер адресного пространства процесса, позволяя новому и старому процессам совместно использовать области ОП, когда это возможно, и, с другой стороны, производя физическое копирование. Если процесс запускает операцию exit, ядро освобождает области, которые использовались процессом. На Рис.1 изображены информационные структуры, связанные с запуском процесса позволяющие процессам разделять области ОП.

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

    UNIX является системой разделения времени. Это означает, что каждому процессу вычислительные ресурсы выделяются на ограниченный промежуток времени, после чего они предоставляются другому процессу. Максимальный временной интервал, на который процесс может захватить процессор, называется временным квантом. Таким образом, создается иллюзия того, что процессы работают одновременно, хотя в действительности на однопроцессорной машине одновременно может выполняться только один процесс.


    Рис. 1. Системные структуры для разделения областей памяти между процессами

    4. ПЛАНИРОВАНИЕ ПРОЦЕССОВ

    Процессы предъявляют различные требования к системе с точки зрения их планирования и общей производительности. Можно выделить три основных класса приложений:

    • интерактивные приложения (командные интерпретаторы, редакторы и проч.). Большую часть времени они проводят в ожидании пользовательского ввода, но для них критично время отклика (реакции системы на ввод данных);

    • фоновые приложения (не требующие вмешательства пользователя). Основной показатель эффективности для них – минимальное суммарное время выполнения в системе;

    • приложения реального времени. Они обычно привязаны к таймеру и требуют гарантированного времени совершения той или иной операции и времени отклика.

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

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

    Выполнение процесса может быть прервано:

    • планировщиком процессов по истечении временного кванта или в том случае, если в очереди готовых к исполнению процессов есть процесс с более высоким приоритетом;

    • ядром системы, если процесс ожидает недоступного ресурса или окончания длительной операции ввода/вывода.

    В режиме ядра приоритет процесса повышается для того, чтобы его выполнение не могло быть прервано, так как это может привести к нарушению целостности структур данных ядра. Таким образом, выполнение системных вызовов осуществляется в непрерывном режиме (за исключением некоторых аппаратных прерываний).
    5. КОНТЕКСТ ПРОЦЕССА

    Под контекстом процесса понимается вся информация, необходимая для описания процесса. Контекст процесса состоит из нескольких частей:

    • адресное пространство процесса в режиме задачи (код, данные и стек процесса, а также разделяемая память и данные динамических библиотек);

    • управляющая информация (структуры proc и user – запись таблицы процессов и дополнительная информация соответственно);

    • окружение процесса (системные переменные, например, домашний каталог, имя пользователя и др.);

    • аппаратный контекст (значения используемых машинных регистров).

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

    При запуске процесса система исполняется в контексте процесса. Когда ядро системы решает запустить другой процесс, оно выполняет переключение контекста с тем, чтобы система исполнялась в контексте другого процесса. Выполняя переключение контекста, ядро сохраняет информацию, достаточную для того, чтобы позднее переключиться вновь на прерванный процесс и возобновить его выполнение.

    Аналогичным образом, при переходе из режима задачи в режим ядра, ядро системы сохраняет информацию, достаточную для того, чтобы позднее вернуться в режим задачи и продолжить выполнение с прерванного места. Следует отметить, что переход из режима задачи в режим ядра является сменой режима, но не переключением контекста. Ядро меняет режим выполнения с режима задачи на режим ядра и наоборот, оставаясь в контексте одного процесса.

    Ядро обрабатывает прерывания в контексте прерванного процесса, пусть даже оно и не вызывало никакого прерывания. Прерванный процесс мог при этом выполняться как в режиме задачи, так и в режиме ядра. Ядро сохраняет информацию, достаточную для того, чтобы можно было позже возобновить выполнение прерванного процесса, и обрабатывает прерывание в режиме ядра. Ядро не порождает и не планирует порождение какого-то особого процесса по обработке прерываний.

    Итак, понятие процесса характеризует некоторую совокупность набора исполняющихся команд, ассоциированных с ним ресурсов (выделенная для исполнения память или адресное пространство, стеки, используемые файлы, устройства ввода-вывода и т. д.) и текущего момента его выполнения (значения регистров, программного счетчика, состояние стека и значения переменных).

    Изменением состояния процессов занимается ОС, совершая операции над ними.

    Основные операции над процессами удобно объединить в три пары:

    • создание процесса – завершение процесса (одноразовые);

    • приостановка процесса (перевод из состояния «исполнение» в состояние «готовность») – запуск процесса (перевод из состояния «готовность» в состояние «исполнение»);

    • блокирование процесса (перевод из состояния «исполнение» в состояние «ожидание») – разблокирование процесса (перевод из состояния «ожидание» в состояние «готовность»).

    Следует отметить, что существует еще одна (непарная) операция – изменение приоритета процесса.

    У процесса выделяют следующие контексты:

    1. регистровый (содержимое всех регистров процессора);

    2. системный (запись в таблице процессов, управляющая информация о процессе и пр.);

    3. пользовательский (код и данные).

    Совокупность всех вышеуказанных контекстов называют просто контекстом процесса, в любой момент полностью характеризующим процесс.
    6. СОСТОЯНИЯ ПРОЦЕССА

    Время жизни процесса можно разделить на несколько состояний, каждое из которых имеет определенные характеристики, описывающие процесс. На рис. 1 показаны состояния, в которых процесс может находиться с момента создания до завершения выполнения:

    1. Процесс выполняется в режиме задачи. Процессор выполняет прикладные инструкции данного процесса.

    2. Процесс выполняется в режиме ядра. Процессор выполняет системные инструкции ядра ОС от имени процесса.

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

    4. Процесс приостановлен ("спит"). Процесс "впадает в сон", когда он не может больше продолжать выполнение, например, когда ждет завершения ввода-вывода или освобождения занятого ресурса.

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

    6. Процесс только что создан вызовом fork и находится в переходном состоянии: он существует, но не готов к запуску и не находится в состоянии сна.

    7. Процесс выполнил системный вызов exit и перешел в состояние "зомби". Как такового процесса не существует, но осталась запись с системной таблице процессов, содержащая код возврата и временную статистику, доступные для родительского процесса.

    Поскольку процессор в каждый момент времени выполняет только один процесс, в состояниях 1 и 2 на однопроцессорной машине может находиться самое большее один процесс.

    Процессы непрерывно переходят из состояния в состояние в соответствии с определенными правилами. Диаграмма переходов (см. рис.1) представляет собой ориентированный граф. Вершинами этого графа являются состояния, в которые может перейти процесс, а дугами – события, которые стали причинами перехода процесса из одного состояния в другое. Переход между двумя состояниями разрешен, если существует дуга из начального состояния в конечное. Несколько дуг может выходить из одного состояния, однако процесс переходит только по одной из них в зависимости от того, какое событие произошло в системе.

    В режиме разделения времени может выполняться одновременно несколько процессов, и все они могут одновременно работать в режиме ядра. Если им разрешить свободно выполняться в режиме ядра, то они могут испортить глобальные информационные структуры, принадлежащие ядру. Запрещая произвольное переключение контекста и управляя возникновением событий, ядро защищает свою целостность. Ядро разрешает переключение контекста только тогда, когда процесс переходит из состояния "запуск в режиме ядра" в состояние "сна в памяти". Процессы, запущенные в режиме ядра, не могут быть выгружены другими процессами; поэтому иногда говорят, что ядро невыгружаемо, при этом процессы, находящиеся в режиме задачи, могут выгружаться системой. Ядро поддерживает целостность своих информационных структур, поскольку оно невыгружаемо, таким образом решая проблему "взаимного исключения" – обеспечения того, что критические секции программы выполняются в каждый момент времени в рамках самое большее одного процесса.


    Рисунок 2. Состояния процесса и переходы между ними



    1. КОМАНДЫ ДЛЯ РАБОТЫ С ПРОЦЕССАМИ


    Основные команды для работы с процессами приведены в табл.2.

    Таблица 2

    Команда

    Назначение команды

    Использование команды

    top

    Консольная команда, которая выводит список работающих в системе процессов и информацию о них. По умолчанию она в реальном времени сортирует их по нагрузке на процессор

    Чтобы выйти из программы top, необходимо нажать клавишу [q].

    Полезные интерактивные команды, которые можно использовать в top:

    • [Пробел] – немедленно обновить содержимое экрана;

    • [h] – вывести справку о программе;

    • [k] – уничтожить процесс. Программа запрашивает у вас код процесса и сигнал, который будет ему послан;

    • [n] – изменить число отображаемых процессов. Вам предлагается ввести число;

    • [u] – сортировать по имени пользователя;

    • [M] – сортировать по объёму используемой памяти;

    • [P] – сортировать по загрузке процессора.

    ps [-axewjlu]
    [-o формат]
    [-U пользователь]
    [-p pid]



    Выводит список и статус процессов работающих в системе. Без аргументов выводит список процессов текущего пользователя, подключенных к терминалу, в текущей сессии

    Значения параметров следующие:

    -a – вывести информацию о процессах всех пользователей;

    -x – вывести информацию о процессах, не подключенных к терминалу;

    -e – вывести значения переменных окружения процесса;

    -w – использовать строки длиной 132 символа. Если указан несколько раз, то строки не обрезаются совсем;

    -j, -l, -u – меняют формат вывода информации;

    -U пользователь – вывести информацию о процессах указанного пользователя;

    -p pid – вывести информацию о процессе с указанным идентификатором.

    Наиболее часто в ОС FreeBSD команда ps применяется так: ps -auxw

    -o – формат вывести информацию в указанном формате. Значение формата для параметра -o является списком из следующих ключевых слов, разделенных запятыми (без пробелов):

    сommand – командная строка и аргументы,

    nice – уровень nice (приоритет),

    pgid – идентификатор группы процессов,

    pid – идентификатор процесса

    ppid – идентификатор родительского процесса,

    rgid, ruid – реальные идентификаторы группы и пользователя,

    uid – реальный идентификатор пользователя,

    tty – управляющий терминал

    kill [-s signal| -signal] pid


    Посылает сигнал указанному процессу

    Если значение сигнала опущено, предполагается SIGTERM.

    signal — символическое имя сигнала без префикса SIG, либо номер сигнала.

    Пример: kill -HUP 172 — послать сигнал SIGHUP процессу с идентификатором 172.

    nice [-nice] команда
    [аргументы]


    Выполняет команду с меньшим приоритетом

    Если nice не задан, то предполагается 10. Значение nice может быть от -20 (наивысший приоритет) до 20 (наименьший приоритет). Отрицательные числа задаются как –nice. Увеличение приоритета может выполнить только суперпользователь.

    Пример:

    nice -10 john users — запустить программу john с пониженным приоритетом.


    8. МЕХАНИЗМЫ МЕЖПРОЦЕССНОГО ВЗАИМОДЕЙСТВИЯ
    Для повышения эффективности функционирования вычислительной системы обеспечивают два вида взаимодействия процессов:

    • псевдопараллельное (исполнение на одной вычислительной системе);

    • параллельное (исполнение на разных вычислительных системах).

    Существуют различные причины кооперации процессов:

    • повышение скорости работы (один процесс в ожидании, другой – выполняет полезную работу, направленную на решение общей задачи);

    • совместное использование данных (использование различными процессами одной и той же динамической базы данных или разделяемого файла);

    • модульная конструкция какой-либо системы (например, микроядерный способ построения ОС, когда взаимодействие процессов осуществляется путем передачи сообщений через микроядро);

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

    Различают два вида процессов:

    • кооперативные (влияют на взаимное поведение путем обмена информацией);

    • независимые (деятельность процессов остается неизменной при любой принятой информации).

    UNIX имеет большое число механизмов межпроцессного взаимодействия. По объему передаваемой информации и степени возможного воздействия на поведение другого процесса все средства такого обмена можно разделить на три категории

        1. сигналы;

        2. каналы;

        3. разделяемая память.

    Различают два способа адресации при обмене информацией между процессами:

    • прямой – процессы осуществляют операции обмена данными, явно указывая имя или номер этих процессов;

    • непрямой – данные помещаются передающим процессом в некоторый промежуточный объект для хранения данных с адресом, откуда они затем могут быть изъяты каким-либо другим процессом.

    Прямая адресация может быть двух типов:

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

    • асимметричная – только один из взаимодействующих процессов указывает имя своего партнера по кооперации, а второй процесс в качестве возможного партнера рассматривает любой процесс в системе.


    СИГНАЛЫ

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

    Сигналы используются в основном для обработки исключительных ситуаций. Процесс может определять действия, выполняемые при поступлении сигнала, блокировать сигналы, посылать сигналы другим процессам. Существует более тридцати различных сигналов, основные из них приведены в табл. 3.
    Таблица 3

    Сигнал

    Назначение сигнала

    SIGCHLD

    Сигнал о завершении дочернего процесса

    SIGHUP

    Сигнал освобождения линии. Посылается всем процессам, подключенным к управляющему терминалу при отключении терминала. Многие демоны при получении данного сигнала заново просматривают файлы конфигурации и перезапускаются

    SIGINT

    Сигнал посылается всем процессам сеанса, связанного с терминалом, при нажатии пользователем клавиши прерывания
    (CTRL-C)

    SIGTERM

    Сигнал приводит к немедленному прекращению работы получившего сигнал процесса

    SIGKILL

    Сигнал приводит к немедленному прекращению работы получившего сигнал процесса. В отличие от SIGTERM процесс не может блокировать и перехватывать данный сигнал

    SIGSEGV

    Сигнал посылается процессу, если тот пытается обратиться к неверному адресу памяти

    SIGSTOP

    Сигнал, приводящий к остановке процесса. Для отправки сигнала SIGSTOP активному процессу текущего терминала можно воспользоваться комбинацией клавиш (CTRL-Z)

    SIGCONT

    Сигнал, возобновляющий работу остановленного процесса

    SIGUSR1,SIGUSR2

    Сигналы, определяемые пользователем

    SIGALRM

    Сигнал отправляется при срабатывании таймера, ранее установленного системными вызовами alarm(2) или settime(2)

    SIGPWR

    Сигнал генерируется при угрозе потери питания (обычно при переходе на источник бесперебойного питания UPS)

    SIGPIPE

    Сигнал посылается при попытке записи в канал или сокет, получатель данных которого завершил выполнение.


    Для того, чтобы отправить процессу сигнал можно использовать команду kill. Для того, чтобы процесс мог отправить сигнал другому процессу необходимо, чтобы эффективные идентификаторы пользователя у посылающего процесса и у процесса получателя совпадали. Процессы с эффективным идентификатором пользователя равным нулю могут посылать сигналы любым процессам.
    КАНАЛЫ

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

    Следует выделить две различные модели передачи данных по каналам связи:

    • с использованием потока ввода-вывода; при этом не важна структура данных, не осуществляется их интерпретация; процесс, прочитавший 100 байт из линии связи, не знает, были ли они переданы одновременно, пришли от одного или от разных процессов; примером такой модели является «pipe» (пайп или канал);

    • посредством сообщений; при этом на передаваемые данные налагается некоторая структура, весь поток информации разделяется на отдельные сообщения, вводя между данными, по крайней мере, границы сообщений.

    Часто возникает ситуация когда два процесса последовательно обрабатывают одни и те же данные. Для обеспечения передачи данных от одного процесса к другому в подобных ситуациях используются программные каналы. Программный канал (pipe) служит для установления связи, соединяющей один процесс с другим. Запись данных в канал и чтение из него осуществляются при помощи системных вызовов write и read, т.е. работа с каналами аналогична работе с файлами. Для создания программного канала используется системный вызов pipe. Вызов возвращает два дескриптора файлов, первый из которых открыт для чтения из канала, а второй для записи в канал.

    Наиболее простой вариант пайпа (канала) – неименованный канал создает оболочка Unix (например, bash) между программами, запускаемыми из командной строки, разделенными символом «|».

    Например, командная строка

    dmesg | less

    создает канал от программы dmesg к less, выводящей отладочные сообщения ядра, к программе постраничного просмотра less.

    Еще один пример использования канала при организации конвейера: при выполнении команды:

    find /usr/bin -name a* | sort

    создается канал, команда find выводит в него результаты своей работы, а команда sort считывает из этого канала данные для сортировки. Главным недостатком программных каналов является то, что они могут использоваться только для связи процессов имеющих общее происхождение (напр., родительский процесс и его потомок). Другой недостаток– ограниченное время существования канала (программные каналы уничтожаются после завершения обращающегося к ним процесса).
    Именованные каналы идентичны программным в отношении записи и чтения данных, но они являются объектами файловой системы. Именованный канал имеет имя, владельца и права доступа. Открытие и закрытие именованного канала осуществляется как открытие и закрытие любого файла, но при чтении и записи он ведет себя аналогично каналу.
    РАЗДЕЛЯЕМАЯ ПАМЯТЬ

    При использовании процессами разделяемой памяти совместно используется некоторая область адресного пространства, формируемая ОС. Этот способ обмена информацией представляет собой наиболее быстрый способ взаимодействия процессов в одной вычислительной системе, но требует при использовании повышенной осторожности.
    ПЕРЕДНИЙ ПЛАН И ФОНОВЫЙ РЕЖИМ
    Задания могут быть либо на переднем плане (foreground), либо быть фоновыми (background). На переднем плане в любой момент времени может быть только одно задание. Задание на переднем плане – это задание, с которым происходит взаимодействие пользователя; оно получает ввод с клавиатуры и посылает вывод на экран (если ввод или вывод не перенаправили куда-либо еще). Фоновые задания не получают ввода с терминала; как правило, такие задания не нуждаются во взаимодействии с пользователем.

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

    Задания также можно (временно) приостанавливать (suspend). Затем приостановленному заданию можно дать указание продолжать работу на переднем плане или в фоновом режиме. При возобновлении исполнения приостановленного задания его состояние не изменяется – задание продолжает выполняться с того места, где его остановили.

    Прерывание задания – действие отличное от приостановки задания. При прерывании (interrupt) задания процесс погибает. Прерывание заданий обычно осуществляется нажатием соответствующей комбинации клавиш, обычно это Ctrl-C. Восстановить прерванное задание никаким образом невозможно. Следует также знать, что некоторые программы перехватывают команду прерывания, так что нажатие комбинации клавиш Ctrl-C может не прервать процесс немедленно. Это сделано для того, чтобы программа могла уничтожить следы своей работы прежде, чем она будет завершена. На практике некоторые программы прервать таким способом нельзя.
    Перевод заданий в фоновый режим и уничтожение заданий

    Пример.

    Рассмотрим команду yes, которая посылает бесконечный поток строк, состоящих из символа «y», в стандартный вывод:

    $ yes

    (здесь символ $ является приглашением командной оболочки операционной системы к вводу команды в командной строке).

    Последовательность строк

    y

    y

    y

    y

    y

    будет бесконечно продолжаться.

    Уничтожить этот процесс можно нажатием клавиши прерывания, которая обычно является комбинацией Ctrl-C. Поступим теперь иначе. Чтобы на экран не выводилась эта бесконечная последовательность перенаправим стандартный вывод команды yes на /dev/null. Устройство /dev/null действует как «черная дыра»: все данные, посланные в это устройство, пропадают. С помощью этого устройства очень удобно избавляться от слишком обильного вывода некоторых программ

    $ yes > /dev/null

    Теперь на экран ничего не выводится. Однако и приглашение командной оболочки также не возвращается. Это происходит потому, что команда yesвсе еще работает и посылает свои сообщения, состоящие из букв yна /dev/null. Уничтожить это задание также можно нажатием клавиш прерывания.

    Допустим теперь, что необходимо, чтобы команда yesпродолжала работать, но при этом и приглашение командной оболочки должно вернуться на экран. Для этого можно команду yesперевести в фоновый режим, и она будет там работать, не общаясь с терминалом.

    Один способ перевести процесс в фоновый режим – приписать символ «к концу команды. Например:

    $ yes > /dev/null &

    [1] 164+

    $

    Как видно, приглашение командной оболочки опять появилось. Однако, что означает «[1] 164»? И действительно ли команда yes продолжает работать? Сообщение «[1]» представляет собой номер задания (job number) для процесса yes. Командная оболочка присваивает номер задания каждому исполняемому заданию. Поскольку yesявляется единственным исполняемым заданием, ему присваивается номер 1. Число «164» является идентификационным номером, соответствующим данному процессу (PID), и этот номер также дан процессу системой. К процессу можно обращаться, указывая оба этих номера.

    Итак, теперь у нас есть процесс команды yes, работающий в фоне и непрерывно посылающий поток из букв y на устройство /dev/null. Для того, чтобы узнать статус этого процесса, нужно исполнить команду jobs, которая является внутренней командой оболочки:

    $ jobs

    [1]+ Running yes >/dev/null &-

    $

    Мы видим, что эта программа действительно работает. Для того, чтобы узнать статус задания, можно также воспользоваться командой ps, как это было показано выше.

    Для того, чтобы прервать работу задания, используется команда kill. В качестве аргумента этой команде дается либо номер задания, либо PID. В рассмотренном выше случае номер задания был 1, так что команда

    $ kill %1

    прервет работу задания. Когда к заданию обращаются по его номеру (а не PID), тогда перед этим номером в командной строке нужно поставить символ процента.

    Теперь введем команду jobsснова, чтобы проверить результат предыдущего действия:

    $ jobs

    [1]+ Terminated yes >/dev/null

    $

    Фактически задание уничтожено, и при вводе команды jobs в следующий раз на экране о нем не будет никакой информации.

    Уничтожить задание можно также, используя идентификационный номер процесса (PID). Этот номер, наряду с идентификационным номером задания, указывается во время старта задания. В нашем примере значение PID было 164, так что команда

    $ kill 164

    эквивалентна команде

    $ kill %1

    При использовании PID в качестве аргумента команды killвводить символ «%» не требуется.
    Приостановка и продолжение работы заданий

    Рассмотрим еще один метод, с помощью которого процесс можно перевести в фоновый режим. Процесс запускается обычным образом (на переднем плане), затем приостанавливается командой stop, а потом запускается повторно в фоновом режиме.

    Запустим сначала процесс командой yesна переднем плане, как это делалось раньше

    $ yes > /dev/null

    Так как процесс работает на переднем плане, приглашение командной оболочки на экран не возвращается.

    Теперь вместо того, чтобы прервать задание комбинацией клавиш Ctrl-C, задание можно приостановить (suspend, буквально – «подвесить»). «Подвешенное» задание не будет уничтожено; его выполнение будет временно остановлено до тех пор, пока оно не будет возобновлено. Для приостановки задания надо нажать соответствующую комбинацию клавиш, обычно это Ctrl-Z

    $ yes > /dev/null

    {ctrl-Z}

    [1]+ Stopped yes >/dev/null

    $

    Приостановленный процесс попросту не выполняется. На него не тратятся вычислительные ресурсы процессора. Приостановленное задание можно запустить выполняться с той же точки, как будто бы оно и не было приостановлено.

    Для возобновления выполнения задания на переднем плане можно использовать команду fg(от слова «foreground» – передний план):

    $ fg

    yes >/dev/null

    Командная оболочка еще раз выведет на экран название команды, так что пользователь будет знать, какое именно задание он в данный момент запустил на переднем плане. Приостановим это задание еще раз нажатием клавиш Ctrl-Z, но в этот раз запустим его в фоновый режим командой bg(от слова «background» – фон). Это приведет к тому, что данный процесс будет работать так, как если бы при его запуске использовалась команда с символом «&» в конце:

    $ bg

    [1]+ yes &>/dev/null &

    $

    При этом приглашение командной оболочки возвращается. Сейчас команда jobsдолжна показывать, что процесс yesдействительно в данный момент работает; этот процесс можно уничтожить командой kill, как это делалось раньше.

    Для того, чтобы приостановить задание, работающее в фоновом режиме, нельзя пользоваться комбинацией клавиш Ctrl-Z. Прежде чем приостанавливать задание, его нужно перевести на передний план командой fgи лишь потом приостановить. Таким образом, команду fg можно применять либо к приостановленным заданиям, либо к заданию, работающему в фоновом режиме.

    Между заданиями в фоновом режиме и приостановленными заданиями есть большая разница. Приостановленное задание не работает и на него не тратятся вычислительные мощности процессора. Это задание не выполняет никаких действий. Приостановленное задание занимает некоторый объем оперативной памяти компьютера, хотя оно может быть перенесено в «своп». Напротив, задание в фоновом режиме выполняется, использует память и совершает некоторые действия, которые, возможно, требуются пользователю, но он в это время может работать с другими программами.

    Задания, работающие в фоновом режиме, могут пытаться выводить некоторый текст на экран. Это будет мешать работать над другими задачами. Например, если ввести команду

    $ yes &

    (стандартный вывод не был перенаправлен на устройство /dev/null), то на экран будет выводится бесконечный поток символов y. Этот поток невозможно будет остановить, поскольку комбинация клавиш Ctrl-C не воздействует на задания в фоновом режиме. Чтобы остановить эту выдачу, надо использовать команду fg, а затем уничтожить задание комбинацией клавиш Ctrl-C.

    Обычно командой fgи командой bg воздействуют на те задания, которые были приостановлены последними (эти задания будут помечены символом «+» рядом с номером задания, если ввести команду jobs). Если в одно и то же время работает одно или несколько заданий, задания можно помещать на передний план или в фоновый режим, задавая в качестве аргументов команды fgили команды bgих идентификационный номер (job ID). Например, команда

    $ fg %2

    помещает задание номер 2 на передний план, а команда

    $ bg %3

    помещает задание номер 3 в фоновый режим. Использовать PID в качестве аргументов команд fgи bgнельзя. Более того, для перевода задания на передний план можно просто указать его номер. Так, команда

    $ %2

    эквивалентна команде

    $ fg %2

    Важно помнить, что функция управления заданием принадлежит оболочке. Команды fg, bgи jobsявляются внутренними командами оболочки.


    написать администратору сайта