Опубликован: 17.08.2006 | Доступ: свободный | Студентов: 5309 / 678 | Оценка: 4.49 / 3.94 | Длительность: 20:58:00
ISBN: 978-5-9556-0078-9
Лекция 16:

Взаимодействие процессов

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Аннотация: В этой лекции обсуждаются вопросы выполнения программ в многозадачной среде: пользовательские программы запускают на выполнение внешние программы, программы могут порождать параллельно выполняемые процессы, в рамках выполняемой программы может быть запущено несколько потоков управления. Все эти модели программирования поддерживаются языком Perl и будут рассмотрены в этой лекции. Цель лекции: познакомиться со средствами языка Perl, связанными с межпроцессным взаимодействием, и научиться применять их при разработке собственных программ на языке Perl, выбирая наиболее подходящую из моделей параллельного программирования.
Ключевые слова: операционная система, многозадачность, multitasking, компьютер, многопроцессорная система, запуск, out-of-process, ресурс, идентификатор процесса, identifier, PID, модуль ядра, операционный, процессор, подпроцесс, web-сервера, сервер приложений, базы данных, время выполнения, доступ, pipe, signaling, сокет, совместность, файл, средство межпроцессного взаимодействия, communications, IPC, synchronize, asynchronicity, механизм, perl, POSIX, Windows, основные средства, межпроцессное взаимодействие, управление процессами, программирование, апостроф, результатив, программа, поток, стандартный вывод, Linux, список, текущий каталог, контекст, system, Синхронный, код завершения, команда, суффикс, PL/I, строковый, аргумент функции, командный интерпретатор, exec, open-ended, поиск, перенаправление потока, ввод/вывод, командная строка, потоки данных, пароль, архив, Архиватор, сайт, загрузчик, конфигурация, основная программа, параметр, функция, fork, Unix, родительский процесс, дочерний процесс, неопределенное значение, параллельный процесс, значение, цикл вывода, ПО, вызов функции, порожденный процесс, waiting, B-канал, манипулятор, reader, передача данных, FIFO, SIG, идентификатор, сигнал прерывания, int, консоль, сочетания, ctrl, запрос-ответ, конфигурационный файл, ignore, default, длительность операции, отправка, kill, аргумент, истина, ложь, реакция, light-weighted process, потоки управления, thread, совместный доступ, разделяемые данные, контрол, DEC, Java, win32, перечисление, web-приложение, подключ, синоним, create, ссылка, анонимный, объект, l-r-типа, управление потоком, joining, вычисление, присоединение, объединение, TID, detachable, INTO-переменные, share, переменная, locking, выход, стандартные модули, queue, очередь, скалярная величина, enqueue, dequeue, pending, цикла, знание

Многозадачность

Современные операционные системы в том или ином виде поддерживают многозадачность (multitasking) даже на однопроцессорных компьютерах, не говоря уже о многопроцессорных системах. Операционная система (ОС) производит запуск системных и пользовательских программ в виде независимых процессов (process), выделяя для каждого из них отдельный участок оперативной памяти и другие ресурсы. Каждый процесс нумеруется своим уникальным числовым идентификатором процесса (Рrocess Identifier, PID). Специальные модули ядра операционной системы организуют переключение процессора на обслуживание выполняющихся программ, оптимизируя распределение между ними процессорного времени. При этом работающие процессы могут инициировать выполнение других процессов, порождать зависимые подпроцессы (subprocess) в отдельной области памяти или запускать подпроцессы в области памяти основного процесса. Примерами программ, основанных на использовании подпроцессов, могут служить различные серверные программы: почтовые и web-серверы, серверы приложений и баз данных.

Во время выполнения процессы могут взаимодействовать между собой различными способами. Они могут иметь доступ к разделяемой области памяти, организовывать программные каналы (pipe), посылать друг другу сигналы (signal), обмениваться данными через сокеты, совместно использовать файлы и применять другие средства межпроцессного взаимодействия (Inter-Process Communication, IPC). При этом часто один процесс ожидает окончания выполнения каких-либо действий в другом процессе: про такую ситуацию говорят, что процессы выполняются синхронно (synchronous), то есть согласованно. В других случаях требуется, чтобы процессы выполнялись асинхронно (asynchronous), то есть одновременно и независимо друг от друга. В определенный момент процесс может перейти от асинхронного выполнения к синхронному, то есть перейти в ожидание для синхронизации с другим процессом.

Реализация этих механизмов сильно зависит от конкретной операционной системы, поэтому некоторые стандартные средства языка Perl, связанные с управлением процессами, ориентированы на работу в определенном операционном окружении. Кроме того, имеются специализированные Perl-модули для работы с процессами в операционных системах, соответствующих стандарту POSIX, или в ОС MS Windows. Конечно, в этой лекции нам удастся обсудить только основные средства языка Perl, касающиеся обширной темы межпроцессного взаимодействия. Приводимые примеры намеренно сделаны максимально простыми, чтобы продемонстрировать основные подходы к управлению процессами, избегая особенностей, которыми изобилует многозадачное программирование.

Выполнение внешних программ

В Perl имеется операция выполнения программы, которая обозначается обратными апострофами (backticks) или синонимом - конструкцией qx(), упоминавшейся в "Текст, строки и символы" . Она предназначена для получения результатов выполнения внешней программы. Эта операция пытается выполнить любую внешнюю программу, ожидает окончания ее работы и возвращает то, что программа выводит в свой поток стандартного вывода. Например, так в операционных системах Linux или MS Windows можно выполнить команду dir, выводящую список файлов в текущем каталоге:

my $file_list = `dir`;   # в скалярном контексте
my @file_list = qx(dir); # в списочном контексте

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

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

use English; # использовать длинные имена спец. переменных

# в ОС MS Windows архивируем файлы с помощью pkzip 
if ($OSNAME =~ m/win/i) {
   system "pkzip", "-a", "pearls.zip", "*.pl";
# в ОС GNU/Linux архивируем файлы с помощью tar и gzip 
} elsif ($OSNAME =~ m/linux/i) {
   system "tar -cv *.pl | gzip > pearls.tar.gz";
}

При вызове с одним строковым аргументом функция system() использует для запуска командный интерпретатор операционной системы так же, как функции exec(), open() и операция qx(). При передаче ей нескольких аргументов она запускает внешнюю программу с помощью системного вызова (обращения к операционной системе). Чтобы обеспечить успешный поиск запускаемой программы, можно добавить каталог, где находится программа, в список путей поиска. Например, таким образом:

{ # временно помещаем каталог с программой в пути поиска 
   local $ENV{"PATH"} = $path_to_the_program; # каталог
   system($program_to_execute);       # вызов программы
} # значение $ENV{"PATH"} будет восстановлено

Выполнение внешних программ можно организовать с помощью функции open, если требуется обмениваться данными с этими программами, используя перенаправление потоков ввода-вывода. Для этого функции open() вместо имени файла передается командная строка с именем выполняемой программы и ее аргументами. Если нужно передать поток данных для обработки из Perl-программы в вызываемую программу, то перед командой указывается символ командного конвейера '|'. Как это делается, видно из очень простого примера, в котором случайным образом генерируются числовые пароли, а затем они направляются для сжатия в архив программой gzip:

# открываем выходной поток, направляем его внешней программе 
open my $archive, "| gzip > passwords.gz";
for (my $i = 1; $i <= 12; $i++) { # генерируем пароли 
   printf $archive "%06.0f\n", rand 999999;
}
close $archive; # закрываем выходной поток

Когда нужно принять выходной поток внешней программы для обработки в Perl-программе, то символ конвейера команд '|' ставится в конце командной строки:

# открываем входной поток, полученный от внешней программы 
open my $archive, "gzip -d < passwords.gz |";
while (my $line = <$archive>) { # читаем пароли из архива
   print $line;
}
close $archive; # закрываем выходной поток

(Используемый в примерах архиватор gzip распространяется свободно, версии для самых разных ОС доступны на сайте http://www.gzip.org.)

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Галина Башкирова
Галина Башкирова

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

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам

 

Константин Моренко
Константин Моренко
Марина Дайнеко
Марина Дайнеко
Россия, Moscow, Nope, 2008
Сергей Пантелеев
Сергей Пантелеев
Россия, Москва