Программное обеспечение системы сбора данных установки ВЕС
Глобальные секции и общие флаги синхронизации


Для обмена данными и синхронизации между процессами программное обеспечение пользуется такими средствами взаимодействия между процессами операционной системы VMS как глобальные секции (Global Sections) и общие флаги (Common Event Flags).

В операционной системе VMS секцией (section) называется файл, или часть файла на диске, содержащего данные или программу, которая может быть загружена в память и стать доступной процессу для обработки или выполнения. Глобальные секции могут быть доступны сразу нескольким процессам, таким образом позволяя разным процессам обмениваться данными через область памяти. Глобальная секция может являться как частью обычного файла, так и частью файла подкачки виртуальной памяти.

Глобальные секции (global sections) естественным образом имеют такой же механизм защиты доступа как и файлы. Что позволяет определить, кто имеет право читать, писать или исполнять данную область памяти. Тот факт, что глобальные секции могут хранить свой образ на диске, дает возможность сохранить текущее состояние системы между запусками процессов или после перезагрузки компьютера. Механизм глобальных секций также используется операционной системой для работы разделяемых библиотек (shareable libraries) и наиболее часто запускаемых программ.

Флаги событий (event flags) являются статусными битами, предоставляемыми операционной системой VMS для синхронизации внутри процесса или группы процессов. Флаги можно установить, снять, прочитать или приостановить выполнение процесса до возведения одного или комбинации из нескольких флагов. Множество системных вызовов используют флаги для сигнализации окончания своей работы. Общие флаги, объединенные в кластера (common event flag clusters), могут быть одновременно использованы более чем одним процессом, тем самым создавая механизм синхронизации между процессами, выполняющимися в рамках одной группы пользователей.

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

Буфер данных является постоянной (permanent) групповой секцией с именем "BUFFER", которая поделена на части одного размера для хранения данных от нескольких (до 4-х) циклов ускорителя. Определение буфера содержится в файле ONL$LIB:BUFFER.INC и представлено одним большим массивом данных (в настоящее время 40 Мбайт). Для получения доступа к данным необходимо вызвать функцию DAQ$MAP_BUFFER библиотеки DAQLIB, или DAQ$GET_SPILL, которая сама позаботится о доступе к секции. Число и объем данных для одного сброса определяется настройками системы и доступно из статусной секции. Буфер создается менеджером чтения данных ROM во время стадии конфигурирования.

Статус системы сбора данных является постоянной групповой глобальной файловой секцией, сохраняемой на диск после каждого цикла ускорителя. Содержимое статусной секции с именем "STATUS" определено в файле ONL$LIB:STATUS.INC. Секция определена как общий блок данных (common block) из нескольких записей (records) и содержит следующую информацию:

Структура первых двух приведена ниже:

      STRUCTURE / Readout_Status /

        INTEGER RUN                     ! Run number
        INTEGER RESTART                 ! Restart number
        INTEGER MEASURE                 ! Measure number
        INTEGER BUFFERS                 ! Buffers in data section
        INTEGER PAGES                   ! Pages in one buffer
        INTEGER MEM_TYPE                ! Version of memory (1=old,2=new)
        CHARACTER*4 MODE                ! Work mode RUN/EMU
        CHARACTER*4 STATE               ! Readout Manager state
        CHARACTER*4 COMMAND             ! Command from MNG
        REAL    SECNDS                  ! Seconds past midnight
	REAL    SPEED			! Read speed KB/sec
        INTEGER LAST                    ! Last read buffer number

        INTEGER SPILL(4)                ! Spill number
        INTEGER VOLUME(4)               ! Spill volume in bytes
        INTEGER EVENTS(4)               ! Events in spill
        INTEGER SUSPEND(4)              ! Suspend counters
        INTEGER VOLMISS(4)              ! Spill volume in buffer memory
        INTEGER ROMPASS(4)              ! Number of passes during spill input

        INTEGER READ_SPILLS             ! Total spills read
        REAL    READ_VOLUME             ! Total bytes read
        INTEGER READ_EVENTS             ! Total events read

        INTEGER AM_OFFLINES             ! Total offlines on device
        INTEGER AM_TIMEOUTS             ! Total timeouts on device
        INTEGER AM_ERRORS               ! Total errors on device

        INTEGER BAD_SPILLS              ! Total bad spills
        INTEGER INTERNAL                ! Total internal ROM errors
        INTEGER TRASHES                 ! Total trashes (R/W)

      END STRUCTURE

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

      STRUCTURE / Tape_Status /

        INTEGER RESTART(0:3)            ! Tape manager and TPSs restart number
        INTEGER FILES                   ! Files on tape allowed
        INTEGER FPAGES                  ! Pages in file allowed
        CHARACTER*4 STATE(0:3)          ! Tape manager and TPSs state 
        CHARACTER*4 STATUS(0:3)         ! Tape manager and TPSs status 
        CHARACTER*40 DEVICE(3)          ! Device name
        CHARACTER*20 NAME(3)            ! Tape/File name
        CHARACTER*4  COMMAND(0:3)       ! Command for TPM and TPSs
        INTEGER      PARAM(0:3)         ! Parameter of Command 
        REAL SPEED(3)                   ! Tape write speed KB/sec       
        REAL END_TIME(3)                ! Time of writing completion
	REAL ERATIO(3)			! Tape write error ratio
	REAL CRATIO(3)			! Compression ratio

        INTEGER FILE(3)                 ! File number
        INTEGER FILE_SPILLS(3)          ! Spills in file
        INTEGER FILE_EVENTS(3)          ! Events in file
        REAL*4  FILE_VOLUME(3)          ! Bytes in file

        INTEGER TAPE(0:3)               ! Tape number
        INTEGER TAPE_FILES(3)           ! Files on tape
        INTEGER TAPE_SPILLS(3)          ! Spills on tape
        INTEGER TAPE_EVENTS(3)          ! Events on tape
        REAL*4  TAPE_VOLUME(3)          ! Bytes on tape        

        INTEGER WRITE_TAPES             ! Total tapes write
        INTEGER WRITE_FILES             ! Total files write
        INTEGER WRITE_SPILLS            ! Total spills write
        INTEGER WRITE_EVENTS            ! Total events write
        REAL*4  WRITE_VOLUME            ! Total bytes write

        INTEGER LIMIT(5)                ! Stop limits for output
        INTEGER BARRIER(5)              ! Stop barriers
        INTEGER TAPE_ERRORS(3)          ! Total errors on tape
        RECORD /IOSB/ IOT(2048)         ! Status of block of buffer 
      END STRUCTURE        

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

Для передачи гистограмм процессу визуализации, программа обработки данных BEC создает глобальную секцию вида USERNAME_HBK, тем самым позволяя отделить задачу распаковки и гистограммирования событий от собственно анализа и презентации.

Назначение флагов синхронизации (Common Event Flag Clusters) расписано в файле ONL$LIB:FLAGS.INC


Last updated Jan-2004 by Solo