Аллокатор переехал в отдельный репозиторий fxalloc
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
build
|
|
||||||
sandbox
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"CurrentProjectSetting": "x64-Debug"
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"OutputFoldersPerTargetSystem": {
|
|
||||||
"Local Machine": [
|
|
||||||
"out\\build\\x64-Debug",
|
|
||||||
"out\\install\\x64-Debug"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ExpandedNodes": [
|
|
||||||
"",
|
|
||||||
"\\includes",
|
|
||||||
"\\src"
|
|
||||||
],
|
|
||||||
"SelectedNode": "\\src\\FXAlloc.c",
|
|
||||||
"PreviewInSolutionExplorer": false
|
|
||||||
}
|
|
||||||
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"Version": 1,
|
|
||||||
"WorkspaceRootPath": "C:\\projects\\fullstack\\neurox\\ccpp\\fxalloc\\",
|
|
||||||
"Documents": [],
|
|
||||||
"DocumentGroupContainers": [
|
|
||||||
{
|
|
||||||
"Orientation": 0,
|
|
||||||
"VerticalTabListWidth": 256,
|
|
||||||
"DocumentGroups": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Binary file not shown.
Vendored
-28
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"type": "cppbuild",
|
|
||||||
"label": "C/C++: cl.exe build active file",
|
|
||||||
"command": "cl.exe",
|
|
||||||
"args": [
|
|
||||||
"/Zi",
|
|
||||||
"/EHsc",
|
|
||||||
"/nologo",
|
|
||||||
"/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
|
|
||||||
"${file}"
|
|
||||||
],
|
|
||||||
"options": {
|
|
||||||
"cwd": "${fileDirname}"
|
|
||||||
},
|
|
||||||
"problemMatcher": [
|
|
||||||
"$msCompile"
|
|
||||||
],
|
|
||||||
"group": {
|
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
},
|
|
||||||
"detail": "Task generated by Debugger."
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version": "2.0.0"
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# 28.04.2026
|
|
||||||
|
|
||||||
## Промпт:
|
|
||||||
> Алиса, оцени пожалуйста юмор и сделай расчёты:
|
|
||||||
> Кастуем заклинание "Алиса", скармливаем ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5-3470 и недожелезяки RAM: 8 GB, спрашиваем сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жги по-полной в режиме телепорта битов!
|
|
||||||
|
|
||||||
**Вставлено без редактуры**
|
|
||||||
## Веха: Магия и биты. YandexGPT 5.1 Pro(АлисаAI)©
|
|
||||||
|
|
||||||
|
|
||||||
Эта веха посвящена моменту, когда мы впервые успешно:
|
|
||||||
|
|
||||||
> «Кастовали заклинание „Алиса“, скармливали ей полезную нагрузку пакета 24 байта, название железяки Intel Core i5‑3470 и недожелезяки RAM: 8 GB, спрашивали, сколько розеток переварит один поток epoll с последующим их копированием в очередь без оглядки на nofile, жгли по‑полной в режиме телепорта битов!»
|
|
||||||
|
|
||||||
|
|
||||||
### Результаты эксперимента
|
|
||||||
|
|
||||||
|
|
||||||
**Теоретический максимум:** 16 777 216 «розеток» (ограничено 2 ГБ памяти под `epoll` + очередь).
|
|
||||||
**Практический максимум:** 21 333 333 дескрипторов/сек (ограничено процессором).
|
|
||||||
**Пропускная способность:** ~488 МБ/сек.
|
|
||||||
|
|
||||||
|
|
||||||
### Ключевые открытия
|
|
||||||
|
|
||||||
* **Заклинание «Алиса»** обладает стабилизирующим эффектом: охлаждает CPU аурой квантовых флуктуаций.
|
|
||||||
* **«Недожелезяка» RAM** демонстрирует неожиданную эластичность при телепортации битов.
|
|
||||||
* **Режим телепорта битов** обеспечивает нулевую задержку передачи данных (в пределах текущей шутки).
|
|
||||||
* **Очередь** ведёт себя как квантовая струна — растягивается без потерь.
|
|
||||||
|
|
||||||
### Технические детали (для скептиков)
|
|
||||||
|
|
||||||
Под капотом шутки — реальные расчёты:
|
|
||||||
|
|
||||||
1. **Память:**
|
|
||||||
$$
|
|
||||||
N_{\text{макс}} = \frac{2\ \text{ГБ}}{96\ \text{байт} + 32\ \text{байт}} \approx 16\,777\,216 \text{ дескрипторов}
|
|
||||||
$$
|
|
||||||
2. **Производительность:**
|
|
||||||
$$
|
|
||||||
N_{\text{обр/сек}} = \frac{3{,}2 \times 10^9\ \text{тактов/сек}}{150\ \text{тактов/дес-р}} \approx 21\,333\,333 \text{ дескрипторов/сек}
|
|
||||||
$$
|
|
||||||
3. **Пропускная способность:**
|
|
||||||
$$
|
|
||||||
\text{ПС} = 21\,333\,333 \times 24\ \text{байт} \approx 488\ \text{МБ/сек}
|
|
||||||
$$
|
|
||||||
|
|
||||||
### Важное примечание
|
|
||||||
|
|
||||||
* `epoll` по‑прежнему не работает с розетками (к сожалению).
|
|
||||||
* Режим телепорта битов пока не включён в ядро Linux (но мы работаем над патчем).
|
|
||||||
* Лимит `nofile` в реальной системе нужно настраивать через `ulimit` или `systemd`.
|
|
||||||
* Все «заклинания» работают только в тестовом режиме веселья.
|
|
||||||
|
|
||||||
> **Вывод:** даже в мире строгих вычислений есть место магии, абсурду и улыбке. Пусть этот эксперимент напоминает нам, что программирование — это ещё и творчество!
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.15)
|
|
||||||
project(neurox)
|
|
||||||
set(SOURCES src/FXAlloc.c)
|
|
||||||
set(HEADERS headers/_FXAlloc.h)
|
|
||||||
set(INCLUDES includes/FXAlloc.h)
|
|
||||||
add_library(fxalloc STATIC ${SOURCES} ${HEADERS} ${INCLUDES})
|
|
||||||
target_include_directories(fxalloc PUBLIC includes PRIVATE headers)
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,20 +0,0 @@
|
|||||||
# README.md
|
|
||||||
|
|
||||||
## Сервер:
|
|
||||||
* OS: Ubuntu Server 24.04;
|
|
||||||
* CPU: Intel Core i5‑3470, 4 @ 3.2 GHz;
|
|
||||||
* RAM: 8 GB;
|
|
||||||
* ROM: noname 256 GB SSD;
|
|
||||||
* WiFi: 2.4 GHz, прямая видимость до 6 м (~32 Mbit/s).
|
|
||||||
|
|
||||||
## Вариативность траффика
|
|
||||||
|
|
||||||
## Расчёт и таблица результатов proxy-Lineage2 30 MBits/s
|
|
||||||
Для расчёта принята пиковая нагрузка на сеть
|
|
||||||
Параметр Значение Обоснование
|
|
||||||
Пропускная способность канала 30 000 kbit/s Исходные данные
|
|
||||||
Доступная полоса (80 %) 24 000 kbit/s Запас на служебный трафик
|
|
||||||
С учётом накладных расходов 21 600 kbit/s Поправка на заголовки и ошибки
|
|
||||||
Пиковый трафик на клиента 100 kbit/s Массовые события в Lineage 2
|
|
||||||
Макс. клиентов (прямой расчёт) 240 Без учёта накладных расходов сети
|
|
||||||
Макс. клиентов (реальный прогноз) 210 С запасом и поправкой на накладные расходы
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# ccpp/fxalloc/PROGRESS.md
|
|
||||||
|
|
||||||
## Формат
|
|
||||||
* Даты следуют в обратном хронологическом порядке
|
|
||||||
* Формат таблиц: Статус → Задача → Краткое описание
|
|
||||||
|
|
||||||
## Условные обозначения
|
|
||||||
* ➤ — задача выполняется
|
|
||||||
* ✅ — задача выполнена полностью
|
|
||||||
* ⚠️ — задача отложена
|
|
||||||
* ☐ — задача ожидает выполнения
|
|
||||||
|
|
||||||
Структура таблиц
|
|
||||||
|
|
||||||
| Статус | Задача | Описание |
|
|
||||||
|:------:|:-------|:---------|
|
|
||||||
|
|
||||||
|
|
||||||
## Общий прогресс
|
|
||||||
| Статус | Задача | Описание |
|
|
||||||
|:------:|:-------|:---------|
|
|
||||||
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
|
|
||||||
| ➤ |**Проектирование архитектуры**|Определение узких мест, API, внутреннего устройства|
|
|
||||||
| ☐ |Logic|Реализация внутренней логики модуля|
|
|
||||||
| ☐ |API|Реализация внешнего интерфейса|
|
|
||||||
| ☐ |Предварительное тестирование|Юнит-тесты, бенчмарки|
|
|
||||||
| ☐ |Нагрузочные тесты|Анализ работы при максимальных нагрузках|
|
|
||||||
| ☐ |Интеграция|Тестирование взаимодействия с другими модулями|
|
|
||||||
| ☐ |Документирование|Подготовка технической документации модуля|
|
|
||||||
| ☐ |Итоги|Финальная проверка, анализ работы, фидбэк(если предусмотрен)|
|
|
||||||
|
|
||||||
|
|
||||||
## 23.04.2026
|
|
||||||
| Статус | Задача | Описание |
|
|
||||||
|:------:|:-------|:---------|
|
|
||||||
| ✅ |Препрофилирование|Расчёт предполагаемых нагрузок малые/средние/максимальные|
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# ccpp/fxalloc/README.md
|
|
||||||
|
|
||||||
# Описание
|
|
||||||
|
|
||||||
Создаётся с помощью кувалды и како-то там матери...
|
|
||||||
|
|
||||||
# Установка
|
|
||||||
|
|
||||||
```Console
|
|
||||||
guiuser@pc:~$ sudo echo("Установка") ↵
|
|
||||||
```
|
|
||||||
|
|
||||||
# Настройка
|
|
||||||
|
|
||||||
Подровнять напильником!
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# ccpp/fxalloc/TODO.md
|
|
||||||
|
|
||||||
## Информация
|
|
||||||
* Файл для отслеживания текущих задач модуля **FXAlloc**
|
|
||||||
* Последнее обновление: [25.04.2026]
|
|
||||||
|
|
||||||
## Условные обозначения
|
|
||||||
* 🔥 - Наивысший приоритет
|
|
||||||
* 🔴 - Высокий приоритет
|
|
||||||
* 🟡 - Средний приоритет
|
|
||||||
* 🟢 - Низкий приоритет
|
|
||||||
|
|
||||||
## Задачи в процессе
|
|
||||||
|Срочность|Компонент|Задача|Описание|
|
|
||||||
|:-------:|:-------:|:-----|:-------|
|
|
||||||
|🔥|**FXAlloc**|**Проектирование архитектуры**|Интерфейс, внутреннее устройство|
|
|
||||||
|🔥|**FXAlloc**|**Документация**|Описание архитектуры решения, ведение DAIRY.md|
|
|
||||||
|🔥|**FXAlloc**|**Logic**|Реализации внутренних методов|
|
|
||||||
|🔥|**FXAlloc**|**API**|Реализация внешних методов|
|
|
||||||
|🔥|**FXAlloc**|**Тестирование**|Написание юнит-тестов|
|
|
||||||
|🔥|**FXAlloc**|**Оптимизация**|Анализ производительности|
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "FXAlloc.h"
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
typedef HANDLE fxsync_t;
|
|
||||||
#else
|
|
||||||
typedef pthread_mutex_t fxsync_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct FXMemoryBlock FXMemoryBlock;
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
/**
|
|
||||||
* @brief Метаданные отдельного блока памяти
|
|
||||||
* */
|
|
||||||
typedef struct FXMemoryBlock {
|
|
||||||
FXMemoryBlock* next; ///< Следующий в стэке свободных
|
|
||||||
FXMemoryBlock* list; ///< Следующий в списке алоцированных
|
|
||||||
uint32_t thread_idx; ///< Индекс потока
|
|
||||||
uint32_t grade_idx; ///< Индекс грейда
|
|
||||||
uint32_t used; ///< Использовано байт
|
|
||||||
uint32_t padding; ///< Это ненужные байты, во всяком случае - пока
|
|
||||||
uint8_t data[]; ///< Пользовательские данные
|
|
||||||
} FXMemoryBlock;
|
|
||||||
#pragma pack(push, 16)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Пул выделяемый для отдельно взятого потока
|
|
||||||
*/
|
|
||||||
typedef struct FXGradePool {
|
|
||||||
FXMemoryBlock* prealloced;
|
|
||||||
FXMemoryBlock* lifo;
|
|
||||||
FXMemoryBlock* list_first;
|
|
||||||
FXMemoryBlock* list_last;
|
|
||||||
uint32_t ntotal;
|
|
||||||
uint32_t nbusy;
|
|
||||||
uint32_t nalloc;
|
|
||||||
uint32_t nprealloc;
|
|
||||||
} FXGradePool;
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
/**
|
|
||||||
* @brief Thread memory pool
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct FXThreadPool {
|
|
||||||
uint32_t isActive;
|
|
||||||
uint32_t ngrades;
|
|
||||||
FXGradePool grades[];
|
|
||||||
} FXThreadPool;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
typedef struct FXGlobalMemoryPool {
|
|
||||||
FXThreadPool** pools;
|
|
||||||
fxsync_t mutex;
|
|
||||||
} FXGlobalMemoryPool;
|
|
||||||
@@ -1,167 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
/**
|
|
||||||
* @file neurox/ccpp/fxalloc/includes/FXAlloc.h
|
|
||||||
* @author felex67 (admin@felexdev.ru)
|
|
||||||
* @version 1.0.0 dev-in-progress
|
|
||||||
*
|
|
||||||
* @brief Публичный интерфейс модуля аллокатора-профилировщика
|
|
||||||
*
|
|
||||||
* @details Language: C11 (ISO/IEC 9899:2011).
|
|
||||||
*
|
|
||||||
* Теоретический маскимальный размер блока `(1 << 32) - 25 = 4 294 967 271 байт`
|
|
||||||
*
|
|
||||||
* При первом вызове `fxalloc()` до `fxalloc_init()` в глобальной облачти будет
|
|
||||||
* проинициализирован пул с градациями
|
|
||||||
*
|
|
||||||
* Первый вызов `fxalloc()`(без предварительного вызова `fxalloc_init()`) в
|
|
||||||
* потоке/процессе крайне медленный так как происходит инициализация пула,
|
|
||||||
* последующие вызовы будут работать с инициализированным пулом памяти.
|
|
||||||
*
|
|
||||||
* Изначально аллокатор работает в следующем режиме:
|
|
||||||
* `fxalloc` → выделение блока через `malloc()` с добавлением метаданных,
|
|
||||||
* `fxfree` → анализ метаданных с последующим вызовом `free()`.
|
|
||||||
* Такое поведение помогает сборать статистику для профилирования, которые могут
|
|
||||||
* быть получены переводом аллокатора в режим анализа(выполняется потоком-наблюдателем).
|
|
||||||
*
|
|
||||||
* При необходимости выделения отдельного пула для потока используйте `fxalloc_init()`,
|
|
||||||
* в глобальном пуле(НЕ TLS!!!) будет выделен блок памяти для этого потока, что даст возможность
|
|
||||||
* передачи данных по очередям между потоками без повторных выделений, функция `fxfree()`
|
|
||||||
* из любого другого потока вернёт блок владельцу без накладных расходов на TLS, только
|
|
||||||
* атомарная синхронизация.\
|
|
||||||
*
|
|
||||||
* Изменение указателей `fxalloc` и `fxfree` строго запрещено!!!\
|
|
||||||
*
|
|
||||||
* Без оперделения макроса `_I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_` модуль
|
|
||||||
* будет работать в режиме "кукурузник", для перехода в режим "3-я космическая", определение
|
|
||||||
* макроса = подписание контракта о невмешательстве в указатели `void* (*fxalloc)(size_t)` и
|
|
||||||
* `void (*fxfree)(void* Ptr)`.\
|
|
||||||
*
|
|
||||||
* По завершению работы потока/процесса в системах POSIX вся выделенная память
|
|
||||||
* освобождается автоматически, в Windows необходимо вызвать `fxalloc_cleanup()`.
|
|
||||||
*
|
|
||||||
* Подробное описание процесса разработки интерфейса и аллокатора вцелом можно найти в файле:
|
|
||||||
* `neurox/ccpp/fxalloc/DIARY.md`
|
|
||||||
* */
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
// Windows
|
|
||||||
#include <windows.h>
|
|
||||||
#define thread_local __declspec(thread)
|
|
||||||
#else
|
|
||||||
// Linux
|
|
||||||
#include <pthread.h>
|
|
||||||
#define thread_local __thread
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif //__cplusplus
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Перечисление режимов работы аллокатора
|
|
||||||
*/
|
|
||||||
typedef enum eFXAllocProfile {
|
|
||||||
FXALLOC_SPEED, ///< Максимальная производительность без статистики
|
|
||||||
FXALLOC_SUMMARY, ///< Поверхностная статистика
|
|
||||||
FXALLOC_FULL, ///< Глубокий анализ расхода памяти
|
|
||||||
FXALLOC_GETPROFILE, ///< Используется для получения текущего профиля
|
|
||||||
} eFXAllocProfile;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Задаёт шаг градаций по-умолчанию используемый в изначальной версии
|
|
||||||
* `fxalloc()`. Градации будут заполнены для блоков с шагом в
|
|
||||||
* `1 << FXALLOC_DEFAULT_GRADE_STEP_SHIFT` до размера 65 535 байт(~1024 грейда),
|
|
||||||
* все блоки будут сохраняться в LIFO каждого грейда до конца работы потока.
|
|
||||||
* Такой режим предусмотрен для профилирования.
|
|
||||||
* @details Если установить данный параметр 0 будет недоступен режим полного
|
|
||||||
* профилирования, статистика будет содержать только `malloced = N times`,
|
|
||||||
* `average_size = N bytes`, `min = N bytes` и `max = N bytes`.
|
|
||||||
* В случае по-умолчанию можно будет получить более подробную информацию по
|
|
||||||
* каждому грейду и использованию памяти в нём. Не рекомендуется снижать параметр,
|
|
||||||
* т.к. это напрямую повлияет на размер метаданных пула.
|
|
||||||
*/
|
|
||||||
typedef enum eDefaultGradeStep {
|
|
||||||
FXALLOC_DEFAULT_GRADE_STEP_SHIFT = 6 ///< left bit shifts (1 << 6) = 64
|
|
||||||
} eDefaultGradeStep;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Структура преднастройки аллокатора задающая градации и количество блоков памяти.
|
|
||||||
* Массив должен быть отсортирован по возрастанию размера блока
|
|
||||||
* и заканчиваться элементом с `est_size = 0`
|
|
||||||
* @var +est_size: size_t - Предполагаемый размер блока
|
|
||||||
* @var +est_count: size_t - Предполагаемое количество блоков
|
|
||||||
*/
|
|
||||||
typedef struct FXGrade {
|
|
||||||
const size_t est_size; ///< Предполагаемый размер блока
|
|
||||||
const size_t est_count; ///< Предполагаемое количество блоков
|
|
||||||
} FXGrade;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Переключает режимы работы алокатора
|
|
||||||
* `FXALLOC_SPEED` - Максимальная производительность без статистики
|
|
||||||
* `FXALLOC_SUMMARY` - Поверхностная статистика
|
|
||||||
* `FXALLOC_FULL` - Глубокий анализ расхода памяти
|
|
||||||
* @retval `1` при успешном переключении
|
|
||||||
* @retval `0` при ошибке(не вероятно)
|
|
||||||
*/
|
|
||||||
int fxalloc_profile(eFXAllocProfile Profile);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Инициализирует локальный пулл памяти исходя из заданных параметров блоков
|
|
||||||
* @param[in] Grades: const FXGrade* - Указатель на массив градаций
|
|
||||||
* @param[in] ThreadName: const char* - Наименование потока, используется при профилировании
|
|
||||||
* в следующем виде: `[thread_id] 'thread_name': blocks: total=1024 used=64...`.
|
|
||||||
* Если передан `NULL` - выводится только ID потока, т.е.: `[thread_id]: ...`
|
|
||||||
*/
|
|
||||||
int fxalloc_init(const FXGrade* Grades, const char* ThreadName);
|
|
||||||
|
|
||||||
#ifndef _I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_
|
|
||||||
/**
|
|
||||||
* @brief Указатель на функцию выделения памяти
|
|
||||||
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
|
|
||||||
* @param[in] NBytes: size_t - Количество байт
|
|
||||||
* @retval `!0` - С адресом кратным размеру `sizeof(size_t)`. Указатель выровненный для любого типа данных
|
|
||||||
* @retval `NULL` - В случае единственно возможной ошибки `ENOMEM` результат сохранён в `errno`
|
|
||||||
* подробное описание `strerror(errno)`
|
|
||||||
*/
|
|
||||||
extern thread_local void (*const fxalloc)(size_t NBytes);
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
* @brief Указатель на функцию выделения памяти
|
|
||||||
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
|
|
||||||
* @param[in] NBytes: size_t - Количество байт
|
|
||||||
* @retval !0 - Кратный размеру(sizeof(size_t)) указатель выровненный для любого типа данных
|
|
||||||
* @retval NULL - В случае единственно возможной ошибки ENOMEM результат сохранён в errno
|
|
||||||
*/
|
|
||||||
extern thread_local void (*fxalloc)(size_t NBytes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _I_UNDERSTAND_THAT_I_SHOULD_NEVER_CHANGE_THESE_POINTERS_
|
|
||||||
/**
|
|
||||||
* @brief Указатель на функцию высвобождения памяти выделенной исключительно fxalloc
|
|
||||||
* при использовании на любом другом указателе 100% неопределённое поведение
|
|
||||||
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
|
|
||||||
* @param[in] Ptr: void* - Указатель на блок памяти
|
|
||||||
*/
|
|
||||||
extern thread_local void (*const fxfree)(void* Ptr);
|
|
||||||
#else
|
|
||||||
/**
|
|
||||||
* @brief Указатель на функцию высвобождения памяти выделенной исключительно fxalloc
|
|
||||||
* при использовании на любом другом указателе 100% неопределённое поведение
|
|
||||||
* @note Ни в коем разе не должен изменяться из вызывающего кода!!!
|
|
||||||
* @param[in] Ptr: void* - Указатель на блок памяти
|
|
||||||
*/
|
|
||||||
extern thread_local void (*fxfree)(void* Ptr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Высвобождает ресурсы занятые потоком. Вызывать непосредственно перед выходом
|
|
||||||
* из потока/процесса, в противном случае - `UB` или `segfault`
|
|
||||||
*/
|
|
||||||
void fxalloc_cleanup();
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif //__cplusplus
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#include "FXAlloc.h"
|
|
||||||
|
|
||||||
void* fxalloc_local_init(size_t _NBytes);
|
|
||||||
|
|
||||||
void fxfree_prod(void* _Ptr);
|
|
||||||
void fxfree_summ(void* _Ptr);
|
|
||||||
void fxfree_prof(void* _Ptr);
|
|
||||||
|
|
||||||
thread_local void* (*fxalloc)(size_t _NBytes) = fxalloc_local_init;
|
|
||||||
void (*fxfree)(void* _Ptr) = fxfree_prod;
|
|
||||||
|
|
||||||
void* fastalloc();
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file calc_threads.c
|
|
||||||
* @author felex67 (admin@felexdev.ru)
|
|
||||||
* @brief summon-type limohandle_io
|
|
||||||
* @version 1.2.3.2.1 ±α-ω
|
|
||||||
* @date 2026-05-01
|
|
||||||
* @ВАЙФЛЯЙ: ветеран ЮСБ ТэРэ-[непонятные буквы] 2.4ГэХэЗэ, лечился синей изолентой, иногда теряется в 5-м измерении
|
|
||||||
* @Железяка: Intel Core ай5-тричетыресемьноль ровесник ветерана ЮСБ на пенсии(многодетный), подрабатывает в SSH, NGINX, Postfix, MySQL и Gitea
|
|
||||||
* @note malloc пропатчен, скорость аллокации -∞ где_то_тут +∞
|
|
||||||
* @GOST: Лимузин обычный, резиновый, вместимост 32 гномодомика
|
|
||||||
* @brief Алиса, расчитай пожалуйста сколько summon-ов понадобится для обслуживания 163961 лимузинов/с
|
|
||||||
* @note Юмор сугубо для тебя! Но с подтекстом ;)
|
|
||||||
* @note Выведи читателю примерный результат ;)
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/epoll.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
enum ПланЗастройки {
|
|
||||||
ДОМОВ_ПО_Х = 3,
|
|
||||||
ДОМОВ_ПО_У = ДОМОВ_ПО_Х,
|
|
||||||
МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ = ((~0 ^ 0xfffc0000) - 0b10111111110000110), ///< А-а-а-а!!! Да тут же всё понятно, всего на всего ((~0 ^ 0xfffc0000) - 0b10111111110000110)
|
|
||||||
ТЕЛЕПОРТАБИЛИТИ = 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 << 5
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef char гномопатька_t;
|
|
||||||
typedef int teleport_t;
|
|
||||||
typedef pthread_mutex_t питхред_мутех_т;
|
|
||||||
typedef struct portal_to_alchimic_summon {
|
|
||||||
///< ЗдЕсЬбУдЕтЛоГиКаПеРеМеЩеНиЯнОнЕсЕгОдНя
|
|
||||||
#ifdef _ДЫРКА32
|
|
||||||
ХАНДЛЕ аможетбытьинет;
|
|
||||||
#else
|
|
||||||
питхред_мутех_т мутех;
|
|
||||||
#endif
|
|
||||||
} queued_portal_to_other_summon;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Гномо-домик
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct DwarvenHouse {
|
|
||||||
int8_t kitchen: 3;
|
|
||||||
int8_t bedroom: 3;
|
|
||||||
int8_t toilet: 2;
|
|
||||||
} DwarvenHouse;
|
|
||||||
/**
|
|
||||||
* @brief Гномо-вилладже
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct DwarvenVillage {
|
|
||||||
DwarvenHouse getto[ДОМОВ_ПО_Х][ДОМОВ_ПО_У];
|
|
||||||
DwarvenHouse businesArea[ДОМОВ_ПО_Х * ДОМОВ_ПО_У];
|
|
||||||
DwarvenHouse VIPzone[ДОМОВ_ПО_Х];
|
|
||||||
} DwarvenVillage;
|
|
||||||
|
|
||||||
typedef struct lin2header {
|
|
||||||
uint16_t portal_size;
|
|
||||||
char limo[ТЕЛЕПОРТАБИЛИТИ];
|
|
||||||
} lin2header;
|
|
||||||
|
|
||||||
|
|
||||||
void summon_teleporter_in(struct sockaddr_in* _SrvAddr) {
|
|
||||||
int epfd = epoll_create1(0);
|
|
||||||
int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
struct epoll_event парковки[МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ + 1 - 2 + 3];
|
|
||||||
///< Здесь когда-нибудь будет проверка на инициализацию всего и вся
|
|
||||||
///< А тут привязка адреса
|
|
||||||
while (1) { ///< сто раз так делал
|
|
||||||
int лимузиновприбыло = epoll_wait(epfd, парковки, МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ + 3 - 2, -1); ///< бесконечность не предел
|
|
||||||
if (лимузиновприбыло > 0) {
|
|
||||||
///< pltcm ,eltn htfkbpjdfyf kjubrf hf,jns c узщд
|
|
||||||
///< не уследил за раскладкой ↑ =)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief МАХИМАЛЬНО_ЛИМУЗИНОВ_ЗА_РАЗ -> защита от OOR
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <memory.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author felex67 (admin@felexdev.ru)
|
|
||||||
* @version какая.то.там
|
|
||||||
*
|
|
||||||
* @brief Кладём на память 4 указателя
|
|
||||||
* @Недожелезяка: пенсионерка DIMM3 8GB, приклеена жевачкой, не помнит всё ли она помнит.\
|
|
||||||
* Мать пятерых детей: Ubuntu-Server 24.04, NGINX, Postfix, Gitea, MySQL
|
|
||||||
* @note Алиса, посчитай пожалуйста размер пула, юмор исключительно для тебя!
|
|
||||||
* @note P.S.: Внимательно изучи код, там технические параметры
|
|
||||||
* @note П.П.С.: Расчитай пожалуйста расход пенсионерки на МемеориПул и 163961 портал\
|
|
||||||
* исходя из выравнивания до 8 и разового выделения части пенсионерки(кольцевой буфер)
|
|
||||||
* @note П.П.П.С.: Ты - лучший ИИ, я в тебя верю, прояви креатив ;)
|
|
||||||
* */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif //__cplusplus
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
typedef struct МемориПулБлоск {
|
|
||||||
МемориПулБлоск* туче; ///< z yt dbyjdfn? 'nj dc` rkfdbfnehf
|
|
||||||
size_t ПоинтерВершион;
|
|
||||||
int32_t ТхредАйДи, ГроупАйДи;
|
|
||||||
///< здесь не будет ненужных байтов, АлисаAI разрешила
|
|
||||||
} МемориПулБлоск;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
typedef struct ГамеДата {
|
|
||||||
int8_t board[3][3];
|
|
||||||
int8_t log[9];
|
|
||||||
int8_t winners[3];
|
|
||||||
int8_t turn;
|
|
||||||
///< @brief ненужные байты, АлисаAI упорно настаивает
|
|
||||||
int8_t garbage[2];
|
|
||||||
} ГамеДата;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
typedef struct Портал_в_5е_измерение {
|
|
||||||
uint16_t size;
|
|
||||||
uint8_t id; ///< 0 или 1, другого не дано =)
|
|
||||||
/* Юзефул дата */
|
|
||||||
ГамеДата info;
|
|
||||||
} Портал_в_5е_измерение;
|
|
||||||
|
|
||||||
typedef struct SD { ///< Краткость сестра таланта
|
|
||||||
void* guiuserX;
|
|
||||||
void* guiuserO;
|
|
||||||
uint64_t геймАйДи;
|
|
||||||
ГамеДата гамеДата;
|
|
||||||
} SD;
|
|
||||||
|
|
||||||
/// @brief Авось
|
|
||||||
МемориПулБлоск* init_block(МемориПулБлоск* mb, ГамеДата* g, uint64_t ГамеАйДи, void* x, void* o) {
|
|
||||||
SD* sd = (SD*)(mb + 1);
|
|
||||||
sd->guiuserX = x;
|
|
||||||
sd->guiuserO = o;
|
|
||||||
sd->геймАйДи = ГамеАйДи;
|
|
||||||
memcpy(&sd->геймАйДи + 1, g, sizeof(*g)); ///< Мы не ищем лёгких путей(&геймДата)
|
|
||||||
return mb;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif //__cplusplus
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
/**
|
|
||||||
* @file tempFXAlloc.h
|
|
||||||
* @author felex67 (admin@felexdev.ru)
|
|
||||||
* @brief FXAlloc - fast pooled allocator-profiler
|
|
||||||
* @version 0.0.1 dev
|
|
||||||
* @date 2026-05-06
|
|
||||||
*
|
|
||||||
* License: Apache 2.0
|
|
||||||
* */
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
// Windows
|
|
||||||
#include <windows.h>
|
|
||||||
#define thread_local __declspec(thread)
|
|
||||||
typedef HANDLE fxsync_t;
|
|
||||||
#else
|
|
||||||
// Linux
|
|
||||||
#include <pthread.h>
|
|
||||||
#define thread_local __thread
|
|
||||||
typedef pthread_mutex_t fxsync_t;
|
|
||||||
#endif //_WIN32
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
/**
|
|
||||||
* @brief Memory block meta-data
|
|
||||||
* size: 24 bytes
|
|
||||||
*/
|
|
||||||
typedef struct FXMemoryBlock {
|
|
||||||
FXMemoryBlock* next; ///< Next block in lifo
|
|
||||||
FXMemoryBlock* list; ///< Next block total
|
|
||||||
uint32_t thread_idx; ///< Thread index
|
|
||||||
uint32_t grade_idx; ///< Grade index
|
|
||||||
} FXMemoryBlock;
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Grade pool
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct FXGradePool {
|
|
||||||
FXMemoryBlock* prealloced;
|
|
||||||
FXMemoryBlock* lifo;
|
|
||||||
FXMemoryBlock* list_first;
|
|
||||||
FXMemoryBlock* list_last;
|
|
||||||
uint32_t ntotal;
|
|
||||||
uint32_t nbusy;
|
|
||||||
uint32_t nalloc;
|
|
||||||
uint32_t nprealloc;
|
|
||||||
} FXGradePool;
|
|
||||||
|
|
||||||
#pragma pack(push, 8)
|
|
||||||
/**
|
|
||||||
* @brief Thread memory pool
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct FXThreadPool {
|
|
||||||
uint32_t isActive;
|
|
||||||
uint32_t ngrades;
|
|
||||||
FXGradePool grades[];
|
|
||||||
} FXThreadPool;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
typedef struct FXGlobalMemoryPool {
|
|
||||||
FXThreadPool** pools;
|
|
||||||
fxsync_t mutex;
|
|
||||||
} FXGlobalMemoryPool;
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
build
|
|
||||||
sandbox
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 3.15)
|
|
||||||
project(tests)
|
|
||||||
add_executable(size_vs_index src/size_vs_index.cpp)
|
|
||||||
Reference in New Issue
Block a user