SlideShare a Scribd company logo
1 of 26
Download to read offline
Жилье комфорт-классаЖилье комфорт-класса
для акторов и хендлеровдля акторов и хендлеров
stdstd
Асинхронная разработка:
●
std::async
●
ASIO
Что здесь плохого?
stdstd
Асинхронная разработка:
●
std::async
●
ASIO
Что здесь плохого?
Thread pool
Что такое хорошо...Что такое хорошо...
●
На каждое ядро – ровно один поток
●
Потоки статические: создаются при старте
программы, уничтожаются при её
остановке
●
Поток прибивается гвоздем к своему ядру
●
Все данные – локальные для потока
… и что такое плохо… и что такое плохо
●
Разделяемые данные
●
Переключение контекста потоков
●
Создание потока на лету, под
кратковременную задачу
●
Синхронизация
Thread poolThread pool
●
[Pool] Разделяемые данные
●
[Pool] Переключение контекста потоков
●
Создание потока на лету, под
кратковременную задачу
●
[Pool] Синхронизация
ДевелопментДевелопмент
Программа = совокупность компонентов
(микросервисов, акторов)
Компонент:
- статический: время жизни = времени
жизни программы
- не надо заботиться о «живости»
- однопоточный: API вызывается в одном и
том же потоке
- нет синхронизации
АпартментАпартмент
●
Апартмент = поток + MPSC queue
●
Число апартментов = числу ядер
Apartment 1 Apartment 2
MsgQ MsgQ
АпартментыАпартменты
Apartment 1 Apartment 2
MsgQ MsgQ
Каждый компонент — single threaded
Общение между компонентами — async call
Компоненты не знают о расположении друг друга
Apartment APIApartment API
class apartment
{
public:
// Вызов функции в данном апартменте
// sizeof(ArgN) <= sizeof(uintptr_t)
void call( void(*func)());
template <typename Arg>
void call( void(*func)(Arg), Arg arg );
template <typename Arg1, typename Arg2>
void call( void(*func)(Arg1, Arg2), Arg1 arg1, Arg2 arg2 );
template <typename Arg1, typename Arg2, typename Arg3>
void call( void(*func)(Arg1, Arg2, Arg3),
Arg1 arg1, Arg2 arg2, Arg3 arg3 );
// вызов с бОльшим числом аргументов
template <typename Arg >
void call( void(*func)(std::unique_ptr<Arg>), std::unique_ptr<Arg> args );
};
Apartment queueApartment queue
class apartment
{
private:
struct queue_record {
union {
void(*func0)();
void(*func1)(uintptr_t);
void(*func2)(uintptr_t, uintptr_t);
void(*func3)(uintptr_t, uintptr_t, uintptr_t);
};
unsigned arg_count;
uintptr_t arg1, arg2, arg3;
};
mpsc_queue<queue_record, 4096> queue_;
};
Component API exampleComponent API example
class Component {
public:
static void populate( apartment* ap ) { apartment_ = ap; }
static apartment* get_apartment() { return apartment_; }
// Безусловно асинхронный вызов
static void action1()
{ apartment_->call( do_action1 ); }
// Условно асинхронный вызов
static void action2( unsigned arg )
{
if ( current_apartment() != apartment_ )
apartment_->call( action1, arg );
else {
// находимся в своем апартменте
// делаем что должно
}
}
private:
static void do_action1() { /* . . . */ }
private:
static apartment* apartment_;
};
No getters!No getters!
Все методы API компонента не имеют
возвращаемых значений!
API компонента — это вызов действий
Компонент 1 std::future Компонент 2
??
Линеаризация std::futureЛинеаризация std::future
Component1::action([](std::unique_ptr<future> args)
{
Component2::action2( std::move( args ));
}
);
Наращиваем сервисыНаращиваем сервисы
Необходимо:
●
Сетевое взаимодействие
●
Планировщик — выполнение
периодических действий и действий по
расписанию
Root apartmentRoot apartment
Apartment 1 Apartment 2
MsgQ MsgQ
Root apartment
MsgQ
Net monitor Scheduler
int epoll_wait(
int epfd,
struct epoll_event
*events,
int maxevents,
int timeout
);
Connection monitor APIConnection monitor API
struct connection_monitor::descriptor {
typedef void (* handler )( connection_monitor* mon, descriptor* desc,
int flags
);
int fd = -1; // socket
// чего ждем - флаги epoll: EPOLLIN, EPOLLOUT, EPOLLONESHOT, EPOLLET
unsigned mode = 0;
// Целевой apartment, в котором вызывать функции-обработчики
apartment* target_apartment = nullptr;
// Обязательный обработчик готовности сокета.
handler on_data_ready = nullptr;
// Обязательный обработчик ошибок.
handler on_error = nullptr;
// Вызывается при событиях EPOLLHUP или EPOLLRDHUP - закрытия сокета
handler on_socket_closed = nullptr;
};
Connection monitor APIConnection monitor API
class connection_monitor {
public:
// Добавляет дескриптор p desc в монитор
// @warning Функция не копирует p desc,
// а хранит указатель на переданный аргумент
bool add( descriptor& desc);
// Удаляет дескриптор desc из списка мониторируемых
bool remove( descriptor& desc );
// Временно прекращает мониторинг дескриптора
bool suspend( descriptor& desc );
// Возобновляет мониторинг дескриптора
bool resume( descriptor& desc );
};
Scheduler APIScheduler API
class scheduler {
public:
// запуск функции func через timeout в апартменте ap
task_id_t schedule( apartment& ap, timeout_t timeout, void (* func)());
// регистрация периодической задачи func, выполняющейся в апартменте ap
task_id_t schedule_periodic( apartment& ap, timeout_t start_timeout,
timeout_t period, void (* func)());
// Отзыв задачи
void revoke( task_id_t task_id );
};
Apartment allocatorApartment allocator
ТребованияТребования:
●
Thread-local
●
Избежать фрагментации
●
free( ptr ): нужно быстро понять, каким
апартментом аллоцирован ptr
●
Выделенный блок памяти не должен иметь
префиксов / управляющих структур
РешениеРешение: страничный single-threaded
субаллокатор
Apartment allocatorApartment allocator
Apartment 1
MsgQ
1
1
2
3
4
A: ptr = ap1.alloc( 64 )
2 A: B.invoke( foo, ptr );
A B
3 B: foo( ptr ) { ...
4 B: ap1.free( ptr ); }
Apartment allocatorApartment allocator
Apartment 1
MsgQ
1
1
2
A: ptr = ap1.alloc( 64 )
2 A: B.invoke( foo, ptr );
A
3 B: foo( ptr ) { ...
4 B: ap2.free( ptr ); } - oops!!!
Apartment 2
MsgQ
3
4
B
Apartment allocatorApartment allocator
Apartment 1
MsgQ
1
1
2
A: ptr = ap1.alloc( 64 )
2 A: B.invoke( foo, ptr );
A
3 B: foo( ptr ) { ...
4 B: ap2.free( ptr ); }
Apartment 2
MsgQ
3
4
B
5
6
5 ap2 allocator: ap1.invoke( free, ptr )
6 ap1: ap1.free( ptr )
Apartment allocatorApartment allocator
64 byte
Size classes
128 byte
64Kbyte
Page list
Page list
Page list
page_size = 2M, 2M-aligned
struct page_header {
uintptr_t magic; // magic word
size_class_desc* psc; // size_class
// апартмент-владелец страницы
apartment* owner;
// 1-й свободный блок страницы
void* first_free_block;
// связь в списки для size_class
page_header* next;
//... прочие данные
};
x x x x 0 0 0free( ptr )
0202163
page address
Dynamic memory debuggingDynamic memory debugging
Page header
Block
Block
Block
. . .
Block
Data area
Red zone 0xFD
Blocktail guard
struct blocktail_guard {
// сколько байт
// запрашивалось alloc()
uint32_t real_size;
// magic word
uint32_t guard;
};
Unused
alloc(N) -> alloc( N + sizeof(red_zone) + sizeof(blocktail_guard))
Спасибо за внимание!Спасибо за внимание!
Apartment 1 Apartment 2
MsgQ MsgQ
Root apartment
MsgQ
Net monitor Scheduler

More Related Content

What's hot

Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторыОмские ИТ-субботники
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Sigma Software
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работуcorehard_by
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 

What's hot (20)

Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
Опыт применения активных объектов во встраиваемых системах. Архитектурные асп...
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Zagursky
ZagurskyZagursky
Zagursky
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 

Similar to Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spring 2019

Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019corehard_by
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Roman Tsisyk
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Oleksii Okhrymenko
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...corehard_by
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutinescorehard_by
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsAlexey Paznikov
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыYandex
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 

Similar to Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spring 2019 (20)

Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019
 
Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25Tarantool Modules, Tarantool Meetup 2016-08-25
Tarantool Modules, Tarantool Meetup 2016-08-25
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX ThreadsПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
ПВТ - осень 2014 - Лекция 3 - Стандарт POSIX Threads
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Modul №2. OOP C++
Modul  №2. OOP C++Modul  №2. OOP C++
Modul №2. OOP C++
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_by
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
 

Жилье комфорт-класса для акторов и хендлеров. Максим Хижинский. CoreHard Spring 2019

  • 1. Жилье комфорт-классаЖилье комфорт-класса для акторов и хендлеровдля акторов и хендлеров
  • 4. Что такое хорошо...Что такое хорошо... ● На каждое ядро – ровно один поток ● Потоки статические: создаются при старте программы, уничтожаются при её остановке ● Поток прибивается гвоздем к своему ядру ● Все данные – локальные для потока
  • 5. … и что такое плохо… и что такое плохо ● Разделяемые данные ● Переключение контекста потоков ● Создание потока на лету, под кратковременную задачу ● Синхронизация
  • 6. Thread poolThread pool ● [Pool] Разделяемые данные ● [Pool] Переключение контекста потоков ● Создание потока на лету, под кратковременную задачу ● [Pool] Синхронизация
  • 7. ДевелопментДевелопмент Программа = совокупность компонентов (микросервисов, акторов) Компонент: - статический: время жизни = времени жизни программы - не надо заботиться о «живости» - однопоточный: API вызывается в одном и том же потоке - нет синхронизации
  • 8. АпартментАпартмент ● Апартмент = поток + MPSC queue ● Число апартментов = числу ядер Apartment 1 Apartment 2 MsgQ MsgQ
  • 9. АпартментыАпартменты Apartment 1 Apartment 2 MsgQ MsgQ Каждый компонент — single threaded Общение между компонентами — async call Компоненты не знают о расположении друг друга
  • 10. Apartment APIApartment API class apartment { public: // Вызов функции в данном апартменте // sizeof(ArgN) <= sizeof(uintptr_t) void call( void(*func)()); template <typename Arg> void call( void(*func)(Arg), Arg arg ); template <typename Arg1, typename Arg2> void call( void(*func)(Arg1, Arg2), Arg1 arg1, Arg2 arg2 ); template <typename Arg1, typename Arg2, typename Arg3> void call( void(*func)(Arg1, Arg2, Arg3), Arg1 arg1, Arg2 arg2, Arg3 arg3 ); // вызов с бОльшим числом аргументов template <typename Arg > void call( void(*func)(std::unique_ptr<Arg>), std::unique_ptr<Arg> args ); };
  • 11. Apartment queueApartment queue class apartment { private: struct queue_record { union { void(*func0)(); void(*func1)(uintptr_t); void(*func2)(uintptr_t, uintptr_t); void(*func3)(uintptr_t, uintptr_t, uintptr_t); }; unsigned arg_count; uintptr_t arg1, arg2, arg3; }; mpsc_queue<queue_record, 4096> queue_; };
  • 12. Component API exampleComponent API example class Component { public: static void populate( apartment* ap ) { apartment_ = ap; } static apartment* get_apartment() { return apartment_; } // Безусловно асинхронный вызов static void action1() { apartment_->call( do_action1 ); } // Условно асинхронный вызов static void action2( unsigned arg ) { if ( current_apartment() != apartment_ ) apartment_->call( action1, arg ); else { // находимся в своем апартменте // делаем что должно } } private: static void do_action1() { /* . . . */ } private: static apartment* apartment_; };
  • 13. No getters!No getters! Все методы API компонента не имеют возвращаемых значений! API компонента — это вызов действий Компонент 1 std::future Компонент 2 ??
  • 15. Наращиваем сервисыНаращиваем сервисы Необходимо: ● Сетевое взаимодействие ● Планировщик — выполнение периодических действий и действий по расписанию
  • 16. Root apartmentRoot apartment Apartment 1 Apartment 2 MsgQ MsgQ Root apartment MsgQ Net monitor Scheduler int epoll_wait( int epfd, struct epoll_event *events, int maxevents, int timeout );
  • 17. Connection monitor APIConnection monitor API struct connection_monitor::descriptor { typedef void (* handler )( connection_monitor* mon, descriptor* desc, int flags ); int fd = -1; // socket // чего ждем - флаги epoll: EPOLLIN, EPOLLOUT, EPOLLONESHOT, EPOLLET unsigned mode = 0; // Целевой apartment, в котором вызывать функции-обработчики apartment* target_apartment = nullptr; // Обязательный обработчик готовности сокета. handler on_data_ready = nullptr; // Обязательный обработчик ошибок. handler on_error = nullptr; // Вызывается при событиях EPOLLHUP или EPOLLRDHUP - закрытия сокета handler on_socket_closed = nullptr; };
  • 18. Connection monitor APIConnection monitor API class connection_monitor { public: // Добавляет дескриптор p desc в монитор // @warning Функция не копирует p desc, // а хранит указатель на переданный аргумент bool add( descriptor& desc); // Удаляет дескриптор desc из списка мониторируемых bool remove( descriptor& desc ); // Временно прекращает мониторинг дескриптора bool suspend( descriptor& desc ); // Возобновляет мониторинг дескриптора bool resume( descriptor& desc ); };
  • 19. Scheduler APIScheduler API class scheduler { public: // запуск функции func через timeout в апартменте ap task_id_t schedule( apartment& ap, timeout_t timeout, void (* func)()); // регистрация периодической задачи func, выполняющейся в апартменте ap task_id_t schedule_periodic( apartment& ap, timeout_t start_timeout, timeout_t period, void (* func)()); // Отзыв задачи void revoke( task_id_t task_id ); };
  • 20. Apartment allocatorApartment allocator ТребованияТребования: ● Thread-local ● Избежать фрагментации ● free( ptr ): нужно быстро понять, каким апартментом аллоцирован ptr ● Выделенный блок памяти не должен иметь префиксов / управляющих структур РешениеРешение: страничный single-threaded субаллокатор
  • 21. Apartment allocatorApartment allocator Apartment 1 MsgQ 1 1 2 3 4 A: ptr = ap1.alloc( 64 ) 2 A: B.invoke( foo, ptr ); A B 3 B: foo( ptr ) { ... 4 B: ap1.free( ptr ); }
  • 22. Apartment allocatorApartment allocator Apartment 1 MsgQ 1 1 2 A: ptr = ap1.alloc( 64 ) 2 A: B.invoke( foo, ptr ); A 3 B: foo( ptr ) { ... 4 B: ap2.free( ptr ); } - oops!!! Apartment 2 MsgQ 3 4 B
  • 23. Apartment allocatorApartment allocator Apartment 1 MsgQ 1 1 2 A: ptr = ap1.alloc( 64 ) 2 A: B.invoke( foo, ptr ); A 3 B: foo( ptr ) { ... 4 B: ap2.free( ptr ); } Apartment 2 MsgQ 3 4 B 5 6 5 ap2 allocator: ap1.invoke( free, ptr ) 6 ap1: ap1.free( ptr )
  • 24. Apartment allocatorApartment allocator 64 byte Size classes 128 byte 64Kbyte Page list Page list Page list page_size = 2M, 2M-aligned struct page_header { uintptr_t magic; // magic word size_class_desc* psc; // size_class // апартмент-владелец страницы apartment* owner; // 1-й свободный блок страницы void* first_free_block; // связь в списки для size_class page_header* next; //... прочие данные }; x x x x 0 0 0free( ptr ) 0202163 page address
  • 25. Dynamic memory debuggingDynamic memory debugging Page header Block Block Block . . . Block Data area Red zone 0xFD Blocktail guard struct blocktail_guard { // сколько байт // запрашивалось alloc() uint32_t real_size; // magic word uint32_t guard; }; Unused alloc(N) -> alloc( N + sizeof(red_zone) + sizeof(blocktail_guard))
  • 26. Спасибо за внимание!Спасибо за внимание! Apartment 1 Apartment 2 MsgQ MsgQ Root apartment MsgQ Net monitor Scheduler