Как программы общаются между собой
Уже очень давно программное обеспечение стало настолько масштабным, что его приходится разбивать на части. Каждая часть выполняет свою задачу, но как они общаются между собой? Как разные части системы получают сообщения друг от друга?
С развитием технологий, прошествием времени и увеличением масштабов ответить на этот вопрос становится всё сложнее.
Давайте совершим экскурс в историю и узнаем, как много было сделано и как мало изменилось.
Предупреждение: в статье я буду упрощать и жертвовать точностью ради понятности.
Простейший способ передачи сообщений между модулями программы, активно используемый сегодня — это передача аргументов . Давайте узнаем, что это такое.
Начнём с корней
Первые программы в 40-х и 50-х годах могли состоять из различных модулей, но после сборки они всё равно оставались единой программой, использовавшей оборудование целиком: всю память, все устройства ввода-вывода и CPU.

Да, корпус деревянный. Компьютер был не таким быстрым, чтобы рассеивание тепла стало какой-то проблемой… (фотография взята отсюда)
Ядро CPU имело набор регистров — ближайший физический аналог переменных: они имели имена, размер и были пронумерованы.
Для CPU всё представлялось в виде чисел, и именно их хранили все эти регистры. Каждое вычисление CPU могло выполнять считывание из одного или нескольких регистров, производить арифметические действия и выводить результат в один или несколько регистров.
Также CPU имели доступ к шине данных и адресной шине (это врата процессора в мир, в котором он живёт), а также могли копировать числа между регистрами и этими шинами. Именно так они и общались с остальными частями компьютера.
Абак (счёты) — прапрадедушка регистров
На этом уровне модули программы не имели роскоши использования параметров и методов. Их общение было основано на договорённости о том, чтобы помещать аргументы в определённый набор регистров, а потом передавать контроль над ними вызываемому модулю и ожидать, что он сохранит свой результат в некие регистры, откуда его можно получить.
Иногда, когда данные были слишком большими для регистров, в них сохранялся адрес памяти, где находились сами данные, но на этом функциональность машинного кода заканчивалась.
Когда программист вызывает функцию или метод в современном языке программирования, формируется машинный код, упорядочивающий аргументы в вышеупомянутые регистры и соединяющий регистры результата с возвращаемым значением.
А, ну и ещё есть много возни с областями видимости, чтобы модули не наступали друг другу на пятки на этой вечеринке глобального доступа, но это уже к обсуждаемой нами теме не относится.
Относится к ней следующее:
Разбиваем на этапы
Когда процессы становятся слишком большими для одной программы, их разбивают на отдельные программы. Каждая программа владеет одним этапом потока: программы-этапы могут считывать входные данные из хранилища и сохранять свои результаты в хранилище, чтобы их можно было использовать как входные данные для следующей программы в потоке. Так выглядела первая разновидность пакетной обработки.

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

А ещё все операторы были молодыми девушками! Куда они все подевались?
Процесс и многозадачность
В конце 50-х компьютеры постепенно начали превращаться в коммерческий продукт, однако они всё ещё были огромными дорогими машинами, принадлежащими организациям и государствам, поэтому их экономическая целесообразность определялась тем, умеют ли они работать со множеством программ одновременно, то есть многозадачностью.
Раньше программа запускалась (возможно, с какими-то аргументами), выполняла некие вычисления, выдавала результаты и завершалась, но теперь несколько программ должно было выполняться на одном оборудовании и, что самое важное, на одном CPU.
В результате возникла система разделения времени: каждая из запущенных программ по очереди получала в своё распоряжение ядро CPU, и этим процессом многозадачности управляла операционная система.

Рук может быть и много, но мозг всё равно один
Многозадачность (или параллелизм) позволила компьютеру выполнять несколько задач параллельно. Это создаёт иллюзию того, что всё происходит одновременно, однако в любой конкретный момент времени ядро CPU обрабатывает одну задачу, непрерывно переключаясь между ними.
Когда происходит такое переключение, ОС сохраняет значения из всех регистров, которые использует поставленный на паузу процесс, и загружает в них значения, сохранённые тогда, когда был поставлен на паузу следующий процесс. Это называется переключением контекста (context switching). Чем больше регистров используют процессы, тем более затратна эта операция.
Первые модели были кооперативными , то есть программы использовали время CPU ответственно: когда программы ожидали данные, они пропускали свой ход. Так как устройства ввода-вывода всегда были медленнее CPU, такое происходило часто.
Также программы распределяли свою работу тонким слоем и делали по одному шагу за раз, чтобы дать другим программам шанс поработать с CPU между своими блоками данных, ожидая от других процессов такого же поведения.
Очевидная слабость такой модели заключается в том, что если процесс по какой-то причине не освобождает CPU, то вся система может стать нестабильной.
Сигнал
Для решения этой проблемы в 70-х придумали сигналы, которые со временем развивались и становились совершеннее. К 80-м появилась вытесняющая модель разделения времени, делавшая распределение времени CPU более эффективным и справедливым.
Она требовала от процессов реагировать на сигналы, имевшие больший приоритет, чем их обычная работа. Использовались такие сигналы: pause, resume, abort, terminate, break и так далее, а также сигналы ошибок, например, недопустимого доступа или деления на ноль. Эти операционные сигналы означали одно и то же для всех процессов, позволяя ОС и процессу взаимодействовать.
Стоит отметить, что процесс — это не программа: его частью является операционная система с механизмами наподобие механизма принятия сигналов. Процесс всегда получает сообщение, а программа внутри него иногда знает о сигнале (например, SIGINT), а иногда нет (например, SIGKILL).
IPC — межпроцессный обмен сообщениями (локальный)
Большой недостаток потока, обёрнутого вокруг отдельных программ, — это затраты на процессы. Процесс обёртывает программу дополнительными механизмами, требует времени на создание, обменивается информацией с ОС, требует времени на подчистку после завершения.
Если бы можно было поддерживать функционирование и готовность процессов, то это сэкономило время, которое тратится на создание нового процесса и ожидание его готовности. Ценой этого будет занимаемая им память и переключение контекста, чтобы хранить его в ротации разделения времени даже в случае простоя. Когда нам нужен быстрый результат, чем больше и медленнее программа при инициализации, тем это оправданнее.
Чтобы эта модель работала, нам нужно как-то сообщить процессу, что есть работа, которую он должен выполнить.
▍ Опросы общей файловой системы
Опрос (polling) — это когда получатель регулярно проверяет наличие новых сообщений для себя.
Если программы договорились, что в какой-то папке общей файловой системы будет организована «доска объявлений», то они могут регулярно сканировать это место и обрабатывать новые сообщения. Если каждый процесс получает собственную папку, то эта папка может использоваться как папка входящих сообщений. А если программы закодированы так, чтобы обрабатывать сообщения в порядке их получения, то мы получаем самую простую форму компьютеризированной очереди.
Однако для этого требуется, чтобы программа обрабатывала эти папки входящих сообщений не только в логическом смысле, но и вплоть до предоставляемых файловой системой возможностей. Например, логику запоминания того, какие сообщения уже были просмотрены, можно реализовать так: помечать файлы как просмотренные, удалять их или перемещать в другую папку.
Стоит учитывать, что, по сути, это всё ещё разновидность глобальных значений.
Переместив модули программы в процессы, мы также перешли от общих регистров к совместно используемой файловой системе.
Это значит, что критически важным становится координирование таких файлов, поэтому операционные системы начали предоставлять возможности управления ими.
▍ Семафоры

Учитывая, что папка используется как пробковая доска и что к этой папке должно получать доступ множество процессов, может получиться так, что процесс попытается прочитать сообщение, которое всё ещё записывает другой процесс, или хуже того — два процесса попытаются выполнить запись в одно место, перезаписывая работу друг друга.
Семафоры решают эту проблему. Этот механизм позволяет процессам просить ОС будить их только тогда, когда ресурс, который они ожидают, доступен исключительно им, и когда ни один процесс не использует его, управляя очередью между ними.
Также это помогает разделить процессы на те, которые готовы использовать CPU, и те, которые ждут ресурсов и могут быть пропущены в цикле разделения времени.
▍ Использование сигналов между процессами

Механизм операционных сигналов был расширен, включив в себя несколько
сигналов, которые приложения могут использовать для собственной логики (например, SIGUSR1, SIGUSR2).
В большинстве ОС все сигналы внутри устроены как числовые коды, которые программы могут сопоставлять с определёнными функциями. То есть сигнал можно использовать для вызова конкретной части кода, но с ним нельзя передать никаких параметров.
Благодаря своей изобретательности некоторые команды разработчиков догадались, что перед отправкой сигнала можно подготовить в заранее заданной папке сообщение для целевого процесса. Когда целевой процесс получит этот сигнал, программа считает сообщение из файловой системы, благодаря чему программа при помощи того же механизма сигналов может получать сообщения с любыми типами полезных нагрузок.
▍ Перехват событий файловой системы
События (или push) — это более эффективный и новый механизм (2001 год), делегирующий работу по управлению наблюдением ОС, сохраняя в приложении только логику того, что должно происходить в случае возникновения изменений в папке или файле.
Это переворачивает асинхронность исполнения. С одной стороны, процессы теперь могут отвечать на события по мере их поступления, если они готовы и прослушивают события.
С другой стороны, использующее события приложение всё равно должно выполнять большую часть того, что выполняет приложение, использующее опросы (polling). Если процесс какое-то время был отключен, то после своего пробуждения он должен проверить, что есть нового в файловой системе и реагировать так же, как это сделало бы приложение с опросами.
▍ Сокеты

Подключи, чтобы принять сигнал
Со временем для передачи сообщения в ОС появились сокеты, позволяющие избавиться от возни с файлами.
Их использование уже граничит с распределёнными системами, потому что если мы можем передавать сообщения между независимыми процессами на одной машине, то всего один шаг отделяет нас от возможности передачи сообщений между двумя процессами в сети.
То, что мы рассмотрим далее, крайне важно для локальной работы:
Архитектура каналов и STDIO
Эволюция — это всегда многократное использование: она вдохновила создавать программы, специализированные в своей узкой нише, и позволила конечным пользователям применять их как стандартные строительные блоки для выражения конкретных потоков.
В результате появились каналы (pipe).
Архитектура каналов подразумевает, что поверх аргументов командной строки и механизма сигналов программы получают три основных канала коммуникации:
- для входа,
- для выхода,
- для уведомлений.
А как же третий?
Когда программе нужно создать уведомление, которое не должно быть частью выходных данных, оно передаёт его по третьему каналу. Так как большинство уведомлений связано с ошибками, этот канал имеет неприятное имя stderr , даже когда используется для предупреждений, уведомлений и всего того, что процесс должен сообщить операторам, а не следующей программе в канале.
Прочие преимущества каналов: в основном они расположены в памяти, что экономит большой объём ввода-вывода, а звенья могут работать одновременно, передавая блоки данных по мере их готовности.
▍ Мощь каналов
Если программы достаточно обобщены и поддерживают чётко сформулированные параметры, можно строить очень выразительные потоки даже без необходимости писать программный код.
Этот скрипт оболочки выводит markdown-список десяти самых популярных тегов, найденных в статьях:

Этот пример предполагает, что папка articles содержит документы JSON в виде файлов, и каждый документ может иметь свойство tags в виде списка строк. Скрипт использует jq для их извлечения, uniq подсчёта, sort сортировки в обратном порядке, head вырезания десяти верхних результатов и sed форматирования их в виде markdown-списка с заголовком.
Если вы программист, то какой объём кода вам бы понадобился, чтобы выразить эти действия на вашем языке программирования?
Заключение

Мы узнали, как отдельные модули ПО могут передавать друг другу сообщения. В первую очередь мы рассмотрели коммуникации внутри локальной машины, оставив распределённые системы для новых постов.
Мы увидели, что всё это локально внутри устроено как глобальные значения — общие регистры, общая память и общая файловая система. Несмотря на это, мы не работаем с ними как с глобальными значениями, поскольку доступ к ним в основном выполняется через проверенные временем механизмы и встроенные защитные меры. Однако иногда ПО приходится явным образом использовать специальные механизмы для защиты от коллизий с другими процессами.
12.3. Организация обмена данными
Обмен данными в широком смысле — это передача информации от одного объекта другому. В компьютерном мире до недавнего времени под обменом данными часто понимали процесс ввода и вывода данных между оперативной памятью и периферийными устройствами. С появлением концепции Windows под обменом данными стали понимать передачу данных от одного объекта к другому. В результате этого процесса объекты могут изменяться, а также могут создаваться новые объекты, образующиеся из одного или нескольких существующих объектов.
Такими объектами могут быть приложения, папки, документы, а передаваемыми данными — фрагменты документов, документы, файлы, папки, т.е. также объекты среды Windows. Так, в результате копирования файла или папки появляются их копии, а вследствие обмена данными между приложениями создаются составные документы, собранные из фрагментов, сформированных в разных приложениях.
Обмен данными в среде Windows осуществляется либо через буфер обмена, либо без него перетаскиванием выделенного объекта мышью. Обмен данными через буфер выполняется с помощью стандартных команд Вырезать (Cut), Копировать (Сору) и Вставить (Paste). Команда Специальная вставка (Paste Special) позволяет выбрать формат, в котором передаются данные. Большинство приложений Windows содержат перечисленные команды в структуре своих меню, а также включают их в контекстные меню.
Помимо перечисленных команд в приложении могут быть задействованы специальные команды, которые дают возможность использовать данные из ранее созданных и хранящихся в файлах объектов.
ПОНЯТИЕ СОСТАВНОГО ДОКУМЕНТА
При создании документа часто возникает необходимость вставить в него фрагмент из документов, созданных в других программных средах. Такой фрагмент по отношению к документу, в который он вставляется, может иметь иной тип данных. Например, в текст, созданный в текстовом редакторе WordPad, включается растровый рисунок из графического редактора Paint, а также таблица из табличного процессора Excel. В результате появляется документ, включающий данные разного типа, созданные в разных приложениях.
Такая же ситуация может возникнуть и при использовании одного приложения. Например, текст и векторные рисунки можно сделать в среде текстового процессора Word, объединив их затем в одном документе. Налицо фрагменты разного типа данных — текст и рисунки, и хотя они созданы в одном приложении, для их создания использовались разные инструменты. Поэтому их объединение легче строить, считая, что они созданы в разных средах.
Операционная система Windows поддерживает такие механизмы обмена данными, с помощью которых любое приложение может включать в свои документы практически
любые данные, даже если с этими данными оно и не может работать. Эту универсальность обеспечивает технология OLE, о которой подробнее речь пойдет далее. Документ, содержащий разнотипные данные, ничем не отличается от обычных документов. Его можно печатать, хранить и производить с ним любые другие действия. Подобный документ получил название составного или интегрированного документа.
Составной (интегрированный) документ — документ, в котором объединены данные разного типа, созданные в разных приложениях.
В большинстве случаев в составном документе можно выделить главную часть, которая создавалась в одном приложении и куда вставлялись объекты из других приложений. Составной документ вызывается из приложения, где создавалась его главная часть. Видимо, настолько прочно вошла в практическую деятельность пользователя работа с составным документом, что все чаще стали заменять понятие составного документа просто документом. Следует заметить, что возможно создание составного документа, у которого нет главной части и который весь состоит из объектов, созданных в других приложениях. Например, документ Word может состоять из единственного рисунка, созданного в графическом редакторе Paint.
Часто при создании составного документа используют такую терминологию:
источник или сервер — приложение, откуда производится вставка фрагмента в составной документ;
приемник или клиент (адресат) — приложение, где находится главная часть составного документа и куда вставляются объекты из других приложений (источников).
Замечание. Учитывая, что понятия «сервер» и «клиент» также широко используются в контексте сетей, в дальнейшем для приложения будем использовать понятия «источник» и «приемник».

Рис. 12.13. Формирование составного документа
Понятие составного документа иллюстрируется рис. 12.13, где в качестве источника (сервера) служат два приложения (например, Paint, в котором создан рисунок, и Excel, в котором подготовлена таблица), а в качестве приемника (клиента) используется одно приложение (например, им может быть текстовый процессор Word).
ОБМЕН ДАННЫМИ ПЕРЕТАСКИВАНИЕМ ОБЪЕКТА МЫШЬЮ
Во многих приложениях обмен данными может быть выполнен путем перетаскивания с помощью мыши. Так можно реализовать и операцию копирования, и операцию перемещения. Операцию перетаскивания мышью рекомендуется использовать, когда источник на экране монитора находится недалеко от приемника. Дня этого окна приложений целесообразно расположить рядом.
Перемещение объекта с помощью мыши осуществляется следующим образом:
выбирается перемещаемый объект, для чего на этом объекте нужно установить указатель мыши. Можно выбрать группу объектов (например, фрагмент текста), протащив мышь при нажатой левой кнопке;
при нажатой левой кнопке мыши выделенный объект перетаскивается до места назначения.
Копирование осуществляется аналогично перемещению при одновременно нажатой клавише <Ctrl>. При этом перемещаемый объект будет обозначен дополнительно знаком «плюс».
Замечание. В среде Windows нажатие управляющей клавиши учитывается, как правило, в момент отпускания кнопки мыши. Поэтому можно сначала перетащить объект, затем, не отпуская кнопки мыши, оценить ситуацию и при необходимости нажать <Cui>, <Shift> или какую-либо другую комбинацию управляющих клавиш.
ОБМЕН ДАННЫМИ ЧЕРЕЗ БУФЕР
Роль буфера обмена
Буфер обмена (clipboard) играет важнейшую роль при организации обмена данными. Это часть виртуальной памяти, которая служит неким перевалочным пунктом при обмене данными. При небольших объемах передаваемых данных для буфера обмена выделяется часть оперативной памяти.
Для наглядности можно провести некоторую аналогию между буфером обмена и ячейкой склада, куда отправляется на временное хранение некий объект. В этой ячейке можно хранить лишь один объект. Чтобы поместить в ячейку новый объект, необходимо убрать из нее старый объект, ранее помещенный туда. В буфере обмена объект хранится до тех пор, пока в него не будет помещен новый объект, который автоматически сотрет прежний. Находящийся в буфере обмена объект можно копировать неограниченное количество раз.
Основные приемы работы с буфером обмена поддерживаются большинством программных продуктов. Его широко используют:
при создании и редактировании простого документа, когда с помощью буфера обмена осуществляются копирование, перемещение и удаление его фрагментов;
при создании и редактировании составного документа, когда необходимо использовать объекты из разных приложений;
при перемещении или копировании объектов файловой системы (файлов и папок);
для сохранения в файле выделенного фрагмента документа.
Буфер обмена — специальная область памяти, которая предназначена для временного хранения переносимого, копируемого или удаляемого объекта.
Буфер обмена обслуживается операционной системой и характеризуется следующими свойствами:
в буфере обмена хранится объект, помещенный в него одним из известных пользователю способов;
в буфере обмена объект хранится до тех пор, пока не будет помещен в него новый объект;
буфер обмена доступен из любого приложения;
содержимое буфера обмена можно просмотреть или сохранить в файле с помощью приложения. Просмотр буфера обмена;
буфер обмена очищается при перезагрузке операционной системы либо специальной командой;
объект в буфере обмена хранится в формате, определяемом приложением-источником, но при его вставке в составной документ, как правило, предоставляется возможность преобразования в другой формат.
При обмене данными между приложениями через буфер обмена можно установить связь между источником и приемником. Эта связь позволяет редактировать объект непосредственно в составном документе средствами приложения-приемника (связь между составным документом и приложением-источником) либо обновлять объект, если он был записан в файл и впоследствии изменен приложением-источником (связь между составным документом и файлом). Такая связь в одних случаях необходима, а в других нет. Так, при копировании или перемещении объектов файловой системы между папкой-источником и папкой-приемником не устанавливается никакой связи. Но при удалении файла он фактически перемещается в специальную папку Корзина, причем устанавливается связь Корзины с папкой, в которой этот файл находился. Эта связь позволяет при необходимости вернуть файл на прежнее место.
Для вставки объекта из буфера обмена можно воспользоваться командой Вставить, вызвав ее любым способом, например из контекстного меню. После выполнения этой команды объект становится частью документа, создаваемого в приложении-приемнике. При этом объект вставляется в составной документ, как правило, как OLE-объект, сохраняющий связь с приложением-источником. Его можно редактировать непосредственно в составном документе, вызвав приложение-источник. Отметим, что по технологии OLE 2.0 вызывается не само приложение-источник, а лишь необходимые инструменты редактирования: при двойном щелчке на OLE-объекте пользователь остается в среде приложения-приемника, но меню и панели инструментов этого приложения меняются.
Пользователь может в определенных пределах изменять способ вставки объекта из буфера обмена. Для этого нужно использовать команду Специальная вставка, которая во многих приложениях располагается в меню Правка (Edit).
Технология обмена данными через буфер
Обмен данными через буфер выполняется в следующей последовательности (рис. 12.14):
выделяется объект, подлежащий копированию или перемещению;
выделенный объект переносится в буфер обмена с помощью команды. Копировать или Вырезать (например, через контекстное меню);
указатель мыши устанавливается в место вставки объекта;
объект вставляется в указанное место командой Вставить или командой Специальная вставка (через контекстное меню или меню Правка).

Рис. 12.14. Схематичное представление обмена данными через буфер
ТЕХНОЛОГИЯ ВНЕДРЕНИЯ И СВЯЗЫВАНИЯ ОБЪЕКТОВ OLE
Представление о технологии OLE
Появление технологии OLE обусловлено необходимостью формирования документов из данных разного типа. Основное достоинство технологии OLE, которая была разработана фирмой Microsoft, состоит в том, что она не имеет ограничений и позволяет организовать передачу данных практически между любыми приложениями. Технология OLE определяется правилами (протоколом) взаимодействия Windows-приложений. Базовый вариант технологии OLE был впоследствии расширен до версии OLE 2.0, которая в настоящее время является наиболее употребительной.
Примечание. Аббревиатура OLE означает Object Linking and Embedding, что переводится как связывание и внедрение объекта.
Технологию OLE полностью поддерживают не все Windows-приложения, а только те, которые предназначены для разработки составных документов. Одни приложения можно использовать только в качестве приемника, другие — только в качестве источника, но есть приложения, которые могут выступать и в той, и в другой роли.
Например, текстовый редактор WordPad полностью обеспечивает работу по технологии OLE, так как он предназначен для создания текстовых документов, в которых могут быть рисунки, звуки, таблицы, видеоклипы и др. Графический редактор Paint предназначен для подготовки несложных рисунков, он не может работать по технологии OLE только как приложение-источник. Текстовый процессор Word представляет собой сложный комплекс и фактически включает в себя несколько приложений: редактор рисунков, редактор формул, текстовый редактор и др. Эти приложения по-разному используют технологию OLE. Редактор формул действует только как приложение-источник (OLE-сервер), а текстовый редактор может выступать как в роли источника, так и в роли приемника (OLE-клиента). Просмотреть список действующих в системе OLE-серверов можно, выполнив команду Вставить объект (в среде Word эта команда включена в меню Вставка).
Технология OLE обеспечивает пользователю возможность редактировать вставленный в составной документ объект средствами, которые предоставляет приложение-источник. OLE-объект всегда сохраняет связь с приложением-источником (эта связь активизируется двойным щелчком), но может и не быть связанным с документом-источником.
Технология OLE предусматривает два варианта обмена данными:
внедрение объекта, при котором в документ-приемник вставляется сам объект. Для отображения на экране или распечатки документа OLE-объект не использует средств приложения-источника. Например, при переносе составного документа на другой компьютер OLE-объект будет отображаться нормально, даже если на этом компьютере нет соответствующего приложения-источника Однако OLE-объект сохраняет связь с приложением-источником, которая позволяет обеспечить редактирование OLE-объекта внутри составного документа;
связывание объекта, при котором в документ-приемник помещается не сам объект, а лишь ссылка на документ-источник. В этом случае OLE-объект будет связан не с приложением-источником, а с документом-источником, в котором находится этот объект. Эта связь позволяет изменить представление объекта в документе-приемнике, как только этот объект будет изменен в документе-источнике.
Внедрение объекта
При внедрении объекта в документ-приемник вставляется сам объект. Если этот объект получен копированием данных из некоторого документа-источника, то данные сохраняются на прежнем месте, а в документ-приемник вставляется их копия, причем связь между объектом и его копией не устанавливается. При этом наряду с командой Вставить можно использовать команду Специальная вставка.
Внедрить объект в документ можно несколькими способами:
из открытого документа (с помощью команд Вставить и Специальная вставка);
из файла (специальной командой вставки файла или импорта файла);
непосредственным вызовом OLE-сервера (командой Вставить объект). Внедрение объекта из открытого документа выполняется следующим образом:
в приложении-источнике вьщеляется объект, который будет внедряться;
выделенный объект копируется в буфер обмена с помощью команды Копировать или Вырезать;
осуществляется переход в приложение-приемник, где формируется составной документ, и указатель мыши устанавливается в место вставки объекта;
вставляется объект с помощью команды Вставить или Специальная вставка;
при использовании команды Специальная вставка на экране появляется диалоговое окно «Специальная вставка» (рис. 12.15), в котором необходимо выбрать способ вставки данных как объекта, отметить кнопку выбора <Вставить> и нажать кнопку <ОК>. Данные можно вставлять в составной документ также в виде значка, для чего в диалоговом окне «Специальная вставка» следует отметить соответствующий переключатель.
Технология внедрения содержимого файла, которая рассматривается на примере приложения Word, состоит в следующем:
в составном документе указывается место внедрения;
вводится команда Файл из управляющего меню Вставка;
в диалоговом окне «Вставка файла» (рис. 12.16) устанавливаются необходимые параметры и выбирается имя файла При этом не следует устанавливать переключатель <Связь с файлом>, чтобы содержимое файла оказалось внедренным;
нажать кнопку <ОК>.
Рис. 12.15. Окно «Специальная вставка» в текстовом процессоре Word


Рис. 12.16. Окно «Вставка файла» в текстовом процессоре Word
Для других приложений технология аналогична, отличие состоит в конкретных названиях команд.
В составной документ новый объект внедряется следующим образом:
в составном документе указывается место внедрения;
вводится команда Вставить объект (в среде Word — пункт Объект управляющего меню Вставка);
в диалоговом окне «Вставка объекта» (рис. 12.17) выбирается тип внедряемого объекта, т.е. приложение-источник. Флажок <Связь с файлом> устанавливать не следует, для того чтобы объект оказался внедренным;
нажимается кнопка <ОК>;

в приложении-источнике создается новый объект, который после выхода из приложения-источника будет вставлен в документ-приемник.
Рис. 12.17. Окно «Вставка объекта» в текстовом процессоре Word
Объект, внедренный по технологии OLE, можно редактировать средствами приложения-источника следующими способами:
выбрать соответствующую команду в управляющем или контекстном меню;
дважды щелкнуть левой кнопкой мыши на внедренном объекте.
Отметим, что если один и тот же объект внедряется в несколько документов, то в каждом документе будет храниться своя копия объекта. В этом случае хранение объекта и всех его копий требует дополнительного расхода внешней памяти. Кроме того, не сохраняется никакой связи между копиями объекта, изменение одной из копий никак не влияет на остальные копии объекта.
Связывание объекта
При просмотре или распечатке составного документа связанный объект ничем не отличается от внедренного. Различие проявляется лишь при редактировании объекта. Связанный объект всегда находится в документе-источнике, а в составном документе-приемнике хранится ссылка (указание местонахождения) на файл с этим документом (рис. 12.18).
Таким образом, при связывании объекта в документах-приемниках указываются ссылки на объект, а сам объект хранится в единственном экземпляре в документе-источнике. Любые изменения объекта, проводимые в документе-источнике, обязательно отражаются на представлении объекта в составных документах. При открытии составного документа необходимо позаботиться о том, чтобы присутствовали все файлы, в которых хранятся связанные с ним объекты, причем в точности в тех папках, в которых они находились при связывании.
каким термином называют способ обмена данными между двумя обьектами в том числе между пользавателем и компьютерной програмой
Компьютер запрашивает стоимость одного килограмма конфет.
Пользователь вводит стоимость одного килограмма конфет, и компьютер выводит на экран:
Цена 0,5 кг. конфет равна … рублей
Цена 1 кг. конфет равна … рублей
Цена 1,5 кг. конфет равна … рублей
Цена 10 кг. конфет равна … рублей
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
1. Дано действительное число – цена 1 кг конфет. Вывести стоимость 0,5; 1; 1,5 … 10 кг конфет. (Подсказка – используем цикл WHILE).
Программа должна иметь следующий вид:
Компьютер запрашивает стоимость одного килограмма конфет.
Пользователь вводит стоимость одного килограмма конфет, и компьютер выводит на экран:
Способы обмена данными

Основные способы обмена данными.
Между микропроцессорной системой (МС) и внешним устройством (ВУ) происходит обмен полезной информацией в виде слов данных (
) и служебной информацией в виде управляющих слов (
) и слов состояния (
). Служебная информация может занимать значительный объем. Поэтому в общем случае для обмена информацией отводится ряд портов ввода/вывода (ВВ), образующих пространство доступа к внешнему устройству (ВУ). Ввод и вывод всегда рассматриваются по отношению к микропроцессору. Обмен информацией между процессором и ВУ осуществляется по определенным правилам. Совокупность правил, называемых протоколом обмена, является основой для составления драйвера ВУ. Драйвер представляет собой набор подпрограмм, обслуживающих обмен ВУ с микропроцессором.
Существуют три способа обмена данными: программно управляемый обмен, обмен с прерыванием программы и обмен по каналу прямого доступа к памяти. Рассмотрим в общих чертах особенности каждого способа обмена.
Программно–управляемый обмен данными.
Обмен инициируется и выполняется процессором с помощью:
● специальных команд ввода–вывода,
при этом в формате команды должен содержаться код выполняемой операции и номер выбираемого порта ВУ;
● команд обращения к
ОЗУ, при этом каждый порт ВУ рассматривается как адрес, отличный от адресов других ячеек.
С точки зрения использования вспомогательных сигналов различают прямой и условный обмен.
Прямым, или безусловным,
вводом–выводом называется такая процедура, при которой для активизации обмена не требуется никаких условий и вспомогательных сигналов. Прямой ввод/вывод возможен только с внешними устройствами, которые всегда готовы к обмену. Он является составной частью более сложных протоколов обмена.
вводом–выводом называется такая процедура, при которой активизация обмена возможна при выполнении условия готовности к обмену ВУ.
Большинство ВУ работает асинхронно по отношению к процессору. При асинхронном обмене информацией важной задачей является проверка готовности ВУ. Поэтому ВУ должно иметь аппаратные средства для выработки информации о своем внутреннем состоянии. Микропроцессор считывает эту информацию, передает ее в аккумулятор, анализирует и на основе анализа принимает решение о готовности ВУ. При отсутствии готовности ВУ процессор переходит в состояние ожидания. Если обнаружено состояние готовности, то выполняются операции передачи данных. Таким способом достигается сопряжение во времени работы процессора и таких устройств, которые по быстродействию уступают процессору.

Таким образом, условный ввод/вывод применяется для обмена с низкоскоростными внешними устройствами и сопровождается сигналом готовности ГтВУ, генерируемым ВУ. Сигнал готовности ГтВУ вводится в процессор в составе слова состояния и информирует его о готовности ВУ к обмену. После завершения операции обмена сигнал готовности ГтВУ должен быть снят и выставлен перед новой операцией. Для этого процессор информирует ВУ об окончании операции с помощью сигнала подтверждения Пт.
На рис. 3.2.1 приведены диаграммы условного ввода/вывода с помощью контроллера обмена. В этом случае могут быть также использованы сигналы готовности Гт контроллера и подтверждения ПтВУ внешнего устройства.
При вводе (рис. 3.2.1, а) процессы протекают в следующей последовательности:
● если сигнал подтверждения микропроцессора (контроллера) Пт = 0, ВУ выставляет на шине ШВУ новые данные и сигнал готовности ГтВУ = 1;
● так как ГтВУ = 1, процессор дает команду на ввод данных, и данные по ШД поступают в аккумулятор;
● процессор через контроллер выставляет сигнал подтверждения Пт = 1, извещая ВУ о том, что данные введены;
● при Пт = 1 ВУ снимает сигнал готовности (ГтВУ =0);
● при ГтВУ = 0 процессор снимает сигнал подтверждения (Пт = 0).
При выводе данных (рис. 3.2.1, б) процессы протекают в следующей последовательности:
● если сигнал готовности контроллера Гт = 0, ВУ осуществляет сброс сигнала подтверждения (ПтВУ = 0), после чего процессор на ШД выставляет новые данные;
● при сигнале подтверждения ПтВУ = 0 контроллер устанавливает сигнал готовности Гт = 1;
● данные по ШВУ выводятся в ВУ;
● при Гт = 1 ВУ устанавливает сигнал подтверждения (ПтВУ =1);

● при ПтВУ = 1 процессор снимает ранее установленный сигнал готовности (Гт = 0).
Рассмотренный протокол обмена называется квитированием.
Возможны два вида условного обмена: с занятием цикла и совмещенного. При обмене с занятием цикла (рис. 3.2.2, а) в случае неготовности ВУ микропроцессор находится в режиме ожидания; при совмещенном обмене (рис. 3.2.2, б) после опроса ВУ микропроцессор возвращается к выполнению основной программы.
По способу кодирования различают обмен данными в параллельном и последовательном коде.
Необходимость передачи данных в последовательном коде обусловлена двумя факторами:
● наличием устройства (например, клавиатура, дисплей, телетайп), принцип работы которого базируется на использовании последовательного кода;
● удалением внешнего устройства от процессора на значительное расстояние. Дело в том, между отдельными проводниками соединительной линии между источником и приемником информации существует емкостная связь. С увеличением длины соединительной линии растет емкость между ее отдельными проводниками. Поэтому при передаче импульсных сигналов по одному проводнику в других проводниках наводятся помехи, уровень которых может быть соизмеримым с уровнем полезных сигналов.
В этих условиях обмен информацией между процессором и внешним устройством должен сопровождаться преобразованием параллельного кода в последовательный код при выводе данных и последовательного кода в параллельный — при вводе данных. Указанные функции возлагаются на контроллер обмена, который обычно выполняется в виде интегральной схемы.
К достоинствам программно–управляемого обмена данных относится его простота, к недостаткам — бесполезная трата времени на ожидание готовности ВУ и невозможность обеспечения своевременной реакции на внезапно возникшую потребность ВУ в обмене информацией.
Обмен с прерыванием программы.
При этом способе инициатором обмена является внешнее устройство, которое подает специальный сигнал ЗАПРОС ПРЕРЫВАНИЯ на соответствующий вход процессора. После выполнения текущей микрокоманды процессор прекращает выполнение основной программы, вырабатывает сигнал ПОДТВЕРЖДЕНИЕ ПРЕРЫВАНИЯ и переходит к подпрограмме обработки прерывания, расположенной в фиксированной области памяти. После выполнения этой подпрограммы происходит возврат к основной программе.
Обмен данными с помощью прямого доступа к памяти.
По этому способу используется канал прямого доступа к памяти (ПДП), по которому массивы данных передаются непосредственно между внешним устройством (ВУ) и ОЗУ, минуя процессор. Это позволяет достичь наибольшей скорости передачи, но требует определенных аппаратных затрат для организации канала. Аналогично случаю обмена по прерыванию ВУ посылает в процессор сигнал запроса на прямой доступ. После отправления сигнала подтверждения процессор прекращает работу по выполнению текущей программы, отключает свои буферные регистры от шин адреса и данных, а также прекращает выработку управляющих сигналов. Таким образом, процессор как бы замирает до окончания процедуры ПДП, чем этот режим и отличается от режима обработки прерывания. Все функции адресации, передачи данных и управления выполняет контроллер ПДП, содержащий счетчик адреса, счетчик числа слов в массиве, а также ряд триггеров и логических схем, которые внесены в блок управления.
До начала работы канала ПДП в счетчик адреса заносится адрес ячейки ОЗУ, с которой начинается массив данных, и в счетчик слов (в прямом или дополнительном коде) — число слов в массиве. При передаче каждого слова содержимое этих счетчиков изменяется на единицу и обмен данными производится автоматически, пока не будет передан весь массив слов.
В микропроцессорных системах встроены (или предусматриваются) интерфейсные схемы для организации ввода/вывода.