Cat Framework

обновлено: 25 марта 2017

Платформа: x86_64
Инструкции: SSE4.2+AES-NI
ОС: Windows 8.1+, Linux 2.6+
Текущая версия: 0.7
Начало разработки: 28.09.2011
Доступность: только внутреннее использование (с версии 1.0, возможно, будет доступна для некоммерческих проектов)
Описание:

Cat Framework это фреймворк для аппаратной платформы x86_64, разрабатываемая с целью получения быстрого и полностью прогнозируемого кода. Ориентируясь на современное аппаратное обеспечение код фреймворка активно использует инструкции процессора вплоть до SSE4.2 включительно (в будущем планируется по мимо текущего технического уровня SSE4.2+AES-NI, добавить вариант кода для уровня AVX2+BMI2+TSX+RDRAND+SHA-NI). На текущий момент фреймворк поддерживает операционные системы Windows (начиная с Windows 8.1) и Linux (начиная с ядра 2.6). В будущем предусмотрена возможность добавления поддержки Solaris, FreeBSD и других ОС, работающих на аппаратной платформе x86_64 (в первую очередь консолей).

Фреймворк включает в себя 4 библиотеки, оформленные в виде пакетов для Lazarus (хотя их можно использовать и с чистым FreePascal`ем что требует ручной настройки путей и самостоятельного определения необходимых define`ов):

  • CatFramework – библиотека общего назначения (дала название всему фреймворку)
  • CatRTL – облегчённая библиотека времени выполнения для FPC предназначенная для создания клиентских приложений
  • CatServerRTL – облегчённая библиотека времени выполнения FPC предназначенная для для создания серверных приложений (только Linux)
  • CatServerActors – вспомогательная библиотека, используемая совместно с CatServerRTL, для создания серверных приложений с использованием модели акторов

Сейчас в разработке:

  • Доработки и исправления для версии 0.8
  • Экспериментальное портирование частей CatFramework и CatServerRTL на FreeBSD и Solaris в интересах проекта CAR

CatFramework

Все модули библиотеки разделены на 10 групп. Пять групп (CFW, CFWLib, CFWOS, CFWSTL и CFWHelper) являются основными (используются при компиляции CatRTL и CatServerRTL), остальные же группы являются дополнительными.

Группа CFW (модули общего назначения):

  • Определения основных типов данных в удобной форме, а также определение основных операторов для векторных типов данных
  • Основа для реализации журнала и обработки критических ошибок приложения
  • Функции для расчёта хешей:
    • CRC16
    • CRC32
      (реализация на базе инструкции CRC32)
    • CRC64
    • SHA-1
    • SHA-256
    • SHA-512
  • Простейшие математические функции для целых чисел
    (min, max, clamp, НОД, НОК и т.д.)
  • Функции работы с памятью:
    • Очистка, копирование, заполнение и сравнение регионов памяти
    • Операции над битовыми строками (в том числе атомарные)
    • Атомарные операций с памятью
    • Spinlock`и, в том числе со встроенной очередь
    • Ожидание значения переменной в spinlock`е
  • Различные ГПСЧ
  • Операции со строками:
    • ShortString:
      • Сравнение строк
        (в том числе быстрая проверка на идентичность)
      • Присвоение (в том числе из массива символов известной длинны)
      • Добавление к одной строке другой
      • Добавление к строке символа
      • Добавление к строке массива символов известной длинны
      • Добавление к строке числа (знаковое/без знаковое целое, число с плавающей точной)
      • Добавление к строке без знакового целого числа в 16-тиричной форме
      • Извлечение из строки знакового/без знакового целого числа
      • Извлечение из строки без знакового целого числа в 16-тиричной форме
    • Null-терминированные строки:
      (как однобайтные, так и двухбайтные символы)

      • Определение длинны строки
      • Сравнение строк
        (в том числе быстрая проверка на идентичность)
      • Поиск в строке символов из числа указанных
      • Поиск в строке символов не из числа указанных
      • Поиск в строке символов из указанных промежутков
      • Поиск в строке символов не из указанных промежутков
      • Поиск подстроки в строке
    • Массив символов известной длинны:
      (как однобайтные, так и двухбайтные символы)

      • Поиск в строке символов из числа указанных
      • Поиск в строке символов не из числа указанных
      • Поиск в строке символов из указанных промежутков
      • Поиск в строке символов не из указанных промежутков
      • Выделение из текста строк и слов

Группа CFW-Lib (заголовочные файлы для основных API ОС и различных библиотек, переведены частично и допереводятся при необходимости):

  • Модули, доступные в ОС Linux:
    • Заголовки вызовов ядра (kernel calls)
    • Заголовки LibC
    • Заголовки DL
    • Заголовки PThread
    • Заголовки XCB
  • Модули, доступные в ОС Windows:
    • Заголовки WinAPI
    • Заголовки WASAPI
    • Заголовки DirectX 10
    • Заголовки DirectX 11
    • Заголовки DirectX 12

Группа CFW-OS (общий интерфейс для некоторых возможностей ОС):

  • Различные функции получения текущего времени
    (в том числе добавления меток времени различного формата к строке)
  • Высокопроизводительная функция лога с добавлением микросекундного тайм-штампа, класса сообщения и идентификатора потока из которого осуществлена запись
  • Объявления базовых классов для реализации различных политик выделения памяти и реакций на её нехватку
  • Генератор случайных чисел для нужд криптографии
  • Функции для синхронной работы с файлами
  • Менеджмент памяти процесса
    • Работа с виртуальной памятью процесса
    • Работа со стандартных хипом процесса
    • Отладочный режим работы с хипом, в котором происходит запись стека вызовов для всех выделений памяти, а при завершении работы приложения в консоль выводиться информация об утечках
      (при этом, если приложение содержит отладочную информацию, то стек вызовов по мимо адресов будет также содержать информацию о соотв. им строках исходного кода)
  • Обёртка над сокетами, расширенный функционал для TCP сокетов
    (в Windows базируется на WSAAsyncSelect, в Linux – на Poll)
  • Работа с потоками:
    • Простая функция запуска исполнения процедуры в другом потоке
    • Объект-потока позволяющий ожидать завершение созданного потока и получать код его завершения
    • Объекты-синхронизации двух видов (без поддержки мультиплексирования средствами ОС и с ней):
      • Event
      • Semaphore
      • CountDownLatch
      • Pool (односвязный список регионов памяти с LIFO-доступом связанный через первые 8-байт региона)
    • Потокобезопасная очередь указателей с различными режимами работы
  • Прочие вспомогательные функции, реализация которых зависит от ОС

Группа CFW-STL (набор контейнеров для хранения различных видов данных, аналог STL в C):

  • Контейнеры на основе generic`ов
    (массив, список, набор, стек, очередь, односвязный и двусвязный списки, списков указателей с приоритетом, хеш-таблица с открытой адресацией)
  • Набор примитивов синхронизации для контейнеров
  • Набор примитивов управление памятью для контейнеров
  • Lock-free хеш-таблица, в том числе с возможностью блокировки записей

Группа CFW-Helper (различные вспомогательные модули):

  • Определение поддерживаемых процессором наборов инструкций
  • Профайлинг функций
  • Объект для разбора отладочной информации Dwarf2 и получения lineinfo
  • Вспомогательные функции для каждой ОС

Группа CFW-Compress (модули для быстрого сжатия/разжатия данных без потерь):

  • Статическое сжатие Хаффмана для 8-ми битных слов
  • 4 варианта LZ77
    (минимальное совпадение 3 или 4 байта, размер окна 64КБ или 1МБ)
  • 4 варианта LZ77+Huffman
    (минимальное совпадение 3 или 4 байта, размер окна 64КБ или 1МБ)
  • Специальные версии декомпрессоров с параллельным подсчётом CRC32 данных (как в сжатом виде, так и в разжатом)

Группа CFW-Crypt (модули для шифрования данных):

  • AES-256
    (как обычная реализация, так и реализация на базе AES-инструкций процессора)
  • Diffie-Hellman
    (256, 512, 1024, 2048, 4096, 8192, 16384 и 32768 бит)
  • RSA
    (512, 1024, 2048, 4096, 8192, 16384 и 32768 бит)

Группа CFW-Math (математические операции над числами с плавающей точкой. В том числе для нужд 3D графики):

  • Функции преобразования между числами с плавающей точкой различной разрядности (64, 32 и 16 бит)
  • Простейшие функции вроде min, max, clamp и т.д. для float32 и float64
  • Триганоментрические функции для float32 и float64
  • Быстрые sin/cos для float32
  • Векторная математика для float32
  • Матричная математика для float32

Группа CFW-MemMng (менеджмент памяти внутри процесса):

  • Объект для организации пулов памяти на основе односвязного списка
  • Объекты для организации пулов памяти на основе иерархической битовой карты

Группа CFW-Serialization (модули для сериализации/десериализации произвольных структур данных):

  • Описание формата сериализации данных CSSF и функции для упрощения чтения/проверки целостности данных для него

Cat RTL

  • Потоки:
    • Поддержка threadvar
    • Объекты обёртки для таких вещей как поток, эвент, семафор
  • Исключения: Отсутствие потребности в динамическом выделении памяти в момент возникновения исключения
  • Объекты: оптимизированные методы Dispatch и DispatchStr у TObject
  • Интерфейсы COM и CORBA

Cat Server RTL

  • Потоки:
    • TLS на 56 слотов
    • Быстрое получение TID
    • Поддержка threadvar
    • Возможность создания потоков со стеком в 1КБ (512 байт TLS, 512 – собственно стек)
  • Исключения:
    • Отсутствие потребности в динамическом выделении памяти в момент возникновения исключения
  • Хип процесса:
    • Выравнивание на границу 64 байта
    • Полная потокобезопасность (но не реинтерабельность)
  • Объекты: оптимизированные методы Dispatch и DispatchStr у TObject
  • Интерфейсы COM и CORBA

Cat Server Actors

  • Специальный пул для сообщений и высокоскоростная очередь для них
  • Класс-обработчик сообщений с собственными рабочими потоками
  • Акторы и обработчики сообщений для них с различными механизмами ограничения доступа
  • Акторы с поддержкой получения сообщений о событиях файлового дескриптора
  • Набор классов для организации TCP-сервера

История возникновения

Первое упоминание о CFW датируется 27 декабря 2007 года, когда папка с таким названием появилась в дереве исходных кодов, так и не законченного, движка SkyEngine. В эту папку были вынесены все модули, которые не были напрямую связанны с движком (например определения типов, математические функции, функции хеширования, шифрования и т.д.). Далее, 28 апреля 2009 года, CFW оформился именно как библиотека, но всё еще в составе конкретного проекта. Библиотека была ориентирована только на Windows и платформу x86. 30 июля 2009 года состоялось одно из самых значимых событий в истории CFW – полный переход на платформу x86_64 и отказ от поддержки платформы х86, а 4 августа 2009 произошел полный отказ от использование Delphi в каких-либо частях проекта и полный переход на FreePascal. Основной причиной перехода как раз и послужило отсутствие у Delphi поддержки платформы x86_64 на то время. А 13 марта 2010 года в составе CFW появился первый модуль, ориентированный на работу с ОС Linux. К началу лета 2011 года уже явно сформировалась потребность в полностью независимой библиотеке общего назначения для платформы x86_64 и ОС Windows и Linux. Кроме того, модуль RSA шифрования оказался полностью неработоспособным и найти место где в него закралась ошибка (ну или с когда он перестал работать) так и не удалось. Чтобы избежать повторения этой ситуации в дальнейшем 22 июня 2011 в составе CFW появились первые юнит-тесты, выполняемые после каждого изменения в библиотеке, чтобы убедиться в работоспособности всего её функционала. Ну и наконец 28 сентября 2011 CFW полностью выделилась в независимый проект.