Когда в самом начале эксплуатации БЭСМ-6 программировали в машинных кодах, ради экономии памяти и труда программистов элементарные функции реализовали с помощью зарезервированных эмулируемых кодов операций : 050 - sqrt, 051 - sin, 052 - cos и т. д., по которым ЦП переключается в режим супервизора и передает управление по физическому адресу 0500+код операции. Казалось бы, много ли надо, чтобы посчитать простенький полином, сделать пару итераций по Ньютону и скорректировать порядок результата? Много было не надо (цитата из ядра системы):
Но потом ОС стала развиваться, появилась потребность в десятках, если не сотнях, разных служебных и сервисных системных вызовов, и вместо того, чтобы навесить их на ещё не задействованные коды операций, их стали навешивать на коды операций элементарных функций, благо им был нужен только один операнд на сумматоре, и поле адреса в команде пропадало. Ну ладно, не жалко.
Казалось бы, много ли ума надо, чтобы поставить первой же командой проверку эффективного адреса на ноль и делать условный переход на вычисление корня, и только по ветви "иначе" идти на сохранение регистров и декодирование всех остальных возможных запрошенных операций?
На самом деле, немного - для этого было бы достаточно ровно одной команды; Но всем было пофиг, раз всю жизнь ОС Диспак при вызове экстракода квадратного корня выполнял три дюжины команд, которых можно было с лёгкостью избежать.
То есть реально вычисление квадратного корня работало не обещанные 70 μs, а раза в полтора дольше.
Предлагается задачка: оценить, сколько всего операций квадратного корня все БЭСМ-6 произвели за все годы эксплуатации, и сколько машинного времени было потеряно. :)
*ВЫЧИСЛЕНИЕ SQRТ(Х) *СРЕДНЕЕ ВРЕМЯ СЧЕТА=70МКСЕК. *МАКС.ОТН.ПОГР.=1.5Е-12 *КОРЕНЬ ИЗВЛЕКАЕТСЯ ТОЧНО ИЗ ВСЕХ *Х=N**2,ГДЕ 1 ≤ N ≤ 2**20
Но потом ОС стала развиваться, появилась потребность в десятках, если не сотнях, разных служебных и сервисных системных вызовов, и вместо того, чтобы навесить их на ещё не задействованные коды операций, их стали навешивать на коды операций элементарных функций, благо им был нужен только один операнд на сумматоре, и поле адреса в команде пропадало. Ну ладно, не жалко.
Казалось бы, много ли ума надо, чтобы поставить первой же командой проверку эффективного адреса на ноль и делать условный переход на вычисление корня, и только по ветви "иначе" идти на сохранение регистров и декодирование всех остальных возможных запрошенных операций?
На самом деле, немного - для этого было бы достаточно ровно одной команды; Но всем было пофиг, раз всю жизнь ОС Диспак при вызове экстракода квадратного корня выполнял три дюжины команд, которых можно было с лёгкостью избежать.
00550 (-> зп 2213, пб 7053) 00550 (зп 2213, -> пб 7053) 07053 (-> сч 474, и 103) 07053 (сч 474, -> и 103) 07054 (-> по 7057, сч 7044) 07054 (по 7057, -> сч 7044) 07055 (-> мод 2222, и 102) 07055 (мод 2222, -> и 102) 07056 (-> по 4750, мода) 04750 (-> счи 16, пио 4766(16)) 04750 (счи 16, -> пио 4766(16)) 04766 (-> уиа 5007(16), сч 2213) 04766 (уиа 5007(16), -> сч 2213) 04767 (-> зп 2213, счрж 7777) 04767 (зп 2213, -> счрж 7777) 04770 (-> зп 2214, счи 17) 04770 (зп 2214, -> счи 17) 04771 (-> зп 2220, счи 15) 04771 (зп 2220, -> счи 15) 04772 (-> зп 2216, ржа 10) 04772 (зп 2216, -> ржа 10) 04773 (-> уиа 2213(17), пб 7034) 04773 (уиа 2213(17), -> пб 7034) 07034 (-> сч 2213, пб (16)) 07034 (сч 2213, -> пб (16))(и только потом начинаются команды, перед которыми был комментарий, упомянутый выше)
05007 (-> уиа 4776(16), слпа 100) 05007 (уиа 4776(16), -> слпа 100) 05010 (-> зп 2213, ржа 4) 05010 (зп 2213, -> ржа 4) 05011 (-> по (16), ржа 20) 05011 (по (16), -> ржа 20) 05012 (-> пе 5004, сда 101) 05012 (пе 5004, -> сда 101) 05013 (-> зп 2206, сч 2213) 05013 (зп 2206, -> сч 2213) 05014 (-> вчп 2213, зп 2205) 05014 (вчп 2213, -> зп 2205) 05015 (-> умн 246, сл 247) 05015 (умн 246, -> сл 247) 05016 (-> умн 2205, сл 250) 05016 (умн 2205, -> сл 250) 05017 (-> слпа 140, слп 2206) 05017 (слпа 140, -> слп 2206) 05020 (-> зп 2205, сч 2206) 05020 (зп 2205, -> сч 2206) 05021 (-> ржа 22, по 5024) 05021 (ржа 22, -> по 5024) 05024 (-> сч 2213, дел 2205) 05024 (сч 2213, -> дел 2205) 05025 (-> сл 2205, слпа 77) 05025 (сл 2205, -> слпа 77) 05026 (-> зп 2205, сч 2213) 05026 (зп 2205, -> сч 2213) 05027 (-> дел 2205, сл 2205) 05027 (дел 2205, -> сл 2205) 05030 (-> слпа 77, пб (16)) 05030 (слпа 77, -> пб (16))(примерно здесь кончаются команды, относящиеся к вычислению корня)
04776 (-> зп 2213, мод 2220) 04776 (зп 2213, -> мод 2220) 04777 (-> уиа (17), рж 2214) 04777 (уиа (17), -> рж 2214) 05000 (-> сч 2213, уиа 3) 05000 (сч 2213, -> уиа 3) 05001 (-> уи, зп) 05001 (уи, -> зп) 05002 (-> уиа 2003, пб 6610) 05002 (уиа 2003, -> пб 6610) 06610 (-> уии 27, выпр (2)) 06610 (уии 27, -> выпр (2))
То есть реально вычисление квадратного корня работало не обещанные 70 μs, а раза в полтора дольше.
Предлагается задачка: оценить, сколько всего операций квадратного корня все БЭСМ-6 произвели за все годы эксплуатации, и сколько машинного времени было потеряно. :)