SlideShare une entreprise Scribd logo
1  sur  63
Télécharger pour lire hors ligne
Memory model C++
Янковский Андрей, werat@yandex-team.ru
Phil Karlton
There are only two hard things
in Computer Science: cache
invalidation, naming things
and off-by-one errors.
<thread>
<mutex>
<conditional_variable>
<future>
<atomic>
4
Многопоточность в C++11
Ура!
Теперь мы можем писать
кросс-платформенный
многопоточный код?
6
Ожидание
7
Реальность
Что пошло не так?
Кто виноват?
Процесс
Поток
Разделяемая память
Атомарность операций
9
Компилятор С++ слишком умный
Singleton* Singleton::Get() {
if (instance == nullptr) {
std::lock_guard<std::mutex> guard(lock);
if (instance == nullptr) {
instance = new Singleton();
!
}
}
return instance;
}
10
Пример #1
Singleton* Singleton::Get() {
if (instance == nullptr) {
std::lock_guard<std::mutex> guard(lock);
if (instance == nullptr) {
instance = operator new(sizeof(Singleton)); // 1
new (instance) Singleton; // 2
}
}
return instance;
}
11
Пример #1 (продолжение)
Memory reordering
13
Как работает процессор
CPU
Memory
14
Как работает процессор
CPU
Memory
Cache
15
Как работает процессор
CPU
Memory
Cache
CPU
Cache
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
assert(data == 42);
}
}
16
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
ready = true;
data = 42;
}
 
void bar() { // CPU 1
if (ready) {
assert(data == 42);
}
}
17
Пример #2
CPU
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
ready = true;
}
 
void bar() { // CPU 1
int tmp = data;
if (ready) {
assert(tmp == 42);
}
}
18
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
____________
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
__________
assert(data == 42);
}
}
19
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
STORE_______
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
__________
assert(data == 42);
}
}
20
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
ready = true;
data = 42;
STORE_______
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
__________
assert(data == 42);
}
}
21
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
STORE__STORE
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
__________
assert(data == 42);
}
}
22
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
STORE__STORE
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
LOAD______
assert(data == 42);
}
}
23
Пример #2
int data;
volatile bool ready = false;
 
void foo() { // CPU 0
data = 42;
STORE__STORE
ready = true;
}
 
void bar() { // CPU 1
if (ready) {
LOAD__LOAD
assert(data == 42);
}
}
24
Пример #2
XX_YY — гарантирует, что все XX-операции до барьера будут
выполнены до того, как начнут выполняться YY-операции после
барьера.
25
Барьер памяти
XX_YY — гарантирует, что все XX-операции до барьера будут
выполнены до того, как начнут выполняться YY-операции после
барьера.
26
Барьер памяти
LoadLoad LoadStore
StoreLoad StoreStore
XX_YY — гарантирует, что все XX-операции до барьера будут
выполнены до того, как начнут выполняться YY-операции после
барьера.
27
Барьер памяти
LoadLoad LoadStore
StoreLoad StoreStore
Acquire
Release
Acquire — гарантирует, что любые операции после барьера будут
выполнены после того, как будут выполнены все Load-операции до
барьера.
28
Acquire
Acquire — гарантирует, что любые операции после барьера будут
выполнены после того, как будут выполнены все Load-операции до
барьера.
29
Acquire
mov [x], 1
mov eax, [y]
acquire_fence
mov ebx, [w]
mov ecx, [e]
mov [q], 3
Acquire — гарантирует, что любые операции после барьера будут
выполнены после того, как будут выполнены все Load-операции до
барьера.
30
Acquire
mov [x], 1
mov ebx, [w] <—
mov eax, [y]
acquire_fence
mov ebx, [w]
mov ecx, [e]
mov [q], 3
Acquire — гарантирует, что любые операции после барьера будут
выполнены после того, как будут выполнены все Load-операции до
барьера.
31
Acquire
mov [x], 1
mov eax, [y]
acquire_fence
mov [x], 1 <—
mov ebx, [w]
mov ecx, [e]
mov [q], 3
Release — гарантирует, что любые операции до барьера будут
выполнены до того, как начнут выполняться Store-операции после
барьера.
32
Release
Release — гарантирует, что любые операции до барьера будут
выполнены до того, как начнут выполняться Store-операции после
барьера.
33
Release
mov [x], 1
mov eax, [y]
mov [z], 2
release_fence
mov [w], 3
mov ebx, [k]
Release — гарантирует, что любые операции до барьера будут
выполнены до того, как начнут выполняться Store-операции после
барьера.
34
Release
mov [x], 1
mov eax, [y]
mov [z], 2
release_fence
mov [w], 3
mov [z], 2 <—
mov ebx, [k]
Release — гарантирует, что любые операции до барьера будут
выполнены до того, как начнут выполняться Store-операции после
барьера.
35
Release
mov [x], 1
mov eax, [y]
mov [z], 2
mov ebx, [k] <—
release_fence
mov [w], 3
mov ebx, [k]
void function_with_lock() {
...
if (can_enter) {
acquire_fence(); // LoadLoad + LoadStore
// all instructions
// stay between
// these fences
release_fence(); // StoreStore + LoadStore
can_enter = true;
}
...
}
36
Что такое acquire/release?
bool x = true;
bool y = true;
 
void foo() { // CPU 0
x = false;
assert(y);
}
 
void bar() { // CPU 1
y = false;
assert(x);
}
37
Пример #3
bool x = true;
bool y = true;
 
void foo() { // CPU 0
assert(y);
x = false;
}
 
void bar() { // CPU 1
y = false;
assert(x);
}
38
Пример #3
bool x = true;
bool y = true;
 
void foo() { // CPU 0
x = false;
___________
assert(y);
}
 
void bar() { // CPU 1
y = false;
___________
assert(x);
}
39
Пример #3
bool x = true;
bool y = true;
 
void foo() { // CPU 0
x = false;
Store______
assert(y);
}
 
void bar() { // CPU 1
y = false;
Store______
assert(x);
}
40
Пример #3
bool x = true;
bool y = true;
 
void foo() { // CPU 0
x = false;
Store__Load
assert(y);
}
 
void bar() { // CPU 1
y = false;
Store__Load
assert(x);
}
41
Пример #3
bool x = true;
bool y = true;
 
void foo() { // CPU 0
x = false;
Store__Load
assert(y);
}
 
void bar() { // CPU 1
y = false;
Store__Load
assert(x);
}
42
Пример #3
Это самый “тяжелый” из барьеров
StoreLoad означает полную синхронизацию всех кэшей
процессоров.
Ситуации, где он действительно нужен, довольно редки
43
Почему StoreLoad стоит отдельно?
Memory models
Sequential consistency
Strongly-ordered
Weakly-ordered (data dependency ordering)
Super-weak
45
Модель памяти
Никаких memory reordering
Гарантируется, что каждый процессор видит все изменения в системе в
том же порядке, что и остальные процессоры.
46
Sequential consistency
Каждая операция имеет acquire и release семантику
Все процессоры видят последовательности чтений и записей в
одном порядке, но перестановки StoreLoad уже возможны
!
!
Пример: x86/64
47
Strongly-ordered
Гарантируется лишь упорядоченность для операций, зависимых по
данным
int* ptr = GlobalPointer;
if (ptr)
int value = *ptr;
!
!
Примеры: ARMv7, PowerPC, Itanium
48
Weakly-ordered
Никаких гарантий: процессор может делать, что угодно
Примеры: Alpha
49
Super-weak (no guaranties)
enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
};
50
#include <atomic>
#include <atomic>
!
!
!
T load(memory_order = memory_order_seq_cst) const;
void store(T desired, memory_order = memory_order_seq_cst);
 
void atomic_thread_fence(memory_order order);
51
Барьеры памяти С++
std::atomic<bool> ready;
!
void foo() { // CPU 0
data = 42;
ready.store(true);
}
 
void bar() { // CPU 1
if (ready.load()) {
assert(data == 42);
}
}
52
Барьеры памяти С++
std::atomic<bool> ready;
!
void foo() { // CPU 0
data = 42;
ready.store(true, std::memory_order_release);
}
 
void bar() { // CPU 1
if (ready.load(std::memory_order_acquire)) {
assert(data == 42);
}
}
53
Барьеры памяти С++
std::atomic<bool> ready;
 
void foo() { // CPU 0
data = 42;
std::atomic_thread_fence(std::memory_order_release);
ready.store(true, std::memory_order_relaxed);
}
 
void bar() { // CPU 1
if (ready.load(true, std::memory_order_relaxed)) {
std::atomic_thread_fence(std::memory_order_acquire);
assert(data == 42);
}
}
54
Барьеры памяти С++
std::atomic<Foo*> p;
Foo payload;
int value = 42;
 
void foo() { // CPU 0
payload.name = "Andy";
value = 314;
p.store(&payload, std::memory_order_release);
}
 
void bar() { // CPU 1
if (auto f = p.load(std::memory_order_consume)) {
std::cout << f->name << std::endl; // Andy
assert(value == 314); // can fire (but probably won't)
}
}
55
Зачем std::memory_order_consume?
std::atomic<Foo*> p;
Foo payload;
int value = 42;
 
void foo() { // CPU 0
payload.name = "Andy";
value = 314;
p.store(&payload, std::memory_order_release);
}
 
void bar() { // CPU 1
int tmp = value;
if (auto f = p.load(std::memory_order_consume)) {
std::cout << f->name << std::endl; // Andy
assert(tmp == 314);
}
}
56
Зачем std::memory_order_consume?
Компиляторы не поддерживают это поведение (поэтому на weak-
процессорах все равно скорее всего будет барьер)
x86/64 и без этого прекрасно работает
57
Почему probably won’t?
Зачем мне все это знать?
Я не пишу lock-free код!
Singleton* Singleton::Get() {
if (instance.load() == nullptr) {
std::lock_guard<std::mutex> guard(lock);
if (instance.load() == nullptr) {
instance.store(new Singleton());
}
}
return instance.load();
}
59
Пример #1 (almost fixed)
Singleton* Singleton::Get() {
auto tmp = instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
if (tmp == nullptr) {
std::lock_guard<std::mutex> guard(lock);
tmp = instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton();
std::atomic_thread_fence(std::memory_order_release);
instance.store(tmp, std::memory_order_relaxed);
}
}
return tmp;
}
60
Пример #1 (fixed)
Все это проявляется только в многопроцессорной/многоядерной
среде
И только в lock-free коде
61
Но как мы жили раньше?
Спасибо за внимание,
пишите хороший код :)
Янковский Андрей
Разработчик
@weratwerat@yandex-team.ru

Contenu connexe

Tendances

ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05Computer Science Club
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 

Tendances (20)

ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
2012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture052012 03 14_parallel_programming_lecture05
2012 03 14_parallel_programming_lecture05
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 

En vedette

Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноАлександр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноYandex
 
Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Alexey Miasoedov
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Mikhail Kurnosov
 
Регулярные выражения C++
Регулярные выражения C++Регулярные выражения C++
Регулярные выражения C++Dmitry Bulgakov
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
алексей тихонов
алексей тихоновалексей тихонов
алексей тихоновYandex
 
Коллективная разработка документации: от индивидуального авторства к командн...
 Коллективная разработка документации: от индивидуального авторства к командн... Коллективная разработка документации: от индивидуального авторства к командн...
Коллективная разработка документации: от индивидуального авторства к командн...Yandex
 
Михаил Трошев — Инструменты веб-разработки
Михаил Трошев — Инструменты веб-разработкиМихаил Трошев — Инструменты веб-разработки
Михаил Трошев — Инструменты веб-разработкиYandex
 
Дмитрий Васильев - Задачи ассиметричной криптографии
Дмитрий Васильев - Задачи ассиметричной криптографииДмитрий Васильев - Задачи ассиметричной криптографии
Дмитрий Васильев - Задачи ассиметричной криптографииYandex
 
Тропинка через минное поле — Леонычев Юрий
Тропинка через минное поле — Леонычев ЮрийТропинка через минное поле — Леонычев Юрий
Тропинка через минное поле — Леонычев ЮрийYandex
 
Жидков Игорь - Elliptics
Жидков Игорь - Elliptics   Жидков Игорь - Elliptics
Жидков Игорь - Elliptics Yandex
 
Антон Качалов - Популярно об IPMI и UEFI
Антон Качалов - Популярно об IPMI и UEFI Антон Качалов - Популярно об IPMI и UEFI
Антон Качалов - Популярно об IPMI и UEFI Yandex
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковYandex
 
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, РиманАндрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, РиманYandex
 
Руководство по стилю документации: зачем и как, Татьяна Грачёва
Руководство по стилю документации: зачем и как, Татьяна ГрачёваРуководство по стилю документации: зачем и как, Татьяна Грачёва
Руководство по стилю документации: зачем и как, Татьяна ГрачёваYandex
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Мобильная Яндекс.Почта — Дмитрий Александров
Мобильная Яндекс.Почта — Дмитрий АлександровМобильная Яндекс.Почта — Дмитрий Александров
Мобильная Яндекс.Почта — Дмитрий АлександровYandex
 
Симаков Алексей - Системы управления кластерами
 Симаков Алексей - Системы управления кластерами   Симаков Алексей - Системы управления кластерами
Симаков Алексей - Системы управления кластерами Yandex
 
Как делается Яндекс.Браузер — Михаил Лопаткин
Как делается Яндекс.Браузер — Михаил ЛопаткинКак делается Яндекс.Браузер — Михаил Лопаткин
Как делается Яндекс.Браузер — Михаил ЛопаткинYandex
 
Константин Горский - Дизайн
Константин Горский - ДизайнКонстантин Горский - Дизайн
Константин Горский - ДизайнYandex
 

En vedette (20)

Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобноАлександр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
Александр Пономарев — Разработка приложения под Cocaine — быстро, просто, удобно
 
Страуструп - Язык программирования C++
Страуструп - Язык программирования C++Страуструп - Язык программирования C++
Страуструп - Язык программирования C++
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
 
Регулярные выражения C++
Регулярные выражения C++Регулярные выражения C++
Регулярные выражения C++
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
алексей тихонов
алексей тихоновалексей тихонов
алексей тихонов
 
Коллективная разработка документации: от индивидуального авторства к командн...
 Коллективная разработка документации: от индивидуального авторства к командн... Коллективная разработка документации: от индивидуального авторства к командн...
Коллективная разработка документации: от индивидуального авторства к командн...
 
Михаил Трошев — Инструменты веб-разработки
Михаил Трошев — Инструменты веб-разработкиМихаил Трошев — Инструменты веб-разработки
Михаил Трошев — Инструменты веб-разработки
 
Дмитрий Васильев - Задачи ассиметричной криптографии
Дмитрий Васильев - Задачи ассиметричной криптографииДмитрий Васильев - Задачи ассиметричной криптографии
Дмитрий Васильев - Задачи ассиметричной криптографии
 
Тропинка через минное поле — Леонычев Юрий
Тропинка через минное поле — Леонычев ЮрийТропинка через минное поле — Леонычев Юрий
Тропинка через минное поле — Леонычев Юрий
 
Жидков Игорь - Elliptics
Жидков Игорь - Elliptics   Жидков Игорь - Elliptics
Жидков Игорь - Elliptics
 
Антон Качалов - Популярно об IPMI и UEFI
Антон Качалов - Популярно об IPMI и UEFI Антон Качалов - Популярно об IPMI и UEFI
Антон Качалов - Популярно об IPMI и UEFI
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий Земсков
 
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, РиманАндрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
Андрей Соболевский - Вокруг Базельской задачи: Бернулли, Эйлер, Риман
 
Руководство по стилю документации: зачем и как, Татьяна Грачёва
Руководство по стилю документации: зачем и как, Татьяна ГрачёваРуководство по стилю документации: зачем и как, Татьяна Грачёва
Руководство по стилю документации: зачем и как, Татьяна Грачёва
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
Мобильная Яндекс.Почта — Дмитрий Александров
Мобильная Яндекс.Почта — Дмитрий АлександровМобильная Яндекс.Почта — Дмитрий Александров
Мобильная Яндекс.Почта — Дмитрий Александров
 
Симаков Алексей - Системы управления кластерами
 Симаков Алексей - Системы управления кластерами   Симаков Алексей - Системы управления кластерами
Симаков Алексей - Системы управления кластерами
 
Как делается Яндекс.Браузер — Михаил Лопаткин
Как делается Яндекс.Браузер — Михаил ЛопаткинКак делается Яндекс.Браузер — Михаил Лопаткин
Как делается Яндекс.Браузер — Михаил Лопаткин
 
Константин Горский - Дизайн
Константин Горский - ДизайнКонстантин Горский - Дизайн
Константин Горский - Дизайн
 

Similaire à Модель памяти C++ - Андрей Янковский, Яндекс

ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииCEE-SEC(R)
 
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
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Anastasia Lubennikova
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркингаAndrey Akinshin
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийAndrey Akinshin
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийMikhail Shcherbakov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1921519
 

Similaire à Модель памяти C++ - Андрей Янковский, Яндекс (20)

ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализации
 
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
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Сложности микробенчмаркинга
Сложности микробенчмаркингаСложности микробенчмаркинга
Сложности микробенчмаркинга
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Lab5
Lab5Lab5
Lab5
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1
 

Plus de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 
Эталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатовЭталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатовYandex
 

Plus de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 
Эталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатовЭталонное описание фильма на основе десятков дубликатов
Эталонное описание фильма на основе десятков дубликатов
 

Модель памяти C++ - Андрей Янковский, Яндекс

  • 1.
  • 2. Memory model C++ Янковский Андрей, werat@yandex-team.ru
  • 3. Phil Karlton There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
  • 5. Ура! Теперь мы можем писать кросс-платформенный многопоточный код?
  • 8. Что пошло не так? Кто виноват?
  • 10. Singleton* Singleton::Get() { if (instance == nullptr) { std::lock_guard<std::mutex> guard(lock); if (instance == nullptr) { instance = new Singleton(); ! } } return instance; } 10 Пример #1
  • 11. Singleton* Singleton::Get() { if (instance == nullptr) { std::lock_guard<std::mutex> guard(lock); if (instance == nullptr) { instance = operator new(sizeof(Singleton)); // 1 new (instance) Singleton; // 2 } } return instance; } 11 Пример #1 (продолжение)
  • 16. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; ready = true; }   void bar() { // CPU 1 if (ready) { assert(data == 42); } } 16 Пример #2
  • 17. int data; volatile bool ready = false;   void foo() { // CPU 0 ready = true; data = 42; }   void bar() { // CPU 1 if (ready) { assert(data == 42); } } 17 Пример #2 CPU
  • 18. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; ready = true; }   void bar() { // CPU 1 int tmp = data; if (ready) { assert(tmp == 42); } } 18 Пример #2
  • 19. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; ____________ ready = true; }   void bar() { // CPU 1 if (ready) { __________ assert(data == 42); } } 19 Пример #2
  • 20. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; STORE_______ ready = true; }   void bar() { // CPU 1 if (ready) { __________ assert(data == 42); } } 20 Пример #2
  • 21. int data; volatile bool ready = false;   void foo() { // CPU 0 ready = true; data = 42; STORE_______ ready = true; }   void bar() { // CPU 1 if (ready) { __________ assert(data == 42); } } 21 Пример #2
  • 22. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; STORE__STORE ready = true; }   void bar() { // CPU 1 if (ready) { __________ assert(data == 42); } } 22 Пример #2
  • 23. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; STORE__STORE ready = true; }   void bar() { // CPU 1 if (ready) { LOAD______ assert(data == 42); } } 23 Пример #2
  • 24. int data; volatile bool ready = false;   void foo() { // CPU 0 data = 42; STORE__STORE ready = true; }   void bar() { // CPU 1 if (ready) { LOAD__LOAD assert(data == 42); } } 24 Пример #2
  • 25. XX_YY — гарантирует, что все XX-операции до барьера будут выполнены до того, как начнут выполняться YY-операции после барьера. 25 Барьер памяти
  • 26. XX_YY — гарантирует, что все XX-операции до барьера будут выполнены до того, как начнут выполняться YY-операции после барьера. 26 Барьер памяти LoadLoad LoadStore StoreLoad StoreStore
  • 27. XX_YY — гарантирует, что все XX-операции до барьера будут выполнены до того, как начнут выполняться YY-операции после барьера. 27 Барьер памяти LoadLoad LoadStore StoreLoad StoreStore Acquire Release
  • 28. Acquire — гарантирует, что любые операции после барьера будут выполнены после того, как будут выполнены все Load-операции до барьера. 28 Acquire
  • 29. Acquire — гарантирует, что любые операции после барьера будут выполнены после того, как будут выполнены все Load-операции до барьера. 29 Acquire mov [x], 1 mov eax, [y] acquire_fence mov ebx, [w] mov ecx, [e] mov [q], 3
  • 30. Acquire — гарантирует, что любые операции после барьера будут выполнены после того, как будут выполнены все Load-операции до барьера. 30 Acquire mov [x], 1 mov ebx, [w] <— mov eax, [y] acquire_fence mov ebx, [w] mov ecx, [e] mov [q], 3
  • 31. Acquire — гарантирует, что любые операции после барьера будут выполнены после того, как будут выполнены все Load-операции до барьера. 31 Acquire mov [x], 1 mov eax, [y] acquire_fence mov [x], 1 <— mov ebx, [w] mov ecx, [e] mov [q], 3
  • 32. Release — гарантирует, что любые операции до барьера будут выполнены до того, как начнут выполняться Store-операции после барьера. 32 Release
  • 33. Release — гарантирует, что любые операции до барьера будут выполнены до того, как начнут выполняться Store-операции после барьера. 33 Release mov [x], 1 mov eax, [y] mov [z], 2 release_fence mov [w], 3 mov ebx, [k]
  • 34. Release — гарантирует, что любые операции до барьера будут выполнены до того, как начнут выполняться Store-операции после барьера. 34 Release mov [x], 1 mov eax, [y] mov [z], 2 release_fence mov [w], 3 mov [z], 2 <— mov ebx, [k]
  • 35. Release — гарантирует, что любые операции до барьера будут выполнены до того, как начнут выполняться Store-операции после барьера. 35 Release mov [x], 1 mov eax, [y] mov [z], 2 mov ebx, [k] <— release_fence mov [w], 3 mov ebx, [k]
  • 36. void function_with_lock() { ... if (can_enter) { acquire_fence(); // LoadLoad + LoadStore // all instructions // stay between // these fences release_fence(); // StoreStore + LoadStore can_enter = true; } ... } 36 Что такое acquire/release?
  • 37. bool x = true; bool y = true;   void foo() { // CPU 0 x = false; assert(y); }   void bar() { // CPU 1 y = false; assert(x); } 37 Пример #3
  • 38. bool x = true; bool y = true;   void foo() { // CPU 0 assert(y); x = false; }   void bar() { // CPU 1 y = false; assert(x); } 38 Пример #3
  • 39. bool x = true; bool y = true;   void foo() { // CPU 0 x = false; ___________ assert(y); }   void bar() { // CPU 1 y = false; ___________ assert(x); } 39 Пример #3
  • 40. bool x = true; bool y = true;   void foo() { // CPU 0 x = false; Store______ assert(y); }   void bar() { // CPU 1 y = false; Store______ assert(x); } 40 Пример #3
  • 41. bool x = true; bool y = true;   void foo() { // CPU 0 x = false; Store__Load assert(y); }   void bar() { // CPU 1 y = false; Store__Load assert(x); } 41 Пример #3
  • 42. bool x = true; bool y = true;   void foo() { // CPU 0 x = false; Store__Load assert(y); }   void bar() { // CPU 1 y = false; Store__Load assert(x); } 42 Пример #3
  • 43. Это самый “тяжелый” из барьеров StoreLoad означает полную синхронизацию всех кэшей процессоров. Ситуации, где он действительно нужен, довольно редки 43 Почему StoreLoad стоит отдельно?
  • 45. Sequential consistency Strongly-ordered Weakly-ordered (data dependency ordering) Super-weak 45 Модель памяти
  • 46. Никаких memory reordering Гарантируется, что каждый процессор видит все изменения в системе в том же порядке, что и остальные процессоры. 46 Sequential consistency
  • 47. Каждая операция имеет acquire и release семантику Все процессоры видят последовательности чтений и записей в одном порядке, но перестановки StoreLoad уже возможны ! ! Пример: x86/64 47 Strongly-ordered
  • 48. Гарантируется лишь упорядоченность для операций, зависимых по данным int* ptr = GlobalPointer; if (ptr) int value = *ptr; ! ! Примеры: ARMv7, PowerPC, Itanium 48 Weakly-ordered
  • 49. Никаких гарантий: процессор может делать, что угодно Примеры: Alpha 49 Super-weak (no guaranties)
  • 51. #include <atomic> ! ! ! T load(memory_order = memory_order_seq_cst) const; void store(T desired, memory_order = memory_order_seq_cst);   void atomic_thread_fence(memory_order order); 51 Барьеры памяти С++
  • 52. std::atomic<bool> ready; ! void foo() { // CPU 0 data = 42; ready.store(true); }   void bar() { // CPU 1 if (ready.load()) { assert(data == 42); } } 52 Барьеры памяти С++
  • 53. std::atomic<bool> ready; ! void foo() { // CPU 0 data = 42; ready.store(true, std::memory_order_release); }   void bar() { // CPU 1 if (ready.load(std::memory_order_acquire)) { assert(data == 42); } } 53 Барьеры памяти С++
  • 54. std::atomic<bool> ready;   void foo() { // CPU 0 data = 42; std::atomic_thread_fence(std::memory_order_release); ready.store(true, std::memory_order_relaxed); }   void bar() { // CPU 1 if (ready.load(true, std::memory_order_relaxed)) { std::atomic_thread_fence(std::memory_order_acquire); assert(data == 42); } } 54 Барьеры памяти С++
  • 55. std::atomic<Foo*> p; Foo payload; int value = 42;   void foo() { // CPU 0 payload.name = "Andy"; value = 314; p.store(&payload, std::memory_order_release); }   void bar() { // CPU 1 if (auto f = p.load(std::memory_order_consume)) { std::cout << f->name << std::endl; // Andy assert(value == 314); // can fire (but probably won't) } } 55 Зачем std::memory_order_consume?
  • 56. std::atomic<Foo*> p; Foo payload; int value = 42;   void foo() { // CPU 0 payload.name = "Andy"; value = 314; p.store(&payload, std::memory_order_release); }   void bar() { // CPU 1 int tmp = value; if (auto f = p.load(std::memory_order_consume)) { std::cout << f->name << std::endl; // Andy assert(tmp == 314); } } 56 Зачем std::memory_order_consume?
  • 57. Компиляторы не поддерживают это поведение (поэтому на weak- процессорах все равно скорее всего будет барьер) x86/64 и без этого прекрасно работает 57 Почему probably won’t?
  • 58. Зачем мне все это знать? Я не пишу lock-free код!
  • 59. Singleton* Singleton::Get() { if (instance.load() == nullptr) { std::lock_guard<std::mutex> guard(lock); if (instance.load() == nullptr) { instance.store(new Singleton()); } } return instance.load(); } 59 Пример #1 (almost fixed)
  • 60. Singleton* Singleton::Get() { auto tmp = instance.load(std::memory_order_relaxed); std::atomic_thread_fence(std::memory_order_acquire); if (tmp == nullptr) { std::lock_guard<std::mutex> guard(lock); tmp = instance.load(std::memory_order_relaxed); if (tmp == nullptr) { tmp = new Singleton(); std::atomic_thread_fence(std::memory_order_release); instance.store(tmp, std::memory_order_relaxed); } } return tmp; } 60 Пример #1 (fixed)
  • 61. Все это проявляется только в многопроцессорной/многоядерной среде И только в lock-free коде 61 Но как мы жили раньше?