Анимация
JavaScript


Главная  Библионтека 

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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Существует несколько подходов к ситуации, когда используется несколько устройств. В простейшем случае у нас будет отдельное кольцо буферов для каждого устройства. Для каждого устройства будут заданы свои значения п, N, СЛЕДК, СЛЕДЗ и ТЕКУЩИЙ, а также собственная сопрограмма CONTROL. В результате мы будем иметь эффективную буферизацию одновременно на всех устройствах В/В.

Можно также создать "пул" буферных областей одинакового размера, чтобы два или более устройств совместно использовали буфера из общего списка. Это можно осуществить с помощью методов связывания памяти, которые описываются в главе 2, когда все красные буфера ввода связываются в один список, а все зеленые буфера вывода - в другой. В данном случае возникает необходимость отличать ввод от вывода, т. е. нужно переписать алгоритмы, чтобы в них не использовались пи N. Если все буфера в пуле окажутся заполненными входными данными, полученными методом опережающего ввода, то алгоритм будет неизменно останавливаться. Поэтому необходимо убедиться, что существует по крайней мере один буфер (причем желательно по одному для каждого устройства), который не является зеленым буфером ввода. И только если программа COMPUTE останавливается на шаге А1 для некоторого устройства ввода, следует разрешить ввод данных с этого устройства в последний буфер пула.

Некоторые машины имеют дополнительные ограничения на использование устройств ввода-вывода, делающие невозможной одновременную передачу данных с определенных пар устройств. (Например, несколько устройств можно подключить к компьютеру с помощью единственного "канала".) Это ограничение также оказывает влияние на нашу программу буферизации. Как сделать правильный выбор, когда нужно решить, какое устройство В/В инициировать следующим? Это называется задачей прогнозирования. Лучшее правило прогнозирования для общего случая, видимо, состоит в том, чтобы отдать предпочтение устройству, буферное кольцо которого имеет наибольшее значение n/N. При этом предполагается, что число буферов в кольце было выбрано обдуманно.

СЛЕДК г\


Рис. 26. Ввод и вывод в одном и том же кольце буферов. СЛЕДЗ -

И в заключение рассмотрим полезный метод выполнения и ввода, и вывода с помощью одного и того же кольца буферов, который можно применять при определенных условиях. На рис. 26 показан новый вид буфера - фиолетовый. В этой ситуации зеленые буфера представляют опережающий ввод; в результате операции НАЗНАЧИТЬ зеленый буфер становится желтым, а затем, после операции ОСВОБОДИТЬ, - красным и представляет блок, который нужно вывести. Процессы ввода и вывода, как и раньше, независимо двигаются по кругу, только сейчас после выполнения операции вывода красные буфера становятся фиолетовыми, а при



вводе фиолетовый буфер превращается в зеленый. Необходимо гарантировать, что указатели СЛЕДЗ, СЛЕД1< и СЛЕДФ не будут обгонять друг друга. В момент, показанный на рис. 26, программа выполняет вычисления между операциями НАЗНАЧИТЬ и ОСВОБОДИТЬ, работая с желтым буфером; одновременно производится ввод в буфер, на который указывает стрелка СЛЕДФ, и вывод из буфера, на который указывает стрелка СЛЕДК.

УПРАЖНЕНИЯ

1. [05] Будет ли последовательность команд (3) по-прежнему правильной, если поместить команды MOVE перед командой JBUS, а не после нее? А если поместить команды MOVE после команды IN?

2. [10] С помощью команд "OUT 1000(6); JBUS *(6)" можно вывести блок данных на ленту, не используя буферизацию, точно так же, как команды (1) делают это в случае ввода. Предложите метод, аналогичный (2) и (3), который буферизирует этот вывод, используя команды MOVE и вспомогательный буфер, занимающий ячейки 2000-2099.

► 3. [22] Напищите подпрограмму вывода с помощью свопинга, аналогичную (4). Эта подпрограмма с именем WORDOUT должна сохранять слово в гА в качестве следующего слова вывода, а когда буфер будет заполнен, записывать 100 слов на магнитную ленту (устройство V). В индексном регистре 5 должен храниться адрес текущего буфера. Составьте схему расположения буферных областей и объясните, какие команды необходимо (если необходимо вообще) использовать в начале и в конце программы, чтобы первый и последний блоки наверняка были записаны правильно. В случае необходимости последний блок следует заполнить нулями.

4. [М20] Покажите, что если программа использует единственное устройство В/В, то при благоприятных обстоятельствах можно сократить время ее выполнения наполовину путем буферизации В/В. Но нельзя более чем в два раза сократить время выполнения по сравнению с небуферизированным В/В.

► 5. [М21] Обобщите рещение предыдущего упражнения для случая, когда программа работает не с одним, а с п устройствами В/В.

6. [12] Какие команды нужно поместить в начале программы, чтобы подпрограмма WORDIN (4) начала правильно работать? (Например, в индексном регистре 6 должно что-то содержаться.)

7. [22] Напищите подпрограмму с именем WORDIN, которая, в основном, аналогична (4), за исключением того, что в ней не используется маркер конца блока.

8. [11] В тексте раздела описывается гипотетический сценарий ввода, начало которого показано на рис. 23, а продолжение - на рис. 24, (а), (Ь) и (с). Дайте интерпретацию такому же сценарию, но при условии, что выполняется вывод на АЦПУ, а не ввод с перфокарт. (Например, что происходит в момент, показанный на рис. 23?)

► 9. [21] Программу, в результате выполнения которой содержимое буферов выглядит, как показано на рис. 27, можно охарактеризовать с помощью следующего списка промежутков времени:

А, 1000, R, 1000, А, 1000, R, 1000, А, 1000, R, 1000, А, 1000, R, 1000, А, 7000, R, 5000, А, 7000, R, 5000, А, 7000, R, 5000, А, 7000, R, 5000, А, 1000, R, 1000, А, 2000, R, 1000.

Этот список расшифровывается так: "Назначить, вычислять в течение lOOOu, освободить, вычислять в течение lOOOu, назначить, ..., вычислять в течение 2000и, освободить, вычислять в течение lOOOu". Приведенные промежутки времени вычислений не включают



Устройств Q 9 9 9 о о во вывода ~

.....я-?-Я-

Компьютер



Время

Обозначения

Зеленый буфер

[Желтьгй уфер

1Красный буфер

• Красный буфер, - содержимое -которого выводится

Устройство активно

Устройство !свободно

- -А Назначить

- -К Освободить

- -О Инициировать

вывод

Рис. 27. Вывод с использованием трех буферов (см. упр. 9).

какие-либо периоды, когда компьютер ожидает устройство вывода, чтобы занять его (как в случае четвертой операции "назначить" на рис. 27). Выходное устройство затрачивает на вывод каждого блока по 7500и времени.

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

Время

Действие

Время

Действие

ASSIGN(BUFl)

38500

OUT BUF3

1000

RELEASE, OUT BUFl

40000

ASSIGN(BUFl)

2000

ASSIGN(BUF2)

46000

Вывод остановлен.

3000

RELEASE

47000

RELEASE, OUT BUFl

4000

ASSIGN(BUF3)

52000

ASSIGN(BUF2)

5000

RELEASE

54500

Вывод остановлен.

6000

ASSIGN (ждать)

59000

RELEASE, OUT BUF2

8500

BUFl назначен, OUT BUF2

64000

ASSIGN(BUF3)

9500

RELEASE

65000

RELEASE

10500

ASSIGN (ждать)

66000

ASSIGN(BUFl)

16000

BUF2 назначен, OUT BUF3

66500

OUT BUF3

23000

RELEASE

68000

RELEASE

23500

OUT BUFl

69000

Вычисления прекращены

28000

ASSIGN(BUF3)

74000

OUT BUFl

31000

OUT BUF2

81500

Вывод остановлен.

35000

RELEASE



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 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225