Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Demkin_otvety_New.doc
Скачиваний:
13
Добавлен:
17.04.2019
Размер:
3.22 Mб
Скачать
  1. Что такое конвейер (pipe)? Что такое именованный конвейер? Охарактеризуйте их. Как эти объекты можно использовать для взаимодействия программ (приведите несколько примеров)?

Конвейеры (PIPE)— это возможность нескольких программ работать совместно, когда выход одной программы непосредственно идет на вход другой без использования промежуточных временных файлов.

В программировании именованный канал или именованный конвейер (англ. named pipe) — расширение понятия конвейера в Unix и подобных ОС, один из методов межпроцессного взаимодействия. Это понятие также существует и в Microsoft Windows, хотя там его семантика существенно отличается. Традиционный канал — «безымянен», потому что существует анонимно и только во время выполнения процесса. Именованный канал — существует в системе и после завершения процесса. Он должен быть «отсоединён» или удалён когда уже не используется. Процессы обычно подсоединяются к каналу для осуществления взаимодействия между процессами.

Именованные каналы в Unix

Вместо традиционного, безымянного конвейера оболочки (англ. shell pipeline), именованный канал создаётся явно с помощью mknod или mkfifo, и два различных процесса могут обратиться к нему по имени.

Например, можно создать канал и настроить gzip на сжатие того, что туда попадает:

mkfifo pipe

gzip -9 -c < pipe > out

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

cat file > pipe

что приведёт к сжатию передаваемых данных gzip-ом.

Конвейер (pipe) - перенаправление ввода-вывода в Linux

В UNIX-подобных операционных системах пользователю открывается огромный простор для перенаправления ввода-вывода команд. Простым примером перенаправления является pipe (конвейер). Обозначается он символом “|”. Используется pipe следующим образом:  команда 1 | команда 2 | команда 3 ... При таком вызове все данные, которые при обычном запуске команды 1 выводились бы на экран будут поступать на стандартный ввод команды 2, как будто бы мы вводим эти данные с клавиатуры. Поясню на примере. Введите команду "ls -l /" (Без кавычек). Вы увидите как на экран будет выведено содержимое корневого каталога. Теперь давайте перенаправим вывод этой команды на ввод другой команды: grep, которая ищет во входных данных некоторое сочетание символов. Например, используем такую команду: "ls -l / | grep tmp". Объясню поподробнее что это значит: команда ls -l / Выведет содержимое корневого каталога (как мы убедились выше). Дальше данные поступают команде grep tmp, которая произведет поиск по входным данным (полученным из 1 команды). После чего команда grep выведет то, что нашла на экран (разумеется, это дело опять можно перенаправить). Что очень важно отметить, команды исполняются одновременно, то есть все, что поступает на вывод в первой программе немедленно поступает на вход второй, не дожидаясь завершения 1. Если проводить ассоциации с реальным миром, то можно представить pipe в виде длинной трубы, распооженной вертикально (что-то мне подсказывает, что разработчики системы преставляли себе это именно также, потому и выбрали такое название и символ |). В эту трубу некто (команда 1) сверху кидает яблоки (данные). Второй некто (команда 2) достает из трубы эти яблоки. Ширина трубы не позволяет яблакам менять порядок, то есть в каком порядке они были отправлены командой 1, в таком порядке они будут приняты командой 2. Скорости работы команд также могут различаться. В случае, если второй некто замешкается, яблоки будут оставаться в трубе, дожидаясь обработки. Если замешкается первый, то второй будет ждать поступления данных.

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

Виды параллельного взаимодействия

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

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

Взаимодействие c помощью передачи сообщений (например, в Erlang или occam). Обмен сообщениями может происходить асинхронно, либо c использованием метода «рандеву», при котором отправитель блокирован до тех пор, пока его сообщение не будет доставлено. Асинхронная передача сообщений может быть надёжной либо ненадёжной.

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

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

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

Недостатки: разделяемая память – меньшее быстродействие за счет пересылки данных;

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

Преимущества: разделяемая память – нет конфликта за счет локализации данных;

обмен сообщениями – большее быстродействие за счет копирования, а не пересылки данных.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]