Валерий Петров «Модель памяти .net»
TRANSCRIPT
![Page 1: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/1.jpg)
Модель памяти .NET
Валерий Петров
![Page 2: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/2.jpg)
2
• Окончил МатМех СПбГУ• Сейчас работаю в компании Sidenis• Увлекаюсь concurrency и всякими «кишочками»• Нравится узнавать новое• Неравнодушен к качественному коду
Обо мне
![Page 3: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/3.jpg)
3
DotNext 2016 Piter
![Page 4: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/4.jpg)
4
Вопрос:
Q: Компьютер выполняет программу, которую Вы написали?
![Page 5: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/5.jpg)
5
Вопрос:
Q: Компьютер выполняет программу, которую Вы написали?A: Нет.Компилятор, JIT и CPU умеют оптимизировать!
![Page 6: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/6.jpg)
6
Почему они это делают?
![Page 7: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/7.jpg)
7
Почему они это делают?
Раньше инструкции исполнялись последовательно
http://www.slideshare.net/nithilgeorge/2010-1002-intro-to-microprocessors1
![Page 8: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/8.jpg)
8
Почему они это делают?Затем появился конвейер
http://www.slideshare.net/nithilgeorge/2010-1002-intro-to-microprocessors1
![Page 9: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/9.jpg)
9
Почему они это делают?Но инструкции всё равно исполнялись в порядке следования
http://www.slideshare.net/nithilgeorge/2010-1002-intro-to-microprocessors1
![Page 10: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/10.jpg)
10
Почему они это делают?Затем произошло массовое внедрение out-of-order execution
http://www.slideshare.net/nithilgeorge/2010-1002-intro-to-microprocessors1
![Page 11: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/11.jpg)
11
• Доступ к памяти (долго)• Инвалидация кэша (дорого)• Производительность (IPC)
Почему они это делают?
https://software.intel.com/sites/default/files/m/d/4/1/d/8/286501_286501.gif
![Page 12: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/12.jpg)
12
• Loop Read Hoisting - while (true)• Read Elimination – кэширование в регистрах (иногда даже volatile
не спасает – в .NET Framework тоже бывали баги)• Read Introduction – устранение локальной переменной (может
выстрелить в мире concurrency)• И ещё много чего, что позволяет спецификация
Что могут сделатькомпилятор/JIT/CPU?
![Page 13: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/13.jpg)
13
Loop Read Hoisting
![Page 14: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/14.jpg)
14
Read Elimination
![Page 15: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/15.jpg)
15
Read Introduction
![Page 16: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/16.jpg)
16
А как вам такая перестановка?
![Page 17: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/17.jpg)
17
• In computing, a memory model describes the interactions of threads through memory and their shared use of the data. (Wikipedia)• ECMA-335 и ECMA-334• Слабые и сильные модели памяти• Спецификации на модель памяти Microsoft CLR не
существует!
Модель памяти
![Page 18: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/18.jpg)
18
Разные архитектуры
https://en.wikipedia.org/wiki/Memory_ordering
![Page 19: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/19.jpg)
19
ECMA-335 (I.12.6.4 Optimization)
Чёрный ящикрезультат
![Page 20: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/20.jpg)
20
ECMA-335 (I.12.6.7 Volatile reads and writes)
![Page 21: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/21.jpg)
21
ECMA-335 (I.12.6.7 Volatile reads and writes)
![Page 22: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/22.jpg)
22
ECMA-334 (10.5.3 volatile fields)
•Чтение – acquire•Запись - release
![Page 23: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/23.jpg)
23
• System.Threading.Thread.VolatileRead/VolatileWrite/MemoryBarrier• System.Threading.Volatile.Read/Write• System.Threading.Interlocked• System.Threading.Monitor.Enter/Exit
ECMA-335 (I.12.6.5 Locks and threads)
![Page 24: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/24.jpg)
24
Безопасен ли этот код?
![Page 25: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/25.jpg)
25
Безопасен ли этот код?
![Page 26: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/26.jpg)
26
Безопасен ли этот код?
![Page 27: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/27.jpg)
27
Безопасен ли этот код?
![Page 28: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/28.jpg)
28
Вполне безопасно…
![Page 29: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/29.jpg)
29
•У меня и без него работает!?•На StackOverflow говорят, что не надо•Это в Java надо писать volatile (при этом не работало до 5)!?
Зачем здесь volatile?
![Page 30: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/30.jpg)
30
Простите, что?
![Page 31: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/31.jpg)
31
И тут он говорит:«The only thing that volatile keyword does is to disable compiler optimizations.It doesn't do anything with the CPU. OK?»
![Page 33: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/33.jpg)
33
• x86 и x86-64 имеют весьма строгую модель памяти• Itanium• Всё, что не оговорено стандартом, может изменяться в других
версиях .NET Framework и/или архитектурах процессоров• СЮРПРИЗ! У нас есть ARM и Xamarin (будет демо)• А также Windows 10 IoT Core на Raspberry Pi (но без демо)
Зачем здесь volatile!
![Page 34: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/34.jpg)
34
• Демо про partially constructed object на ARM
Демо.
![Page 35: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/35.jpg)
35
• Volatile – не магия, а всего лишь ключевое слово!• Volatile – не зло, а всего лишь ключевое слово!• Но оно имеет разную семантику в C/C++/C#/Java!• В C# volatile – это про Acquire-Release семантику и только!
Некоторые считают volatile какой-то магией или даже злом.
![Page 36: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/36.jpg)
36
There can only be one!Вариация на тему алгоритма Петерсона:
![Page 37: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/37.jpg)
37
Почему сломано?
![Page 38: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/38.jpg)
38
Как чинить?
![Page 39: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/39.jpg)
39
• Стараться использовать более высокоуровневые конструкции• Читать спецификации• Писать код в соответствии с ECMA CIL Memory Model
Вывод
![Page 40: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/40.jpg)
40
• http://www.albahari.com/threading/• Andrew Tanenbaum “Structured Computer Organization”• Jeffrey Richter “CLR via C#”• https://habrahabr.ru/company/intel/blog/ (и другие)
Чего почитать?
![Page 41: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/41.jpg)
41
Вопросы?
m08pvv
![Page 42: Валерий Петров «Модель памяти .NET»](https://reader036.vdocuments.pub/reader036/viewer/2022062316/58cf67891a28ab01358b604b/html5/thumbnails/42.jpg)
42
• The C# Memory Model in Theory and Practice [https://msdn.microsoft.com/en-us/magazine/jj883956.aspx]• ECMA-335 specification
[http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf]• ECMA-334 specification
[%VSINSTALLDIR%\VC#\Specifications\1033\CSharp Language Specification.docx]
Список литературы: