spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
В книге Мазного про МС "Дубна" в разделе 6.1.4 Использование динамической памяти в языке фортран
описана подсистема SYDAK (SYstem DAta Keeping), предназначенная для хранения большого объёма числовых данных в собственной динамической памяти объёмом до 256 К.

Я всю сознательную жизнь мечтал попробовать, как это работает, но то руки не доходили (на ВЦ АН), то оказывалось, что система отсутствует в организации (в ИТМ и ВТ). Наконец, руки дошли. На диске 2048 из ИТМ и ВТ SYDAK-а, как и ожидалось, нет, а на диске из С. Бора - есть, в *library:2.

Попробуем объявить массив размером 500х500 слов, расписать его элементы (i, j) значениями i*j, а потом проверить, правильно ли получилось.

Работает это так:
*NАМЕ
           *LIВRА:2
           *САLL СRЕАТЕ*
ВIG(500,500)                                           { так объявляется большой массив }
*ЕND SЕGМЕNТ                                           { в результате создается процедура DRUMCAT с описанием массивов }

 Ф О Р Т Р А Н
   /16.07.73/
                РRОGRАМ МАIN
                СОММОN IР(1)                           { база для работы с массивами  }
                DО 10 I=  1,500
       2        САLL GIVЕ(’ВIG’, I, L)                 { запрашиваем строку I, в  L будет смещение к базе}
       3        DО 20 J=1,500
       4    20  IР(L+J) = I*J                          { фактически BIG(I, J) = I*J }
       5        САLL ТАКЕ(’ВIG’, I)                    { закончили работу со строкой I, будет упрятана на барабан когда надо }
       6    10  СОNТINUЕ
       7        К = 0
       8        КК = 0
       9        DО 30 I = 1,500
      10        САLL GIVЕ(’ВIG’, I, L)
      11        DО 40 J=1,500
      12        К = К + I*J
      13        КК = КК + IР(L+J)
      14    40  СОNТINUЕ
      15        САLL ТАКЕ(’ВIG’, I)
      16    30  СОNТINUЕ
      17        РRINТ 50,К,КК
            50  FОRМАТ(1Х2I15)
                ЕND

           *ЕХЕСUТЕ
                                        ОТ 18.01.79 ==
                         ПОДПРОГРАММЫ ИЗ БИБЛИОТЕКИ    02    04.10.84 М1
                ТАКЕ        GIVЕ        SТАТISТ     SDRUМ*      GIVЕSТRN    РRIОRIТУ    ЕХСНАNGЕ    WRSЕСТ*
                NЕХТSЕСТ
                                        ОТ 18.01.79 ==


     15687562500    15687562500



Если не делать TAKE, то система не знает, какие строки массива можно прятать на барабан и печатается ПЕРЕПОЛНЕНО ОПЕРАТИВНОЕ РАБОЧЕЕ ПОЛЕ. Рабочим полем считается вся память от последнего использованного загрузчиком слова до начала стека. Если печатать значения L, получаемые после GIVE, то будет примерно
 ОFFSЕТ = 073070
 ОFFSЕТ = 072104
 ОFFSЕТ = 071120
 ОFFSЕТ = 070134
 ОFFSЕТ = 067150
 ОFFSЕТ = 066164
...
 ОFFSЕТ = 010250
 ОFFSЕТ = 007264
 ОFFSЕТ = 006300
 ОFFSЕТ = 073070
 ОFFSЕТ = 072104


и так далее по кругу. Память выделяется, начиная с верхних адресов, для совместимости с оверлеями (LOADGO). В системе предусмотрена оптимизация откачек. Для сложных последовательностей запросов к элементам нескольких массивов, как в задачах математической физики, рекомендуется первую итерацию вычислительного цикла проводить в режиме сбора статистики последовательности запросов (CALL REGIMS), а начиная со второй - в рабочем режиме (CALL REGIMW). На этом простом примере особой разницы не замечено.

Теоретически вместо откачки на МБ для позднейших версий ОС ДИСПАК можно было модифицировать систему для работы с дополнительными листами памяти задачи, используя экстракоды переименования листов.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 15th, 2026 05:18 am
Powered by Dreamwidth Studios