Главная страница  Цифровые системы 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90]

Глава 10. Программирование систем реального вп

- -----"t-srvig

реального времени в разделе 10.7. Msltp ьно-теоретический характер, последнпр „

систем для программирования задач

первых пяти разделов носит формально-теоретический характер, последние двэ" ориентированы на практические задачи.

10.1. Общее понятие о процессах

10.1.1. Последовательное программирование

и программирование задач реального времени

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

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

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

входные данные

последовательная программа

выходные данные

Рис. 10.1. Обработка данных последовательной программой

Таким образом, последовательная программа работает как фильтр для исходны данных. Ее результат и характеристики полностью определяются входными д ми и алгоритмом их обработки, при этом временные показатели играют, как "Р ,. второстепенную роль. На результат не влияют ни инструментальные (язык протр мирования), ни аппаратные (быстродействие ЦП) средства: от первых зависят у лия и время, затраченные на разработку и характеристики исполняемого оДу. вторых - скорость выполнения программы, но в любом случае выходные данн дут одинаковыми. от

Программирование в реальном времени (real-time programming) отличав последовательного программирования - разработчик программы должен пос но иметь в виду среду, в которой работает программа, будь то контроллер волновой печи или устройство управления манипулятором робота. В система ального времени внешние сигналы, как правило, требуют немедленной pea ароцессора. В сущности, одной из наиболее важных особенностей систем реаль

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

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

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

10.1.2. Программы и процессы

Основным объектом в системах реального времени является процесс (process) или задача (task). Между программами и процессами имеется существенное различие. Программы представляют собой информацию о том, как обрабатывать и преобразовывать исходные данные, а процессы суть программы, исполняемые процессором. Процесс состоит из кода, т. е, инструкций программы - области кода, области данных, в которой хранятся переменные и константы, свободной динамически распределяемой рабочей области памяти - кучи (heap) и стека (stack) (рис, 10.2). Два Последних механизма зависят от конкретной реализации. Область стека примыкает куче и расширяется за ее счет. Программа, написанная на одном и том же языке bicoKoro уровня, а затем откомпилированная и исполняемая на разных ЭВМ, по-ождает различные процессы, каждый из которых имеет собственные области ко-ид и данных, кучу и стек.

Нии*™ любой момент времени находится в точно определенном состоя-

лас описываемом содержимым регистров процессора, расположением об-

Мую стека и счетчиком команд, указывающим следующую исполняе-

Чроц "У области кода. Эта базовая информация об исполняющемся Щй называется его контекстом (context). Существование контекста - это общее стыо"° процессов, а то, какие регистры, структуры и указатели реально являются ча-

контекста, зависит от используемого процессора и операционной системы. Част типом процессов являются потоки (threads). Они представляют собой

Гом "Р°Рь1, которая может независимо исполняться на том же сам или дру-Пот "Роре. Потоки порождаются процессом и выполняются параллельно, т. е. 3 ° - это дочерний процесс (childprocess). В отличие от процессов, потоки исполь-т общую область данных, т. е. переменные породившего их процесса. Однако

*5ак 1021



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

старшие адреса \

стек

рабочая область -куча

область данных (переменные и константы)

область кода программы

указатель вершины стека (стек расширяется в сторону младших)

указатель данных

счетчик команд

младшие адреса ; Рис. 10.2. Пример организации внутренней памяти процесса

Последовательность преобразования программы в процесс состоит из сохранения исходного текста на компьютерном носителе (магнитная лента или диск), компиляции {compilation), связывания {linking), загрузки {loading) и исполнения {execution). Эти шаги детально описываются в учебниках по программированию и операционным системам и здесь рассматриваться не будут.

10.1.3. Параллельное программирование,

мультипрограммирование и многозадачность

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

Мультипрограммирование {multiprogramming) или многозадачность {multitas/mg) есть способ одновременного исполнения нескольких процессов. Такого эффекта моЖ но добиться как для одного, так и для нескольких процессоров: процессы исполняют либо на одном, либо на нескольких связанных между собой процессорах. В действ тельности многие современные вычислительные системы состоят из нескольких пр цессоров, связанных между собой либо сетью передачи данных, либо общей шйН

Для записи параллельных процессов можно использовать следующую нотаи

cobegin

х:= 1 х:= 2 х:=3

coend;

write (х);

исполнение команд между ключевыми словами cobegin и coend происходит па-плельно (рис. 10.3). Пара операторных скобок cobegin-coend приводит к генераций потоков в рамках многозадачной системы. Оператор cobegin не накладывает ус-давяй на относительный порядок исполнения отдельных процессов, а оператор jjoend достигается только тогда, когда все процессы внутри блока завершены. Если 5[,1 исполнение было последовательным, то окончательное значение переменной х 5ыло бы равно 3. Для параллельных процессов конечный результат однозначно предсказать нельзя; задачи выполняются, по крайней мере с внешней точки зрения, в случайной последовательности. Поэтому окончательное значение х в приведенном примере может быть как 1, так и 2 или 3.


(cobegiiT



Рис. 10.3. Граф очередности для операторов cobegin - coend

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

2. Управление системными ресурсами

•2.1. Однопроцессорная и распределенная архитектуры

Из-за снижения стоимости аппаратной части стало экономически целесообразно менять вычислительные системы с несколькими процессорами. Мы будем об-*Дать в основном распределенные системы (distributedsystems), которые по своей



Природе больше подходят для управления сложными процессами. К основным имуществам распределенных систем относятся:

- экономичность;

- надежность (при отказе нескольких процессоров остальные продолжают тать);

- возможность подобрать аппаратные средства в соответствии с конкретны требованиями.

Говоря о распределенной системе, необходимо иметь в виду, каким способом дос тигается распределение ресурсов. Одна крайность - когда единственным общим ре сурсом является сеть, соединяющая ЭВМ, каждая из которых работает независимой лишь обменивается сообщениями с остальными. Другая крайность - реально распределенная сетевая операционная система, предоставляющая пользователю гомогенную среду, не зависящую от аппаратной платформы. Пользователь может вводить произвольные команды, а операционная система находит наиболее подходящий способ и место их выполнения.

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

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

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

фигурации обмен данными между процессами происходит через общую локаль-

память, очередность доступа к которой регулируется многозадачной операци-

ЭВМ, так и всей сети. Поэтому функции операционной системы нельзя отделять функциональных свойств сети, а работа сети оказывает заметное влияние на ра распределенной системы. Фактически сетевые операционные системы имеют мн уровневую структуру, аналогично стеку коммуникационных протоколов (Р

Главным различием между однопроцессорной и распределенной архитектур является способ обмена информацией между процессами. Эта процедура наиоо важна при мультипрограммировании и программировании в реальном време . Она будет рассмотрена более подробно ниже в этой главе. В однопроцессорн

„иной системой.

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

Этот принцип взаимодействия лежит в основе одной из наиболее важных концепций распределенных операционных систем - модели "клиент-сервер" (client-server ffiodel)- В этой модели процесс либо запрашивает услуги - клиент, либо предоставляет их - сервер. Очевидно, что один и тот же процесс может быть как клиентом, так и сервером. "Услуга" - это некоторая законченная (замкнутая) операция, в частности выполнение расчетов, прием внешних данных, операция с устройством, например, вывод изображения на экран. В определенном смысле модель "клиент-сервер" можно рассматривать как расширенный вариант обращения к подпрограмме, при котором сервер играет роль подпрограммы или системной процедуры.

Модель "клиент-сервер" основана на обмене сообщениями между программами. Если клиент и сервер исполняются на разных ЭВМ, а сообщения передаются через сеть, то система является распределенной.

Чем больше вычислительные ресурсы процедур клиента и сервера и чем больше сложных функций они могут выполнять независимо, тем меньше число сообщений и, соответственно, нагрузка на сеть. Фактически важным преимуществом распределенных систем является то, что ресурсоемкие вычисления можно выполнять локально и в результате уменьшить объем трафика, поскольку передается только информация, относящаяся к более высокому абстрактному уровню, чем локальные вычисления, т е. некоторый итог локальных операций. Иными словами, в хорошо спроектированной системе сообщения содержат информацию о цели ("установить опорное значение x = 78.2"), а не о том, какие шаги следует для этого предпринять ("каково значение X в данный момент?", "х = 63", "увеличить на 16", "каково х сейчас?", "х = 79", уменьшить на 1", и т. д.). Промежуточные шаги выполняются локально при условии, что программное обеспечение спроектировано соответствующим образом.

10-2.2. функции операционных систем в среде реального времени

Операционная система (ОС, Operating System - OS) - это сложный программный Родукт, предназначенный для управления аппаратными и программными ресурса-вь1числительной системы. Она предоставляет каждому процессу виртуальную

огическую) среду, включающую в себя время процессора и память. "Виртуальная Не ~ концептуальное понятие. Ее характеристики могут как совпадать, так и

совпадать с параметрами реального оборудования.

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

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

и систем разделения времени (timesharing systems), было желание обеспечить Повременный доступ нескольких пользователей к дорогим вычислительным ре-Рсам и, соответственно, разделить между ними эксплуатационные расходы, т. е.




[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [ 67 ] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90]

0.0605