<?xml version="1.0" encoding="windows-1251"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
 <description>
  <title-info>
   <genre>comp_programming</genre>
   <genre>comp_osnet</genre>
   <author>
    <first-name>К.</first-name>
    <middle-name>А.</middle-name>
    <last-name>Костюхин</last-name>
   </author>
   <book-title>ОТЛАДКА СИСТЕМ РЕАЛЬНОГО ВРЕМЕНИ. Обзор</book-title>
   <date>2003</date>
   <lang>ru</lang>
  </title-info>
  <document-info>
   <author>
    <nickname>honorato bonafe</nickname>
   </author>
   <program-used>Fiction Book Designer, FB Editor v2.0</program-used>
   <date value="2009-06-16">16.06.2009</date>
   <id>FBD-38D1B8-C890-FB47-79A5-875C-3CB9-A86E9C</id>
   <version>1.0</version>
  </document-info>
  <publish-info>
   <publisher>НИИСИ РАН</publisher>
  </publish-info>
 </description>
 <body>
  <title>
   <p>К.А. Костюхин</p>
   <p>ОТЛАДКА СИСТЕМ РЕАЛЬНОГО ВРЕМЕНИ</p>
   <p>Обзор</p>
  </title>
  <section>
   <title>
    <p>1. Введение</p>
   </title>
   <section>
    <title>
     <p>1.1. Основные определения</p>
    </title>
    <p>Предметом настоящего обзора является отладка систем реального времени.</p>
    <p>Под системой реального времени (СРВ) мы понимаем систему, в которой корректность функционирования зависит от соблюдения временных ограничений.</p>
    <p>Существующие СРВ являются многозадачными. Многозадачность реализуется через многопроцессность<a l:href="#n_1" type="note">[1]</a> и многопоточность.</p>
    <p>Многопроцессность в СРВ имеет существенные недостатки, поскольку требует поддержки времени выполнения для доступа к памяти, и, следовательно, при переключении контекстов системе нужно выполнить дополнительные действия.</p>
    <p>Многопоточность — это наиболее распространенный подход при проектировании систем реального времени, при котором СРВ представляет собой один процесс, в рамках которого запущено несколько потоков.</p>
    <p>Недостатком многопоточности является возможность модификации чужих данных какой-либо задачей (из-за отсутствия защиты). В связи с этим в СРВ представлены средства синхронизации, то есть средства, обеспечивающие задачам доступ к разделяемым ресурсам. К таким средствам относятся семафоры (бинарные и счетчики), мьютексы, очереди сообщений (см. [1],[3],[25]).</p>
    <p>Структура СРВ приведена на рис. 1, где прикладной код — это совокупность пользовательских потоков управления, ОСРВ — операционная система реального времени, обеспечивающая планирование, синхронизацию и взаимодействие пользовательских потоков управления.</p>
    <image l:href="#mhtA81.tmp"/>
    <p>Рис. 1. Структура системы реального времени</p>
    <p>Будем называть распределенную систему распределенной системой реального времени (РСРВ), если корректность ее функционирования зависит также и от ограничений, накладываемых на время обмена между компонентами системы.</p>
   </section>
   <section>
    <title>
     <p>1.2. Особенности отладки в системах реального времени</p>
    </title>
    <p>Отладка в СРВ направлена на обнаружение и исправление ошибок в прикладном коде. Она является одним из этапов кросс-разработки, схему которой можно представить следующим образом. Разработка приложения ведется как минимум на двух машинах: инструментальной и целевой. На инструментальной платформе происходит написание исходного текста, компиляция и сборка. На целевой — загрузка приложения, его тестирование и отладка.</p>
    <p>Ввиду того, что целевая платформа, как правило, обладает более ограниченными ресурсами, чем инструментальная, отладка распределенных систем реального времени может быть двух видов.</p>
    <p>Первый из них — имитация архитектуры целевой платформы, то есть возможность отладки целевых программных средств без использования самой платформы. Подобная имитация, как правило, не дает возможности провести подробное и полное тестирование ПО. Поэтому, такой тип отладки применяется только в случае отсутствия целевой платформы.</p>
    <p>Второй способ — удаленная отладка (кросс-отладка). Кросс-отладка позволяет использовать ресурсы инструментальной системы при изучении поведения некоторого процесса в целевой системе.</p>
    <p>Эффективность удаленной отладки зависит от типа связи инструментальной и целевой машин, а также от поддержки средств отладки со стороны целевой архитектуры.</p>
    <p>Ключевым требованием к средствам отладки является возможность наблюдать и анализировать весь процесс выполнения отлаживаемых задач, а также системы в целом. В данной работе рассматриваются два метода отладки: активная отладка и мониторинг.</p>
    <p>Суть активной отладки состоит в том, что отладчик имеет право останавливать выполнение задачи или всей системы, начинать или продолжать выполнение с некоторого адреса, отличного от точки останова, изменять значения переменных и регистров, и.т.д. Недостаток этого метода заключается в том, что отладчик может вносить серьезные сбои в нормальную работу системы в связи с устанавливаемыми временными ограничениями. Этого можно избежать, остановив некоторую группу задач или всю систему целиком, о чем будет подробнее сказано ниже. Преимущество метода состоит в возможности корректировать поведение задачи в процессе ее выполнения.</p>
    <p>Под мониторингом понимается сбор данных о задаче (значения регистров, переменных, и.т. д) или о системе в целом (стадии выполнения задач, происходящие события, и.т. д).</p>
    <p>Осуществлять сбор данных помогает псевдо-агент (набор инструкций, встроенных в код задачи). Обычно его добавляют на этапе проектирования. Простой пример псевдо-агента — вызов assert, позволяющий вести диагностику работы задачи.</p>
    <p>В процессе мониторинга отладчик практически не вмешивается в работу системы, обеспечивая нормальное ее функцирование, но вместе с тем не имеет возможности влиять на ход выполнения отлаживаемого приложения.</p>
   </section>
   <section>
    <title>
     <p>1.3. Ошибки в системах реального времени</p>
    </title>
    <p>Отмеченные выше методы отладки позволяют выявлять и устранять ошибки следующего характера:</p>
    <p>1. Ошибки в программном обеспечении, влекущие непнеправильное выполнение задачи (безотносительно времени). Обычные ошибки, обнаруживаемые средствами активной отладки. Эти средства будут рассмотрены в разделе</p>
    <p>2. Ошибки в ОСРВ: ошибки планирования, синхронизации и связи. Для отладки, в этом случае, надо использовать один из способов мониторинга. Подробно средства мониторинга описаны в разделе</p>
    <p>3. Логические ошибки, связанные с асинхронностью. Пример такого рода ошибок и способы их устранения будут приведены в разделе</p>
    <p>4. Ошибки, связанные с тем, что данные задачи были изменены другой задачей. Локализацию ошибок лучше проводить, используя мониторинг, а именно: осуществлять периодический контроль целостности данных, временно запрещать другим задачам доступ к некоторым участкам кода или данных.</p>
   </section>
  </section>
  <section>
   <title>
    <p>2. Средства активной отладки</p>
   </title>
   <section>
    <title>
     <p>2.1. Архитектура средств активной отладки</p>
    </title>
    <p>В общем случае кросс-отладчик состоит из 2 основных модулей: менеджера на инструментальной платформе и агента отладки на целевой стороне. Менеджер служит для обеспечения пользовательского интерфейса, то есть для приема команд, их обработки и посылки на целевую сторону, а также для приема, обработки и выдачи информации от агента, который осуществляет непосредственную работу с отлаживаемой системой. Возможности агента отладки зависят от особенностей архитектуры системы, а именно:</p>
    <p>• имеет ли система встроенные средства отладки (в этом случае агенту достаточно осуществлять вызов соответствующих функций и пересылать результаты менеджеру);</p>
    <p>• какие она предоставляет возможности по созданию обработчиков (для контроля за происходящими событиями агенту может потребоваться собственный обработчик);</p>
    <p>• вызовы каких функций дозволено делать агенту.</p>
    <p>Кроме того, агент отладки должен поддерживать возможность приема и передачи информации от псевдо-агентов, встроенных в код отлаживаемых программ. Агент отладки может состоять из нескольких модулей, например, один осуществляет сбор данных, другой производит фильтрацию, третий осуществляет пересылку данных менеджеру.</p>
    <p>Общая структура активного кросс-отладчика приведена на рис. 2.</p>
    <image l:href="#mhtAB1.tmp"/>
    <p>Рис. 2. Активный кросс-отладчик</p>
    <p>Рассмотрим протокол «менеджер-агент» на примере отладчика VxGDB (Wind River Systems, целевая система — VxWorks). Этот протокол базируется на RPC (Remote Procedure Call). Запросы менеджера можно классифицировать следующим образом:</p>
    <p>1. Запросы работы с модулями</p>
    <p>Сюда относятся запрос на загрузку модуля, запрос на получении информации о загрузочном файле и запрос на получение информации о символе.</p>
    <p>2. Запросы работы с задачами</p>
    <p>Это запросы на запуск, остановку и удаление задачи, на присоединение и отсоединение от запущенной задачи, на установку и удаление точки прерывания, на продолжение выполнения остановленной задачи.</p>
    <p>3. ptrace-запросы</p>
    <p>Агент отладки эмулирует функцию ptrace и передает ей соответствующие запросы на чтение и запись.</p>
   </section>
   <section>
    <title>
     <p>2.2. Отладочные действия</p>
    </title>
    <p>Существует набор базовых действий, позволяющих пользователю осуществлять контроль за выполнением отлаживаемой задачи. Эти действия можно классифицировать следующим образом:</p>
    <p>• предварительные действия отладчика;</p>
    <p>• прерывание выполнения задачи;</p>
    <p>• получение информации;</p>
    <p>• продолжение/изменение выполнения задачи.</p>
    <p>1) Предварительные действия отладчика</p>
    <p> • загрузка модуля на целевой стороне;</p>
    <p> • запуск нужной задачи;</p>
    <p> • если задача была запущена средствами системы, то присоединение к ней (в этом случае выполнение задачи останавливается и становится возможным производить отладочные действия);</p>
    <p> • переключение между задачами.</p>
    <p>Отладчик также выполняет и обратные действия, то есть отсоединение от задачи, прекращение ее выполнения и выгрузка соответствующего модуля.</p>
    <p>2) Прерывание выполнения задачи</p>
    <p>Как правило, выполнение задачи может быть прервано в результате того, что произошло одно из следующих событий:</p>
    <p> • Достигнута точка прерывания.</p>
    <p>Точки прерывания бывают двух видов: программные и аппаратные. Установка программной точки прерывания состоит в том, что запоминается инструкция, расположенная по тому адресу, где будет находиться точка прерывания, затем по этому адресу прописывается так называемая «break»-инструкция, после обработки которой процессором генерируется некоторое исключение (trap exception). Обработчик этого исключения сохраняет регистры задачи, меняет инструкцию точки прерывания на настоящий код и передает управление менеджеру. Недостаток программных точек прерывания в том, что соответствующий адрес должен находиться в той области памяти, куда разрешена запись.</p>
    <p>Аппаратная точка прерывания не требует модификации памяти, так как ее адрес хранится в специальном регистре (debug register, DR), который просматривается процессором при выполнении очередной инструкции. Если происходят действия, заложенные в контрольный регистр (например, выполнение по заданному адресу или чтение/запись в область, адресуемую значением DR), то процессор генерирует соответствующее прерывание, обработав которое, отладчик получает необходимую информацию.</p>
    <p>Отладчик предоставляет пользователю возможность установки точки прерывания на начало некоторой строки исходного текста, на точку входа определенной функции или на конкретный адрес. Помимо этого, отладчик отличает точки прерывания, поставленные им, а также (в многозадачных системах) имеет возможность устанавливать и обрабатывать точки прерывания, специфичные для данного множества задач. Это означает, что если задача не входит в такое отлаживаемое множество, то точка прерывания игнорируется.</p>
    <p>Помимо работы с точками прерывания, устанавливаемыми на конкретный адрес, отладчик работает с так называемыми прерываниями доступа (access breakpoints), используемыми для определения момента доступа к некоторой области памяти, и прерываниями наступления событий (event detection), которые срабатывают, когда происходит соответствующее событие.</p>
    <p> • Используется режим пошаговой отладки.</p>
    <p>Существует много вариантов степени детализации выполнения. В частности, остановка после выполнения строки исходного текста или остановка после выполнения каждой ассемблерной инструкции (с заходом в вызываемые функции или с их пропуском).</p>
    <p>Отладчик может использовать этот режим в служебных целях, например, при установленном прерывании выполнения при изменении данных (watchpoint). В этом случае после исполнения очередной инструкции надо проверять значение того выражения, на котором стоит точка прерывания.</p>
    <p> • Перехвачена исключительная ситуация.</p>
    <p>Если в процессе выполнения отлаживаемой задачи возникла исключительная ситуация (например, деление на 0), то отладчик должен корректно ее обработать и сообщить пользователю.</p>
    <p> • Получен сигнал прерывания от пользователя.</p>
    <p>Отладчик предоставляет пользователю возможность в любой момент остановить выполнение программы (например, введя соответствующий символ).</p>
    <p>При получении сигнала останова отладчик может остановить текущую отлаживаемую задачу, остановить выполнение некоторой группы задач и остановить всю систему. Такой механизм дает возможность применять средства активной отладки без опасения вызвать новые ошибки, связанные со спецификой СРВ, поскольку система или набор задач, которые могут повлиять на отлаживаемую, будут остановлены, и временные соотношения их выполнения нарушены не будут. Подобный подход реализован в отладчике X-ray (Microtec Division, целевая система VRTX).</p>
    <p>3) Получение информации</p>
    <p>Когда задача остановилась, становится возможным осуществлять сбор различных данных, которые могут помочь при локализации логических ошибок в программе.</p>
    <p> • Просмотр содержимого стека.</p>
    <p>Эта команда дает возможность увидеть, как задача попала в текущее положение. Каждый кадр стека содержит данные, связанные с вызовом некоторой функции, включая ее аргументы, локальные переменные и адрес точки вызова.</p>
    <p> • Просмотр таблицы символов.</p>
    <p>Используя отладчик, можно получать доступ к информации о символах (имена переменных, функций и типов), определенных в задаче. Эта информация состоит из имени, типа и адреса соответствующей переменной или функции.</p>
    <p> • Просмотр исходных файлов.</p>
    <p>Пользователь может выборочно смотреть исходный текст программы, задавая номера строк, имена функций или некоторый адрес.</p>
    <p> • Просмотр данных.</p>
    <p>Отладчик способен получать и пересылать пользователю значение любой переменной или функции, доступной отлаживаемой задаче, а также содержимое регистров, памяти и дизассемблированный код.</p>
    <p>Кроме того, у пользователя может возникнуть необходимость осуществить в процессе сеанса отладки вызов некоторой функции. Для поддержки этого существуют различные способы, например, можно передать соответствующий запрос агенту отладки, и тот запустит требуемую функцию либо в контексте отлаживаемой в данный момент задачи, либо в некотором специальном контексте. В GDB (GNU debugger, Free Software Foundation) реализован другой механизм, суть которого заключается в том, что все предварительные действия (установка точки выполнения, и.т.д.) производятся на инструментальной стороне, а агенту передается запрос на выполнение с текущего адреса.</p>
    <p>4) Продолжение/изменение выполнения</p>
    <p>Особенностью активной отладки является возможность изменения выполнения задачи.</p>
    <p> • Изменение данных.</p>
    <p>Отладчик имеет возможность изменять значения переменных, содержимое регистров и памяти. Это позволяет корректировать выполнение задачи, проверяя предположения об ошибках в ее коде.</p>
    <p> • Продолжение выполнения задачи с любого адреса.</p>
    <p>Пользователь может потребовать продолжить выполнение задачи с другого адреса (например, обходя критический участок кода).</p>
    <p> • Продолжение выполнения задачи до некоторого адреса.</p>
    <p>В этом случае ставится временная точка прерывания на нужный адрес, и задача выполняется, пока этот адрес не будет достигнут. Как и в случае с обычной точкой прерывания, отладчик обеспечивает установку временной точки прерывания на начало строки исходного текста, на конкретный адрес или на точку входа некоторой функции. Однако, помимо этого отладчик может ставить временную точку прерывания на адрес возврата текущей функции, реализуя выполнение задачи вплоть до завершения этой функции.</p>
    <p>Механизм установки временной точки прерывания используется и в режиме пошаговой отладки. Тогда точка прерывания ставится на следующую исполняемую инструкцию или (в случае отладки без захода в вызываемые функции) на инструкцию, следующую за вызовом функции.</p>
    <p> • Возврат из функции.</p>
    <p>Может возникнуть ситуация, когда пользователю понадобится завершить выполнение функции с определенным возвращаемым значением. В этом случае отладчик выполняет следующие действия:</p>
    <p>  a. Приведение заданного пользователем значения к типу возвращаемого значения этой функции.</p>
    <p>  b. Восстановление сохраненных регистров.</p>
    <p>  c. Установка возвращаемого значения в требуемую область памяти/регистр.</p>
    <p>  d. Установка указателя стека на предыдущий кадр.</p>
    <p>  e. Установка точки выполнения программы на адрес возврата заданной функции.</p>
    <p>  f. Уничтожение текущего кадра стека.</p>
    <p>Описывая отладочные действия, стоит упомянуть об инструментальной системе ЭСКОРТ ([27]), созданной в Научно-исследовательском институте системных исследований РАН как средство повышения производительности труда профессиональных программистов. Основу ЭСКОРТа составляет интегрированная система редактирования — компиляции — выполнения.</p>
    <p>Программы в ЭСКОРТе имеют нетекстовое представление. Более точно, все программные объекты представлены как объекты базы данных. Средствами БД ЭСКОРТа реализовано хранение предыдущих состояний объектов (и, в частности, значений переменных), откатка, «откатка откатки» и т. п., что позволяет дать в руки программисту мощные средства контролируемого выполнения (пошаговое, с контролем значений переменных, обратное и т. д.). Правда, на сегодняшний день, для современных систем реального времени, средства, предлагаемые в рамках ЭСКОРТа, представляются слишком тяжеловесными (хотя и весьма перспективными).</p>
   </section>
   <section>
    <title>
     <p>2.3. Пользовательский интерфейс</p>
    </title>
    <p>Помимо получения необходимой информации отладчик должен предоставить ее в удобном для пользователя виде. Для этого служат интерфейсные команды и функции.</p>
    <p>Интерфейс отладчика состоит из:</p>
    <p>• графического интерфейса;</p>
    <p>• режима комадной строки;</p>
    <p>• команд представления данных.</p>
    <p>1) Графический интерфейс</p>
    <p>Основное требование, предъявляемое к графическому интерфейсу активного отладчика — одновременная визуализация информации об отлаживаемой задаче (например, окно исходного текста, диалоговое окно, окно отображения данных и сообщений). При отладке группы задач, необходимо отображать полную информацию о каждой из них, как это реализовано в X-ray.</p>
    <p>2) Режим командной строки</p>
    <p>В режиме командной строки отладчик должен предоставлять пользователю возможность редактировать вводимые команды, а также поддерживать хранение ранее введенных команд в некотором буфере с целью их последующего вызова и модификации.</p>
    <p>3) Команды представления данных</p>
    <p>Приведем некоторые способы представления и хранения данных, реализация которых в значительной степени упрощает работу пользователя:</p>
    <p> • История значений.</p>
    <p>Хранение ранее отображенных значений позволяет следить за изменением инспектируемого выражения. Значения могут храниться в некотором буфере или файле.</p>
    <p> • Внутренний язык отладчика.</p>
    <p>Внутренний язык — средство, дающее возможность пользователю определять собственные функции. Кроме этого отладчик может обладать встроенным интерпретатором какого-нибудь известного языка сценариев. Например, VxGDB обладает встроенным TCL-интерпретатором, позволяющим не только определять новые функции обработки данных, но и (при поддержке с целевой стороны) эмулировать ряд функций VxWorks.</p>
    <p> • Поддержка разных форматов представления данных.</p>
    <p>Уже упоминавшиеся средства отладки (VxGDB, X-Ray) предоставляют возможность вывода интересующего значения в любом числовом или символьном формате. Кроме того, в них имеется поддержка сложных элементов языка, таких как массивы или структуры.</p>
    <p> • Поддержка нескольких языков.</p>
    <p>Если программа собрана из модулей, написанных на разных языках программирования, то для ее полноценной отладки необходима поддержка всех этих языков. Кроме того, VxGDB поддерживает синтаксис основных языков программирования (C, fortran) для своего внутреннего языка, обеспечивая автоматическую его смену при выполнении функции, реализованной на языке, отличном от текущего.</p>
    <p> • Регулярное отображение данных.</p>
    <p>При отладке может потребоваться просмотр некоторых данных (или выполнение команд) при каждой остановке задачи.</p>
    <p>GDB в данном случае предоставляет следующие возможности:</p>
    <p>  a. Команда display. После остановки выполнения задачи (но не в случае, когда она завершилась) производится отображение данных, заданных в качестве аргументов этой команды.</p>
    <p>  b. Команда commands привязывает к точке прерывания, номер которой задан в качестве аргумента, набор действий, которые нужно реализовать отладчику при достижении этой точки прерывания.</p>
   </section>
   <section>
    <title>
     <p>2.4. Интеграция со средствами разработки ПО</p>
    </title>
    <p>Обычно, программный продукт проходит стадии разработки, представленные на рис. 3.</p>
    <image l:href="#mhtAE1.tmp"/>
    <p>Рис. 3. Стадии разработки ПО</p>
    <p>В [24] описан способ, позволяющий уменьшить общее время разработки программного продукта за счет объединения средств тестирования и отладки. Такую возможность предоставляет отладчик Pilot (Kvatro Telecom). Подобное совмещение обладает следующими преимуществами: сразу выявляются ошибки в тесте; имеется возможность генерировать тесты в процессе отладки; результаты теста сразу обрабатываются и в случае ошибки передаются отладчику, который интерактивно воспроизводит этот тест. Средства поддержки отладки могут закладываться на стадии написания исходного текста и компиляции. Во время написания исходного текста в программный продукт может закладываться псевдо-агент — набор функций, осуществляющих некоторые отладочные действия. Для отладки с использованием исходных текстов приложения, необходимо при компиляции генерировать дополнительную информацию, состоящую из описаний символов программы (переменные, функции, типы) и псевдо-символов, позволяющих отладчику определять адреса строк исходного текста, адреса секций, и т.д.</p>
   </section>
  </section>
  <section>
   <title>
    <p>3. Средства мониторинга</p>
   </title>
   <section>
    <title>
     <p>3.1. Архитектура средств мониторинга</p>
    </title>
    <p>Архитектура средств мониторинга в общем случае совпадает с архитектурой средств активной отладки, с той лишь разницей, что агенту отладки запрещено останавливать отлаживаемую задачу и модифицировать ее данные. Вообще, основное требование к средствам мониторинга — сбор данных с минимальным вмешательством в работу целевой системы. Для этого агенту отладки нужно как можно реже обращаться к менеджеру, то есть хранить полученные данные в некотором буфере и пересылать их по мере заполнения буфера. Кроме того, при пересылке данных можно производить их фильтрацию или сортировку в соответствие с некоторым критерием значимости.</p>
    <p>При мониторинге агенту отладки не нужно поддерживать прямой связи с псевдо-агентами, так как псевдо-агенты могут посылать собранные данные в буфер, где они будут накапливаться вместе с остальными данными.</p>
    <image l:href="#mhtB11.tmp"/>
    <empty-line/>
    <p>Рис. 4. Архитектура отладчика, осуществляющего мониторинг</p>
    <p>Отладочные действия при мониторинге можно разделить на следующие категории:</p>
    <p>• сбор данных;</p>
    <p>• анализ данных;</p>
    <p>• профилирование системы;</p>
    <p>• «посмертный» анализ.</p>
    <p>1) Сбор данных</p>
    <p>Существует несколько способов сбора данных на целевой машине и передачи их менеджеру:</p>
    <p> • Передавать данные на инструментальную сторону по мере их поступления.</p>
    <p>Этот способ применяется при оперативной отладке.</p>
    <p> • Передавать данные в случае заполнения буфера.</p>
    <p>Обычный способ сбора данных при мониторинге.</p>
    <p> • Сохранять данные на диске.</p>
    <p>Таким способом можно получать данные для последующего анализа (конечно, лучше осуществлять сохранение данных с инструментальной машины, уже получив их).</p>
    <p>Сбор данных может осуществляться однократно, циклически или непрерывно. При этом отладчик может совершать следующие действия:</p>
    <p>  • начать сбор данных (указывается способ сбора, буфер или имя файла, период сбора, время между циклами или время завершения);</p>
    <p>  • прервать сбор данных;</p>
    <p>  • запланировать начало и/или конец сбора данных по времени, получению сигнала или произошедшему событию.</p>
    <p>Данные могут представлять собой как информацию о задаче (содержимое регистров, стека, и.т. д), так и информацию о системе в целом (протокол произошедших событий, протокол выделения памяти).</p>
    <p>Один из способов протоколирования событий заключается в том, что на функции, исполнение которых приводит к некоторому событию, ставится специального вида точка прерывания (eventpoint). Такой подход позволяет пользователю определять собственные события (как это сделано в WindView — Wind River Systems, целевая система VxWorks).</p>
    <p>Теперь рассмотрим технологию сбора данных на примере StethoScope (Wind River Systems, целевая система VxWorks). При сборе данных о функции используется механизм вставки исполняемого кода перед и после вызова отлаживаемой функции. Его суть в том, что пользователь может задать функции, вызовы которых будут предварять и завершать исполнение требуемой процедуры. Этот механизм используется и в служебных целях, например при трассировке задачи. Реализовать его можно так: на первую инструкцию отлаживаемой функции ставится точка прерывания, обрабатываемая особым образом, а именно:</p>
    <p>  a. ставится точка прерывания на точку возврата из отлаживаемой функции;</p>
    <p>  b. передается управление функции, которая должна быть вызвана перед отлаживаемой (если такая определена);</p>
    <p>  c. запускается выполнение отлаживаемой функции.</p>
    <p>Затем при обработке второй точки прерывания вызывается функция, реализующая некоторый набор завершающих действий.</p>
    <p>При сборе информации о динамическом выделении памяти можно использовать такой подход (RTILib — Real-Time Innovations, целевая система VxWorks). Заменить функции выделения и освобождения памяти (malloc, calloc, realloc, free) на соответствующие функции, выполняющие, помимо работы с памятью, некоторые отладочные действия, а именно: маркировку границ выделенного блока и последующий контроль за ее сохранностью (так можно фиксировать выход за границы), установку флага доступа к блоку (для запрещения/разрешения обращения к этому блоку), сбор статистики по использованию памяти, протоколирование информации по выделенным блокам.</p>
    <p>2) Анализ данных</p>
    <p>Нас интересует следующая классификация видов анализа:</p>
    <p> • Анализ на инструментальной стороне.</p>
    <p>Рассматриваемые средства отладки обеспечивают анализ не только данных, полученных во время текущего сеанса отладки, но и данных, полученных ранее и сохраненных на диске. Кроме того, при обработке данных фиксируется время их получения, а для событий — время, в которое они произошли.</p>
    <p> • Анализ на целевой стороне. </p>
    <p>Некоторые данные требуют анализа на целевой стороне. Например, контроль работы задач с динамически выделенной памятью. В этом случае при обращению к адресу в памяти происходит проверка на принадлежность его к какому-либо блоку и возможность доступа. Чтобы избежать проблем с динамическим выделением памяти и ускорить доступ к ней, StethoScope предоставляет возможность создания пула из некоторого числа буферов одинакового размера. Тогда, используя соответствующие функции доступа к этому пулу, можно осуществлять быстрый захват и освобождение его буферов. </p>
    <p> • Распределенный анализ. </p>
    <p>При передаче данных на инструментальную сторону отладчик может производить их предварительный анализ — фильтрацию. Фильтрация представляет собой отбор данных в соответствии с некоторым заданным шаблоном (фильтром). Например, можно рассматривать события только некоторых определенных типов (переключение контекста, запуск задачи, и.т. д) или сравнивать полученные данные с некоторой маской значений. Фильтрация данных нужна, чтобы уменьшить вмешательство в работу целевой системы, то есть можно разбить отладку на несколько уровней: от минимального (исследование событий одного вида, например, переключение контекстов) до максимального (получение подробной информации о каждом событии в системе и данных о выполняемых задачах). В WindView представлены 3 уровня отладки: </p>
    <p>  a. протоколирование переключения контекстов </p>
    <p>  b. протоколирование состояний задач </p>
    <p>  c. протоколирование статусов системных объектов. </p>
    <p>3) Профилирование системы </p>
    <p>Под профилированием понимается один из способов мониторинга, позволяющий следить за выполнением некоторого множества задач (или всей системы) и предоставляющий пользователю информацию о том, как конкретная задача использует процессор (включая распределение времени в задаче). </p>
    <p>Профилирование заключается в том, что с некоторой частотой производятся выборки данных об активных в этот промежуток времени задачах. При детальном профилировании собираются данные о каждой функции (количество ее вызовов, время выполнения). Приведем описание модуля ScopeProfile, входящего в StethoScope и представляющего собой типичный образец агента профилирования. </p>
   </section>
   <section>
    <p>Сбор данных запускается либо специальной высокоприоритетной задачей, либо посредством ISR (Interrupt Service Routine). Существует два уровня профилирования: профилирование задачи способом «процедура за процедурой» (procedure-by-procedure) и профилирование системы способом «задача за задачей» (task-by-task). Основные параметры профилирования: частота выборки (sample rate) — частота, с которой производится сбор данных; частота анализа (analysis rate) — частота, с которой производится анализ имеющихся в буфере выборок. Анализирующая процедура представляет собой низкоприоритетную задачу, которая подсчитывает среднее из значений для задач и функций из всех выборок буфера и значений, полученных в ходе предыдущего анализа. </p>
    <p>Цель профилирования задачи — выявить наиболее часто исполняемые блоки для последующей их оптимизации. Для этого служит способ «процедура за процедурой», позволяющий получать информацию о каждой вызываемой в процессе профилирования функции. Эта информация состоит из среднего времени, которое функция выполнялась, с учетом и без учета времени вызова из нее других функций. Также подсчитывается число ее вызовов. В результате анализа стека строится так называемое дерево выполнения (execution tree), показывающее маршрут вызова каждой функции. </p>
    <p>Способ «задача за задачей» служит для сбора информации об активности системы в целом, а именно, какое процессорное время использует каждая задача. </p>
    <p>4) «Посмертный» (post-mortem) анализ </p>
    <p>Подобный анализ производится в том случае, если в работе системы произошел сбой. Тогда пользователя интересуют не все события, а только те, которые произошли за некоторое время до «обвала» системы. В этом случае, чтобы влияние отладчика на систему было сведено к минимуму, все данные сохраняются в некотором буфере и обновляются по мере его заполнения, но не пересылаются на инструментальную сторону. Адрес для буфера надо выбирать так, чтобы при перезагрузке системы его содержимое не уничтожалось. В VxWorks это можно реализовать следующим образом: надо изменить функцию sysMemTop(), определяющую верхний адрес локальной памяти, так, чтобы она возвращала значение, меньшее действительного адреса. Тогда в образовавшемся адресном пространстве, недоступном системе, можно расположить буфер данных. В результате после перезагрузки в распоряжение отладчика поступают данные о последних событиях, произошедших в системе и, возможно, повлекших ее сбой. </p>
   </section>
   <section>
    <title>
     <p>3.3. Пользовательский интерфейс </p>
    </title>
    <p>При анализе данных или профилировании важную роль играет представление полученной информации. Как и в случае активной отладки пользовательский интерфейс делится на три составляющих: графический интерфейс, режим командной строки и команды представления данных. </p>
    <p>Графическое представление данных — наиболее важная часть пользовательского интерфейса при мониторинге. Поскольку, как правило, анализируется взаимодействие задач в системе, то нужна визуализация всех событий и задач системы. В WindView для этого служит специальное окно View Graph. По горизонтали откладывается время (единичный интервал времени может меняться), по вертикали приведен список всех задач в системе и уровни прерываний. В такой системе координат легко увидеть, какая задача в какой момент времени в каком состоянии находилась. Особыми значками отмечаются происходящие события, подробности о которых (также как и о задачах) можно увидеть в другом окне. </p>
    <p>При мониторинге текущего состояния системы удобно пользоваться графическим интерфейсом, но при анализе сохраненных ранее данных, а также при «посмертной» отладке, можно использовать режим командной строки. Требования к нему предъявляются аналогичные тем, что были у средств активной отладки. </p>
    <p>Помимо описанных в предыдущей главе команд представления данных у активных отладчиков средства мониторинга могут располагать также такими командами: </p>
    <p>• исполнение некоторой последовательности действий при произошедшем событии, поступившем сигнале или наступлении определенного момента времени; </p>
    <p>• определение пользователем собственных событий (eventpoints в WindView) и сигналов (комбинации известных сигналов «derived signals» в StethoScope).</p>
   </section>
   <section>
    <title>
     <p>3.4. Интеграция со средствами разработки ПО </p>
    </title>
    <p>При мониторинге особое внимание уделяется работе псевдоагентов, которые закладываются в код программы на этапе компиляции. Для их успешной работы по сбору необходимой информации требуется наличие на целевой машине ряда функций, вызываемых псевдо-агентами. Эти функции могут быть собраны в одну библиотеку, так называемую библиотеку доступа (access library). В [20] описывается средство работы с псевдо-агентами — «Alamo monitor». На Рис. 5 приведена его архитектура.</p>
    <image l:href="#mhtB41.tmp"/>
    <p>Рис. 5. Alamo monitor </p>
    <p>Координатор мониторинга посылает запросы псевдо-агенту и производит фильтрацию полученной информации.</p>
    <image l:href="#mhtB71.tmp"/>
    <p>Рис. 6. Получение информации от псевдо-агента </p>
    <p>В зависимости от возможностей, предоставляемых библиотекой доступа, изменяется и роль псевдо-агентов. Возможна ситуация, когда на целевой стороне присутствует только агент доставки данных из буфера, а все данные поставляются псевдо-агентами. Такой подход уменьшает воздействие отладчика на систему, так как все отладочные действия заложены при компиляции, и агент отладки только передает данные менеджеру по мере заполнения буфера, то есть не влияет на ход выполнения отлаживаемых задач. </p>
    <p>Имеется и другое применение псевдо-агентов. При помощи встраивания в код программы некоторого некорректно работающего блока, можно моделировать критические ситуации и анализировать поведение задачи или всей системы в таких ситуациях. </p>
   </section>
  </section>
  <section>
   <title>
    <p>4. Особенности отладки многоплатформных распределенных систем</p>
   </title>
   <section>
    <title>
     <p>4.1. Особенности архитектуры</p>
    </title>
    <p>Если раньше система реального времени рассматривалась нами как один процесс (с точки зрения ресурсов), то распределенные СРВ представляют уже набор взаимодействующих процессов. </p>
    <p>Специфика заключается в том, что отлаживаемое приложение может быть распределено на нескольких платформах с разными процессорами, поэтому эффективность отладчика зависит от: </p>
    <p>• наличия на каждом компоненте системы агента отладки; </p>
    <p>• способности менеджера работать со всеми процессорами системы; </p>
    <p>• возможности агентов отладки осуществлять связь между собой и с менеджером. </p>
    <p>Кроме того, если система состоит из большого числа компонент, использование двухуровневой архитектуры "менеджер-агент" становится неэффективным, поскольку менеджер не сможет обработать в надлежащее время информацию от агентов. В этом случае целесообразно использовать многоуровневую структуру, в которой компоненты, объединенные по своим функциональным возможностям, представляют некоторые подсистемы, которыми управляют соответствующие менеджеры, являющиеся агентами на следующем уровне предложенной иерархии.</p>
    <p>При включении в систему новой платформы необходимо, чтобы менеджер имел возможность осуществлять связь с агентом. Для этого к набору исходных текстов менеджера добавляется файл, содержащий функции взаимодействия с агентом. Здесь возможны следующие варианты:</p>
    <p>• Файл описания платформы требует компиляции и сборки вместе с остальными исходными текстами. </p>
    <p>Существенный недостаток такого подхода в том, что менеджер или какую-либо его часть придется пересобирать. </p>
    <p>• Файл описания интерпретируется внутренними средствами менеджера. </p>
    <p>В [17] описан отладчик Panorama, платформо-зависимые черты, которого вынесены в отдельные файлы: файл описания платформы (агента) и tcl-скрипт, в котором описаны необходимые функции. Таким образом, имея встроенный tcl-интерпретатор, Panorama способен работать с новой платформой без пересборки менеджера. Архитектура этого отладчика приведена на рис. 7.</p>
    <image l:href="#mhtBA1.tmp"/>
    <p>Рис. 7. Отладчик Panorama</p>
    <p>В случае, если один агент обслуживает несколько менеджеров, целесообразно организовать промежуточное звено, в которое вынести все платформо-зависимые черты менеджеров. Такой подход реализован в среде разработки ПО реального времени TORNADO (система VxWorks). Он заключается в том, что на целевой стороне имеется универсальный агент (target agent), осуществляющий связь со средствами разработки ПО посредством целевого сервера (target server). В этом случае, во-первых, все клиенты работают с одним сервером (и, соответственно, с одним агентом) и, во-вторых, они имеют возможность обмениваться данными между собой, используя целевой сервер.</p>
   </section>
   <section>
    <title>
     <p>4.2. Некоторые подходы к отладке распределенных приложений</p>
    </title>
    <p>При отладке распределенного приложения в целом нужно представлять общее его состояние, которое включает структуры данных, распределенные по нескольким платформам. Кроме того, необходимо иметь протокол взаимодействия задач в системе. </p>
    <p>Взаимодействие задач, исполняемых на разных процессорах, можно протоколировать, используя вместо стандартных функции связи, передающие необходимую информацию менеджеру. Чем более полной является эта информация, тем проще менеджеру с ней работать, но тем большее влияние на работу системы оказывает сеанс отладки, в результате чего могут возникать новые динамические ошибки. В [9] описана система DARTS (Debug Assistant for Real-Time Systems). С ее помощью можно проводить полноценный сеанс отладки без наличия какой-либо отладочной информации в приложении. Для этого необходимо правильно сопоставить полученный от системы поток событий с исходными текстами приложения. Этот процесс происходит в 2 этапа: разбор исходных текстов и непосредственно само сопоставление. </p>
    <p>При разборе исходного текста для каждой задачи генерируется последовательность следующих программных элементов: </p>
    <p>• системные вызовы; </p>
    <p>• условные конструкции; </p>
    <p>• циклы; </p>
    <p>• вызовы функций, описанных в программе; </p>
    <p>• библиотечные вызовы. </p>
    <p>После трассировки приложения необходима полная информация для полученного потока событий с целью его дальнейшей отладки. Для этого происходит такое сопоставление: </p>
    <p>• системные вызовы сравниваются по именам и параметрам; </p>
    <p>• условная конструкция считается обнаруженной в протоколе, если присутствует один из вариантов; </p>
    <p>• цикл считается найденным, если он присутствует в протоколе 0 и более раз (каждый раз ищется максимальное число его вхождений); </p>
    <p>• программные вызовы идентифицируются по вхождению в протокол тела подпрограммы; </p>
    <p>• для каждой библиотечной функции строится набор возможных последовательностей системных вызовов. Функция считается присутствующей в протоколе, если обнаружена некоторая последовательность из ее характеристического набора. </p>
    <p>В результате получается набор гипотез о ходе выполнения приложения (включая вызовы функций, время и процессор). Информация может уточняться, если задавать некоторые интервалы выполнения (например, протоколирование выполнения конкретной задачи). После таких уточнений получаем символьную и строковую информацию о произошедших событиях. </p>
    <p>Еще один подход к отладке распределенных приложений предложен в [16]. Описанный там отладчик Ariadne позволяет проверять, произошла ли некоторая заданная для конкретной задачи последовательность событий. Механизм проверки осуществлен следующим образом.Сперва создается граф хода выполнения приложения, построенный на протоколе работы приложения. Затем пользователь задает цепи - последовательности событий, которые будут искаться в графе хода выполнения приложения. Следующим шагом является создание p-цепей - это цепи, для которых указаны конкретные задачи, где ожидается возникновение данной последовательности событий. В итоге формируется шаблон поиска - pt-цепи, которые представляют собой логические композиции p-цепей. Если в графе хода выполнения встречается pt-цепь, то считается, что запрос удовлетворен, и возвращается так называемое абстрактное событие - подграф, содержащий встретившиеся экземпляры событий. Эти экземпляры удаляются из графа хода выполнения, и анализ событий продолжается. Если все pt-цепи присутствуют в графе, то тест считается успешно завершенным. Ввиду асинхронности выполнения ошибка может состоять в том, что нарушен порядок возникновения абстрактных событий. Для локализации таких ошибок в Ariadne реализованы следующие соотношения между абстрактными событиями: </p>
    <p>• A предшествует B, если существует зависимость некоторого события из B от некоторого события из A; </p>
    <p>• A параллельно B, если события в A и в B независимы; </p>
    <p>• A перекрывает B, если существует как зависимость события из A от события из B, так и обратная зависимость.</p>
    <p>Проверка полученных абстрактных событий на соответствие этим соотношениям позволяет выявлять ошибки, связанные с асинхронностью. </p>
    <p>В [26] излагается способ отладки РСРВ посредством моделирования системы сетями Петри с временными ограничениями (timing constraint Petri nets, TCPN). TCPN - это граф ; где P - множество позиций; T - множество переходов; F - множество дуг, соединяющих позиции и переходы; C - множество целочисленных пар (TCmin(pt),TCmax(pt)), где pt может быть и позицией, и переходом; D - множество чисел FIRE(pt), обозначающих время срабатывания pt; и М - множество маркеров. </p>
    <p>Говорят, что переход t разрешен, если каждая из входных позиций содержит по крайней мере один маркер. Если к моменту Т0 переход t разрешен, то он может сработать в течении времени от Т0 + ТCmin(t) до T0 + TCmax(t). Переход t сработал успешно, если он продолжался не более FIRE(t) временных единиц, иначе происходит срабатывание других переходов. В случае, когда не срабатывает ни один из переходов, все маркеры остаются на своих местах. Таким образом локализуются ошибки в РСРВ. </p>
    <p>Одной из серьезных ошибок, связанных с работой распределенного приложения в системе реального времени, является недетерминированность. Ее суть заключается в том, что при разных запусках приложения при одних и тех же входных данных получаются разные результаты. </p>
    <p>В [8] описан подход к обнаружению недетерминированности в системах, использующих в качестве связи между задачами сообщения. В таких системах недетерминированность может быть вызвана либо задержками сообщений, либо сменой алгоритма планирования. Следует отметить, что в приложении может быть специально заложена некая недетерминированность, поэтому нужно такой случай выделять. Предлагается такая стратегия обнаружения ошибочной недетерминированности: </p>
    <p>• для каждого сообщения определяется некоторый идентификатор; </p>
    <p>• при получении сообщения идентификатор обрабатывается, и создается некоторая, специфическая для получившей задачи, интерпретация сообщения; </p>
    <p>• совершается проверка, удовлетворяет ли эта интерпретация некоторому порядку получения сообщений данной задачей. Такой подход позволяет обходить случаи встроенной недетерминированности путем определения одинаковой интерпретации для соответствующих сообщений. </p>
   </section>
   <section>
    <title>
     <p>4.3. Способы представления данных</p>
    </title>
    <p>Существуют разные способы представления данных. ([7],[13]). Наиболее распространенный из них - графический. Например, Panorama предоставляет следующие возможности (предполагается, что система использует в качестве механизма связи сообщения): </p>
    <p>• карта процессоров (процессоры и их соединения, а также текущие сообщения между ними); </p>
    <p>• окно отладки (состояния задач, данные, и.т.п.); </p>
    <p>• окно потока сообщений (все сообщения между процессорами во времени (и время приема, и время получения). </p>
    <p>В дополнение к графическому способу можно использовать, например, звуковой, как это описано в [14]. Преимущество использования звука при отладке состоит в том, что при большом объеме собранных данных может быть сложно обнаружить ошибку визуально. Например, если в процессе работы затерялось какое-то сообщение от одного процессора к другому, то, анализируя графическое представление взаимодействия процессоров, трудно найти потерянное сообщение, так как оно может быть графически просто не представлено. Однако, если каждое сообщение (от посылки до получения) будет сопровождать некоторый звуковой сигнал, то потерянное сообщение будет сразу обнаруживаться. </p>
    <p>Как видно, при отладке распределенных приложений необходимо учитывать связь между процессорами и, в основном, асинхронный ее характер, то есть на первое место выступает обнаружение ошибок, связанных со взаимодействием задач и усиленных тем, что задачи выполняются на разных процессорах. </p>
   </section>
  </section>
  <section>
   <title>
    <p>5. Заключение</p>
   </title>
   <p>Мы рассмотрели основные черты средств активной отладки и мониторинга для распределенных систем реального времени, а также ошибки, характерные для РСРВ, и способы их обнаружения. </p>
   <p>Существующие активные отладчики играют важную роль в разработке ПО при поиске логических ошибок, предоставляя широкий набор средств, включающих поддержку исходных текстов, трассировку выполнения приложения, динамическую модификацию памяти, и.т.д. Однако они не позволяют выявлять специфические ошибки СРВ. </p>
   <p>Описанные в работе средства мониторинга имеют схожие методы сбора, обработки и представления отладочных данных. Благодаря им становится возможным локализовывать ошибки СРВ, связанные с планированием и синхронизацией. </p>
   <p>В случае РСРВ пока не существует общего подхода к отладке, поскольку ошибки, обусловленные связью, имеют разное проявление. В работе приведено описание некоторых способов отладки, позволяющих выявлять такие ошибки. Разработка универсальных методов отладки РСРВ - тема дальнейшего исследования. </p>
  </section>
  <section>
   <title>
    <p>Список литературы</p>
   </title>
   <p>1. C.D. Locke, "Fundamentals of Real-Time", Lockhead Martin, 1998 </p>
   <p>2. "Realtime CORBA", White Paper — Issue 1.0, 1996/Dec </p>
   <p>3. "It's all a question of time…", Real-time magazine, 1997/4th Quarter </p>
   <p>4. R.O'Farrel, "Choosing a cross-debugging methodology", Embedded systems programming, 1997/Aug </p>
   <p>5. K.Clohessy, "Using object-oriented programming tools to build real-time embedded systems", Real-time engineering, 1996/Fall </p>
   <p>6. V.Encontre, "How to use modeling to implement verifiable, scalable, and efficient real-time application programs", Real-time engineering, 1997/Fall </p>
   <p>7. N.Osawa, H.Morita, T.Yuba, "Animation for perfomance debugging of parallel computing systems", ACM, 1997 </p>
   <p>8. S.K.Damodaran-Kamal, J.M.Francioni, "Nondeterminacy: testing and debugging in message passing parallel programs", ACM, 1993 </p>
   <p>9. M.Timmerman, F.Gielen, P.Lambrix, "High level tools for the debugging of real-time multiprocessor systems", ACM, 1993 </p>
   <p>10. A.von Mayrhauser, A.M.Vans, "Program understanding behavior during debugging of large scale software", ACM, 1997 </p>
   <p>11. J.Lang, O.B.Stewart, "A study of the applicability of existing exception-handling techniques to component-based real-time software technology", ACM, 1998 </p>
   <p>12. P.Fritzson, T.Gyimothy, M.Kamkar, N.Shahmehri, "Generalized algorithmic debugging and testing", ACM, 1991 </p>
   <p>13. D.Zernik, L.Rudolph, "Animating work and time for debugging parallel programs. Foundation and experience", ACM, 1991 </p>
   <p>14. J.M.Francioni, L.Albright, J.A.Jackson, "Debugging parallel programs using sound", ACM, 1991 </p>
   <p>15. T.Kunz, "Process clustering for distributed debugging", ACM, 1993 </p>
   <p>16. J.Cuny, G.Forman, A.Hough, J.Kundu, C.Lin, L.Snyder, D.Stemple, "The Ariadne debugger: scalable application of event-based abstraction", ACM, 1993 </p>
   <p>17. J.May, F.Berman, "Panorama: a portable, extensible parallel debugger", ACM, 1993 </p>
   <p>18. В.В.Липаев, Е.Н.Филинов, "Мобильность программ и данных в открытых информационных системах.", РФФИ, 1997 </p>
   <p>19. A.J.Offutt, J.H.Hayes "A semantic model of program faults", ACM, 1996 </p>
   <p>20. C.Jeffery, W.Zhou, K.Templer, M.Brazell "A lightweight architecture for program execution monitoring", ACM SIGPLAN 1998/july </p>
   <p>21. L.Mittag "Multitasking design and implementation", Embedded system programming, 1998/march </p>
   <p>22. E.Ryherd "Software debugging on a single-chip system", Embedded system programming, 1998/march </p>
   <p>23. N.Cravotta "Real-time operating systems", Embedded system programming, 1997/march </p>
   <p>24. J.E.Stroemme "Integrated testing and debugging of concurrent software systems", the sixth IFIP/ICCC conference on information network and data communication, Trondheim, Norway, 1996/june </p>
   <p>25. J.Ready "Distributed applications bend RTOS rules", CMP Media Inc., 1996 </p>
   <p>26. J.Tsai, Y.Bi, S.Yang, R.Smith "Distributed real-time systems. Monitoring, visualization, debugging, and analysis", Wiley-Interscience Publication, 1996 </p>
   <p>27. В.Б.Бетелин, В.А.Галатенко "ЭСКОРТ — инструментальная среда программирования.", Юбилейный сборник трудов институтов Отделения информатики РАН. Том. II. Москва, 1993.</p>
  </section>
 </body>
 <body name="notes">
  <title>
   <p>Примечания</p>
  </title>
  <section id="n_1">
   <title>
    <p>1</p>
   </title>
   <p>Под процессом понимается держатель ресурсов (например, память, данные, дескрипторы открытых файлов), которые не разделяются с другими процессами. В рамках одного процесса выполняются один или несколько потоков. Они совместно используют ресурсы процесса.</p>
  </section>
 </body>
 <binary id="mhtA81.tmp" content-type="application/octet-stream">R0lGODlhxgDQAIAAAAAAAP///yH5BAAAAAAALAAAAADGANAAAAL/jI+py+0Po5y02ouz3rz7
D4biSJbmiabqyrbuC8fyTNf2jef6rgP+DwwKh8Si8YhMKpfMplOYeUqn1Kr1Wo0CeNyuwaf1
intbDHiMrp0v67T71a7E3/TUfHKv60f5SH8P2PH3MBhoyFaGeLjoUdjgyBj5mGgBKXmJYKmg
iXnJmUnZKcrweVA6anga4IjV6vr6GmYWSgpre4uLJKsIoYrKR4sXLME6/Atn3JtMuPzVfKyi
Kv3sC/0xvetQbS34XJs9yT2DPevnLU5CzsuMHqNeSX3eHvIuF29dJg9ST1HMvQ2unz5Q5uYh
CyisoLIgq7as+eGsocNEUCRSZCgxo0VT/2f6QHwI0RkQZQiJ3fNjiuOXlA1TOsy0chXMmJQo
xryZb9nLfDNl+mRXLijQXix/2nwpchPOkTRBhazp8mctqEV5khQKTyFRnFVl2pTq0ypXqV+p
egWr1GhPsdoGqsQaDuVYo2LLhl3K0izbizdJ5V3bN+66rFeZTcwJMunTiUkzFlHcMWRLjQsW
i0TMtG1JrZqj2EngVkSoZvwSFoYXul1pk5wNRku9GnRq13AFbiZIe0Xs04Jzo9g9tLPv37CL
tx6eznjtyrORs17+PLhzYLelf5teArjwtrm6e79Vffuk7+TLZ4F+PFVzQNrpANTT/s37OvHd
zHevPNJ9+fkZ7f+3398i/6VRH4Hr7VEgGgMqGOAhC46RIIQHwtegegZFKMaDGVYYiIZeYPjh
hPRxKJt5Jp6oRHi9jYdiiy5mRthgK2K3D4m8XUejaDZax1yO1KF3Y48+0rOjeDgO2UiRMwqJ
ZJIqHrlkk0DyGJ2RUk5pZZVRXmnPk0xmyaVtWG6JWw6SXXbZRWeqoSSUbtLwlVpzxcmml5uc
dMNoaM1ZVJ1jvnmnmaDtKedGOIA4GZXuDDoMjHTC2eaXZMLBqF9pEQoDov4Iymdgc/kpo5iK
yrCmZKXCCGqMqk4aZpBaigpmq+m9atqostoaK66J3trln5ICyquuwLoqW7CrwtqrsMb/vhVq
rbkuW6yvgRIL7bTN0mpttcpmm+yz2u7abbhTvUguinZGa1i56pZ3bpn+iYhfuxteGKmB9Mob
4r3SMqjvtezByx++XXg4cL38zoMoFwQrbLCE/R5rIcINzyuxwAw/LG7Eqk2cb8VjrgsyeQIX
E3LJ4O3rLqvfaorntyoPq+vCw7E8q8vMQowtujb/6mzG3O6cMrJC8ww0uEPnHHTRRvd8tM5K
R4TyzS9XSzO1Nle97bJYe2sPSAwNgWZEbWRmBGS7osrB1lMTA1inellFFdxkvbVXjSO3nKSp
XS2lN98dNXXX3hbBqzbMlbRdaN1jmRWY4oF7qkHhRHsGdeJ//1VuV+WexpH50ner+N9HhzkG
xmKMGWp2Y32GnXo3n1udZ+RoAZx10khLzcOaQuueHceeO/205D8rLTzwxPu+6dO4M8388EUX
bzvQ0C//PPJ4B299zTtPn6bJ3l/xerrfj09F+Mrr5vv5UWuuPnEWt++z9vDbvf788cNuf9rp
5y8/1/zXLzP4Jex/taMeAfX3vgMabm0KvJ3/GuhABkKwgOybYOT2Z0ED4i+DG5wcB5vXvw9S
8HciDOECS3hCD6LwgcZbYQed50IWRi+GKYShHQJ4jAHKDnK80qEZGFW6nEzGdEEcoqmCODoj
4hCAtGPbTHZCt75AsXRzc5vjcofBH38+kXN7G01NMDK4qGBmiTgzoWgG9TjLze0hllILUprY
uwRSTo2FOttK2IK4v2FqBz7UgpqghqovtiQypiNdY8CIRTn+Rilw/JciTXAqGvXRgpOcYCUh
eMkGZlKBmzxgJwn4yf+Fkn/TIJ8pyefHU6qyZDRspStfCctYynKWrSoAADs=</binary>
 <binary id="mhtAB1.tmp" content-type="image/png">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</binary>
 <binary id="mhtAE1.tmp" content-type="image/png">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</binary>
 <binary id="mhtB11.tmp" content-type="image/png">R0lGODlhCgIhAYAAAAAAAP///yH5BAAAAAAALAAAAAAKAiEBAAL/jI+py+0Po5y02ouz3rz7
D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1yANxDVwsO
v7iAAFmM3nrL6bZbxDa/5xN22d49m/MGsn8PuIf3J9inV3jmp0do+HfYWCgY1/jFkEi5eJg3
yZj4xUjXETf6qDhI2vkoOalwufqpeccZK3vqZifX56VryIsb+OuLx0s86qvLiRDMWkyc+8ys
vHYsl9ybaw3tHB16YfwM/pv9Pb7bQEp9J30drE3tHKYOTRgt3vwui624tpgOulwqlSZzlhbY
K/duHq1K3TSQ22fuVCWIqwhyg5cunMVt//wmgoqHbSO4Vgm+hUQmj5tJjgRPunOXTZKDixpF
unzZjmZDCeTOJVyHDKhMn0RZwgTas2U8k0nhsVrJ0JpKpeNwLbMJ0KZBoTXv3WRaTOdOCE2l
2du6C51XtE6Fgu3alCEYj7UifQwod9YgTJBoKdsEbJPfTPlg0bwbFa9eVHYBj/Vmim9giZgY
O1ZVUpXiv4npNs73OAMzeaEjiC3N4nQS1ahLaGYdGnPrMVVkz76NO7fu3bx7+/4NPLjw4cSL
Gz+OPLny5cybO38OPbr06dSrW7+OPbv27dy7e/8OPrz48eTLmz+PPr369ezbu38PP778+fTr
zzaFP7/+/fz7+///D2CAAg5IYIEGymXDgQouyGCDDj4I4YEbREhhhRZeiKGCO2TIYYcefpjh
hLDZ9wGCNZhI4hgjtrJiiiJu2KKLIaBYR4wyQgbjjTLQyJONOlLAYwxB/uiaj4EQWWSOSLYw
5ANNLonBk0waCWUFUlpCZZUGZQkHl1qSZeSVX5rmJQhNgohmgGSm2WGPL45ZYplxrslmnfjR
aaeFbjok55diqnBmn0UEOsWTf2YG55w6EPoGo1EYGqagVR6KgqNtWPoEpG8muoWkm87kqRCY
OqEpn5yKEqpop1Ga6aqpwlCqqqd2qqSTr/4wahOxRnmrjqyakOtSZBaq2q9HzsprraD/zhHs
ErviiKysi7rKLLVSPGuBsbNqO0KzWni7WrGRRittDuBy1iug1tpKEQ/YWpmujNx2OaxpSjm7
rpP3TrtnueTCq+w5q245DCKV2fIZIhARlq/APFnEByUdGbaQv8ua+m+28dZYr75ofTLNSaTp
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
jd3Zrd3bzd3d7d3fDd7hnR4FAAA7</binary>
 <binary id="mhtB41.tmp" content-type="image/png">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
FhugPweeejsspsvJnezJnwQMSgUAADs=</binary>
 <binary id="mhtB71.tmp" content-type="image/png">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</binary>
 <binary id="mhtBA1.tmp" content-type="image/png">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</binary>
</FictionBook>
