Перейти на главную Журналы

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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [129] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175

входные

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

выходные

данные

программа

данные

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

Частным типо.м процессов являются потоки (threads). Они представляют собой Часть программы, которая может независимо исполняться па том же сам или дру-•ом нроцессоре. Потоки порождаются процессом и выполняются параллельно, т. е. "оток - зто дочерний процесс (childprocess). В отличие от нроцессов, потоки исполь-Угот общую область данных, т. е. неременные породившего их процесса. Однако



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

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

младшие адреса

стек

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

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

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

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

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

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

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

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

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

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

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

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

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

cobegin

х:= 1 X := 2 х:3

coend;

write (х);




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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 [129] 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175