Главная страница  Межпроцессное взаимодействие (состязание) 

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 176 177 178 179 180 181 182 183 184 185 186 187

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

Кварцевый генератор

-1 Счетчик уменьшается на единицу при каждом импульсе

Ретостр хранения используется для загрузки счетчика

Рис. 3.15. Программируемые часы

Преимущество программируемых часов в том, что их частота может быть изменена программно. Если используется 1-мегагерцовый кристалл, импульсы от резонатора приходят каждую микросекунду. В случае 16-разрядного счетчика часы можно запрограммировать на генерацию прерываний с периодом от 1 мкс до 65 536 мс. Микросхемы программируемых часов обычно содержат две или три независимо программируемые схемы и имеют некоторые дополнительные настройки (например, отсчет вперед, а не назад, блокирование прерываний и пр.).

Чтобы компьютер не забыл текущее время при выключении питания, в большинство систем устанавливаются подпитываемые от батарейки запасные часы, на тех же низковольтных схемах, что и в наручных цифровых часах. Значение времени с этих вспомогательных часов может считываться при запуске системы. Если же таких часов нет, текущее время может запрашиваться у пользователя. Кроме того, существует стандартный протокол, который позволяет узнать текущее время с удаленной системы. Так или иначе, в MINIX, UNIX и некоторых других системах запрошенное время затем преобразуется в число тиков, прошедших с 12 часов дня 1 января 1970 года по всеобщему скоординированному времени (UTC, ранее говорилось - Гринвичское время). С каждым сигналом от часов значение времени увеличивается на единицу. Обычно имеются вспомогательные программы, которые позволяют вручную задать текущее время на системных и резервных часах, а также синхронизировать два таймера.

3.8.2. Программное обеспечение часов

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



1. Поддержание текущего значения времени суток.

2. Предотвращение монополизации процессора одним процессом.

3. Подсчет полезной загрузки процессора.

4. Обработка системного вызова alarm, используемого пользовательскими процессами.

5. Выполнение функций сторожевого таймера для некоторых частей самой системы.

6. Профилирование, мониторинг и сбор статистики.

Первая из задач, поддержание текущего времени суток (также называемого реальным временем), не сложна. Для этого требуется только увеличивать значение счетчика времени по каждому сигналу от таймера, как говорилось ранее. Единственное, за чем нужно следить, - это число битов в счетчике времени. Если частота сигналов составляет 60 Гц, то 32-разрядный счетчик переполнится примерно за два года. Поэтому понятно, что в 32-битном счетчике нельзя хранить число тиков с 1.01.1970.

У этой проблемы три рещения. Первое - использовать 64-битный счетчик, хотя это несколько усложнит поддержание времени, так как изменять его значение требуется много раз в секунду. Второй способ - хранить время в секундах, а не в тиках, задействуя для подсчета тиков в текущей секунде вспомогательный счетчик. Так как 2 секунд составляет примерно 136 лет, этот метод вполне пригоден до ХХП века.

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

-64 бит-

Время суток в импульсах сигнала времени

<-32 бит-

Время суток в секундах

-32 бит-

Счетчик уменьшается на единицу при каждом импульсе

Число импульсов сигнала времени в текущей секунде

Время загрузки системы в секундах

Рис. 3.16. Три способа хранения текущего времени: а - высокоемкий 64-битный счетчик; б - вспомогательный счетчик; в - подсчет от момента загрузки системы



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

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

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

В MINIX и во многих других операционных системах процесс может попросить систему передать ему предупредительный сигнал с некоторой заданной задержкой. Обычно в качестве такового используется сигнал ОС, сообщение или что-либо подобное. Примером приложения, которому такое может потребоваться, служит сетевой интерфейс. Здесь необходимо повторно передавать пакет данных, если за некоторое время не поступило подтверждение его получения. Еще один пример - программа-тренажер, где обучаемому дается ограниченное время на ответ.

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

Когда ожидается много сигналов, более эффективно имитировать несколько таймеров при помощи единой очереди запросов, отсортированной по времени. Очередь может быть организована в виде списка, как показано на рис. 3.17. Каждая запись в этой очереди хранит число тиков между сигналом в текущей записи и предыдущим. В частности, показанная на рисунке ситуация соответствует сигналам, ожидаемым в моменты времени 4203, 4207, 4213, 4215 и 4216.

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



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 176 177 178 179 180 181 182 183 184 185 186 187

© 2000 - 2018 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.