ZX Club
#05
29 октября 1997 |
|
Club IM2 - Терминология и теоритические аспекты прерываний и многозадачности.
╔═════════════════════════╗ ║ IM2 И МНОГОЗАДАЧНОСТЬ ║▒ ╚═════════════════════════╝▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ (C) Dr.Gluker 1997 ────────────────────────────────────── В статье "клуб im2" электронной га- зеты ZX_Club N4 возникла некая термино- логическая путаница, требующая, по мое- му скромному мнению, некоторого разъясне- ния. Напомню, речь шла о прерываниях и многозадачности. В данной статье я хотел бы коснуться сугубо терминологических и теоретических аспектов данных вопросов. Во-первых: прерывания - всего лишь механизм, который может использовать при своей работе прикладная программа (или, говоря другим языком, задача) и, по боль- шому счету, никакого отношения к многоза- дачности не имеющие; а многозадачность - это возможность выполнять две (и бо- лее) независимых (!) прикладных программы в одно и тоже время. Другое дело, что пре- рывания по таймеру, чем на самом деле и является im 2, могут использоваться как механизм для многозадачности. Почему же невозможно считать выпол- няемые в прерывания процедуры независимы- ми задачами? Все дело в самом механизме прерываний. Данный вопрос можно переина- чить: почему прерывания назвали именно прерываниями. Собственно, ответ находится в самом вопросе. Преывания прерывают вы- полнение основной (!) программы для вы- полнения некоей кратковременной процедуры, которую нельзя вставить в основной цикл программы. При этом ( по соглашению ) об- работчик прерывания должен сохранять сре- ду основной программы и после выполнения, восстанавливать оную. Это делает каждый программист, сохраняя на стеке регистры командой push и восстанавливая их командой pop. Другое дело - задача, ее можно раз- бить на три основных раздела: програмный стек, сегмент испоняемого кода, сегмент данных. Любая полноценная, рабочая прог- рамма всегда (!) несет в себе три этих элемента. Более того, процессор Z80 может выполнять лишь одну задачу и иметь лишь один стек: имеется в виду аппаратная ре- ализация. К примеру, Motorolla 68000 имеет два стека и возможность их переключения, поэтому реализовать многозадачность на Z80 можно только программным путем, ис- пользуя при этом механизм прерываний от таймера. Далее: что бы окончательно прояс- нить вопрос с прерываниями, необходимо коснуться некоторых аспектов аппаратной реализации Speccy. Дело в том, что аппа- ратные прерывания на нашем любимце сделаны очень негибко, я бы даже сказал, - спустя рукава, в связи с чем мы и лишены очень многих возможностей, которые обеспечивают стандартные прерывания. То есть, на Speccy возможен лишь один достойный упоминания тип прерываний - im2, который случается каждую 1/50 секунды, и третьего не дано. Так как нам заранее известна тактовая частота процессора (3.5 Мгц), можно од- нозначно просчитать, сколько тактов сможет сделать процессор за одно прерывание, а именно - 70000. Имеется в виду вариант Пентагон, на других машинах может быть меньше, но не менее 68000. О чем нам го- ворит это "магическое" число? А дело в том, что чем больше тактов израсходуют процедуры в прерывании, тем меньше их ос- танется основной программе, и не исключен вариант, когда прерывания "скушают" все машинные циклы и ни одного "тика" не оста- вят основной программе, что и приведет к ее остановке. Теперь, вновь возвращаясь к многоза- дачности, разберем теоретическую реализа- цию оной на примере многозадачного Бейси- ка. Итак, нам необходимо чтобы Speccy враз исполнял две независимые (!) Бейсик-прог- раммы. Для реализации нам потребуются следующие механизмы: -сохраннение среды выполняемой задачи в расширенной памяти; -восстановление среды задачи и выполне- ние оной; -механизм разделения машинного времени между двумя задачами. Итак, что же необходимо сохранять? Да всю систему! Т.е., - область переменных, текст программы, область стеков программы. С восстановлением проблем, вроде бы, тоже быть не должно. Тогда стоит обратить внимание на механизм переключения задач. Вот здесь то нам и пригодятся im2. Орга- низовываем счетчик, который устанавливаем на определенное число прерываний, в тече- нии которых первая программа будет выпол- няться, и опрашиваем его. Как только время приспело, мы сохраним все машинные пара- метры, остановим задачу, скопируем ее в недоступную (!) другим программам область памяти, загрузим следующую программу и запустим ее на выполнение с прерванного момента. Как видите, реализовать многоза- дачный Бейсик не так уж и сложно - в тео- рии. А на практике придется столкнуться с бездной проблем: нехватка памяти, очень медленное переключение, замедлен- ное выполнение каждой программы, ограни- чение на занимаемый объем памяти, невоз- можность использования процедуры im2, и т.д., и т.п. Таким образом, я могу Вам га- рантировать бесполезность и бессмыслен- ность такой затеи. Собственно говоря, это все, что мне хотелось сказать о многозадачности на "старине" Speccy. .оооО ( ) Оооо. ----- (------( )---- _) ) / (_/
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября