Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство программиста_администратора.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
551.89 Кб
Скачать

3.2. Пример программы, использующей суперпотоки (уровень s)

Приведенная ниже программа показывает пример использования суперпотокового уровня. Программа демонстрирует скорость переключения контекста внутри Т-системы, достаточную для того, чтобы каждый пиксел на экране отрисовывался отдельным потоком при демонстрации видео.

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

#include <SDL/SDL.h>

#include <trt>

ts::ThrQ waitq;

void draw(void *pixel) {

int color = 1;

while(true) {

color = color*5 + (int)pixel;

*(Uint16*)pixel = color;

//printf("%p : %d\n",&color,color);

waitq.stopHereAndRunOthers();

}

}

SDL_Surface *screen;

Uint16 * pixelAddress(int x, int y) {

if (screen->format->BytesPerPixel != 2) printf("Display depth !=

16 :-(\n");

return (Uint16 *)screen->pixels + y*screen->pitch/2 + x;

}

#define XSZ 512

#define YSZ 512

tfun int main(int argc, char *argv[]) {

printf("Setting video mode\n");

screen = SDL_SetVideoMode(XSZ, YSZ, 16, SDL_SWSURFACE);

if (screen == NULL) {

fprintf(stderr, "Problem setting %dx%d resolution: %s\n", XSZ,

YSZ, SDL_GetError());

exit(1);

}

printf("Running threads\n");

int x,y;

for (x=0; x<XSZ; x++) {

printf("One cswitch takes %.0f nanoseconds\

n",ts::tick2Sec(t.finish())*1000000000./(ITER*XSZ*YSZ));

return 0;

}

}

3.3. Использование т-структур и массивов переменного размера

Приведенная в приложении A программа показывает пример использования T-структур, а именно, вставка и замена листьев в дереве. Деревья задаются в формате: expr ::= 0 | len (expr_1) ... (expr_{len}). Функция insert вставляет в каждый лист дерева e данное дерево s. А функция subst заменяет каждую ветку, ведущую в лист, на дерево s.

Если сказать: echo "1(0) 2(0)(0)" | ./subst, то программа выдает:

expr: 1 (0)

subst: 2 (0) (0)

after insert: 1 (2 (0) (0))

after subst.insert: 1 (4 (0) (0) (0) (0))

В том случае, если в качестве T-переменной вы хотите использовать массив, не следует использовать обычный массив. Для этого можно использовать класс TArray, экземпляры которого можно использовать как массивы. Он имеет метод resize, с помощью которого можно задать и динамически менять его размерность. Пример использования динамического массива приведен в приложении B.

3.4. Описание классов реализации системы OpenTs

3.4.1. Уровень суперпамяти и суперпотоков

SystemMemoryAllocator – класс, ответственный за выделение памяти

DataAllocator – класс-шаблон для выделения памяти объектам определенного типа FIXME: при оптимизации должен кэшировать!

StackAllocator – класс для выделения памяти для стеков суперпотоков

ThreadAllocator – кэширующий аллокатор суперпотоков

ThrH – заголовочная структура суперпотока

SThread – суперпоток

THInit – инициализация суперпотокового уровня

DestructionQueue – реентерабильная процедура для удаления совокупностей объектов

Header – класс-заголовок для суперданных

SData – класс представления суперданных

SRef – локальная ссылка на суперданные

WTimer – оптимизированная процедура для получения системного времени

MPITagHandler – системный сервис для взаимодействия с подсистемами MPI/DMPI

TransportHandler – системный сервис - транспортная поддержка суперпамяти

VZeroes – виртуальное пространство для суперматрицы, проинициализированное нулями

CachedChunks – класс для кэширующего захвата диапазона ячеек суперпамяти

MasterSCell – базовый класс для представления состояния диагональных (собственных) элементов суперматрицы

SlaveSCell – базовый класс для представления состояния несобственных (отраженных) элементов суперматрицы

SCell – базовый класс для представления ячеек суперпамяти

SPtr – глобальный указатель на ячейку суперпамяти

Data – базовый класс для представления суперданных в виде активных сообщений

DataCell – ячейка суперпамяти, содержащая обычные суперданные

StaticCell – специальная (статическая) ячейка суперпамяти (используется для управляющей информации)

SharedCell – общая (широковещательная) ячейка суперпамяти

DynamicSegment – сегмент суперпамяти

StaticSegment – специальный (статический) сегмент суперпамяти