1.73M
Category: programmingprogramming

Организация процесса проектирования программного обеспечения

1.

Организация процесса проектирования
Программного обеспечения
Лекция: Работа интерпретаторов
ст. преп. кафедры ВТ
Васильев В. С.

2.

1.1 Понятие виртуализации
Реализация на существующем программном и аппаратном обеспечении
стандартизированного, внешне параметризуемого контекста
исполнения, предоставляющее исполняемому
приложению ожидаемое окружение и
скрывающее сложности управления
ресурсами, таким образом позволяя
приложению сфокусироваться на
решении задач характерных для
предметной области
моделируемого окружения.
2

3.

1.2 Развитие средств виртуализации
1960-1970-е: супервизор Atlas (1960-е)- разделение ресурсов компьютера
между несколькими пользовательскими программами.
Программная среда, исполняющая некоторый код;
●Полностью изолированный программный контейнер, способный выполнять собс
●Программа, запускаемая в вашей ОС, эмулирующая работу реальной машины.
Режим поддержки виртуализации использует супервизор (прослойка между гост
3

4.

1.3 Виртуальная машина
как универсальный менеджер ресурсов
В контекст выполнения программы входит:
●Память.
●Процессорное время (как мы его потребляем?).
●Сетевые соединения.
●Графические объекты.
●…
Есть ли смысл управлять всем контекстом исполнения?
Программы создаются в ожидании определённого контекста.
Есть ли контекст тут? Если есть — то где?
4

5.

1.4 Цели и возможности виртуализации
Повышение безопасности:
●Изоляция гостевых ОС.
●Не наносится ущерб виртуальному оборудованию.
●Улучшение системы восстановления.
●Повышение уровня доступности ресурсов.
●Упрощает разработку (например, для массивно параллельных систем).
●Распределение ресурсов.
●Снижение стоимости.
●Возможность точно повторить среду выполнения программы.
●...
5

6.

2.1 VM как Абстракция
Имеет минимальный интерфейс.
●Широко используется.
●Имеет множество различных реализаций.
●Пользователь не думает о существовании абстракции.
1) VM — предоставляет абстракцию;
2) VM работает с памятью и в JVM реализуется что-то похожее на
new/delete
6

7.

2.2 Пример работы с памятью (вспоминаем)
int* ptr = (int*) malloc(4);
*ptr = 42;
free(ptr);
7

8.

2.2 Итоги по работе jemalloc
по-разному работает с маленькими и большими объектами;
●пул готовых объектов разного размера (кэш?);
●локальная арена для каждого потока;
●на арене находятся большие объекты (extent), которые
разделены на классы по размеру;
●extent можно разделить на много маленьких объектов,
которые вместе образуют slab - набор буферов + маска;
●slab-ы разного размера хранятся в очереди с приоритетами;
●остальную работу выполняет ОС (которая тоже виртуальная
машина) и процессор;
●процессор и ОС реализуют виртуальное адресное
пространство, а также кэш страниц.
8

9.

3 Опрос
1.Как делить ресурсы? - заранее/по запросу, поровну/по потребностям?
2.Как делить неделимые ресурсы? (процессорное время)
3.Как вернуть лишние ресурсы?
4.Что менеджер ресурсов должен знать о потребителях? Почему много
знать плохо?
5.Где у машины Тьюринга ресурсы? Контекст?
6.Есть ли программы для которых не нужен контекст?
7.Кто и как распределяет переменные по регистрам процессора? (в
разных языках);
<= под контекстом имеется ввиду набор ресурсов и правил
=> ВМ — контекст исполнения, является системным ПО, которое в
отличии от обычных программ «ничего не делает» кроме создания
контекста.
9

10.

3 Опрос. Наводки
Программы живут неожиданно долго;
●Появляется новое аппаратное обеспечение;
●Теряются знания.
●Эффективное управление ресурсами — сложно.
●Инкапсуляция сложности.
●Средство реализации Чистой архитектуры.
10

11.

4 Особенности JVM. Состав
Загрузчик классов:
●Получение данных класса
●Верификация класса
Система исполнения байткода (существуют разные):
• Интерпретатор.
• Динамический профилировщик.
• Компилятор времени исполнения.
Система управления памятью.
11

12.

4 Особенности JVM. Спецификация
Объектная модель: классы, объекты, методы
Формат исполняемого файла
Набор инструкций (байткод)
Типы данных
Абстрактная исполняющая машина
●Инициализация
●Поток нормального исполнения
●Исключительные ситуации
●Реализация синхронизации потоков
12

13.

4 Особенности JVM. Состав
Стековая машина
●(как и, например,
●i8087).
Управление памятью — это не только GC:
●Выделение пула памяти.
●Управление объектами в пуле.
●Быстрое выделение (трудно реализовать: работает в многопоточной
среде с глобальной кучей).
●Анализ доступности и освобождение. Существуют различные
алгоритмы, подсчет ссылок в JVM не работает. Используется техника
mark&sweep (на графе доступности). Не обязательно освобождает все.
13

14.

5 Инструменты исследования JVM
VisualVM входит в состав jdk;
Следит за всеми запущенными Java-приложениями;
Вкладка Overview отображает информацию о среде запуска;
14

15.

5 Инструменты исследования JVM
Вкладка Monitor отображает графики:
●использования процессора;
●использования памяти (общий объем памяти, выделенной
операционной системой и объем распределенной в данный момент
памяти);
●работы потоков — показывает количество работающих потоков (живых
и демонов).
Содержит кнопки:
●Perform GC — влияние на
●поколения объектов;
●Head Dump;
15

16.

5 Инструменты исследования JVM
Дамп памяти, помимо общего объема
выделенной памяти, отражает, например:
общее количество объектов, классов;
количество корней в дереве
достижимости (GC Roots);
количество объектов с
финализаторами;
список самых больших объектов;
объем памяти, занятый объектами
каждого класса
16

17.

5 Инструменты исследования JVM
Вкладка Sampler позволяет отслеживать:
время выполнения каждой функции (CPU);
количество и объем объектов каждого типа (Deltas), информацию о:
●всей выделенной памяти;
●изменениях, произошедших с момента начала анализа.
17

18.

5 Инструменты исследования JVM
Вкладка Profiler позволяет профилировать CPU или память, при этом к
вашему приложению прикрепляется профайлер, который начинает
отслеживать время затраченное на выполнение каждой функции или
информацию об объектах
18

19.

5 Инструменты исследования JVM
Есть ряд плагинов, которые улучшают возможности VisualVM, например
VisualGC визуализирует состояние памяти:
19

20.

6 Список литературы
1. Н. Иготти Виртуализация и виртуальные машины. URL:
https://www.youtube.com/playlist?list=PL-_cKNuVAYAVlONsYjydusfzF5nd5ihz1
2. Ф. Короткий Память – идеальная абстракция. URL:
https://www.youtube.com/watch?v=i87W3KyZgPw
3. A. Паньгин Java Runtime: повседневные обязанности виртуальной
машины Java. URL: https://www.lektorium.tv/lecture/14536]
4. А. Шипилёв (The Art of) (Java) Performance Benchmarking II. URL:
https://www.lektorium.tv/lecture/14523
5. A. Макаров Исследование возможностей и ограничений JVM по
оптимизации памяти. URL: https://www.lektorium.tv/lecture/14936
6. A. Макаров Исследование возможностей и ограничений JVM по
оптимизации памяти: история одного проекта. URL:
https://www.lektorium.tv/lecture/14535
20

21.

7.1 JVM GC. Виды аллокаций (повтор)
void func3() { /* мы здесь */ }
void func2() { func3(); }
void func1() { func2(); }
void func0() { func1(); }
Как передаются аргументы?
(регистры/стек, в каком порядке?)
Кто очищает стек от аргументов? (caller, calle)
Как возвращается результат? (регистры/стек)
Какие регистры необходимо сохранить в стек?
21

22.

7.1 JVM GC. Виды аллокаций (повтор)
22

23.

7.1 JVM GC. Виды аллокаций (повтор)
Где в этом случае будет создана переменная sum?
23

24.

7.2 JVM GC. Раскрутка стека
Проход по содержимому стека
●Перебор стековых кадров в порядке, обратном вызову функций
●Логика над полученными данными
Сложности:
Полезно узнать:
●Разный формат стековых кадров для разных функций:
●чем SP отличается от FP.
●Различное количество аргументов, передаваемых по-разному
●Что такое и зачем виртуальные регистры
●Различное число локальных переменных
●Разные регистры сохраняются в стек
●Зависимость от архитектуры (например, в ARM-32 есть Link Register хранящий адрес возвр
●Оптимизации компилятора
24

25.

7.3 JVM GC. С чем работает GC?
Фазы жизни объекта:
●Участок в хипе.
●Память выделенная аллокатором
●(заполнена нулями).
●Инициализированный объект.
●Недостижимый объект.
●Финализируемый объект.
●Фантомный объект.
●Участок в хипе.
Стандарт регламентирует:
●Память выделяется под объект или базовый тип д
●Инициализируется значением по умолчанию, зате
●Может освобождаться при недоступности объекта
●Не допускается алиасинг;
●equals() и hashCode();
●При недостатке памяти кидается исключение;
●finalize().
(для всех объектов вычисляется хэш)
Типы ссылок:
●Сильная (обычная ссылка на объект (foo.bar).
Корневые объекты:
●Мягкая (soft) java.lang.ref.SoftReference.
●Объекты на стеке.
●Слабая (weak) java.lang.ref.WeakReference
●Глобальные переменные (статические)
●Фантомная (phantom) java.lang.ref.PhantomRef
●Структуры данных ВМ.
25

26.

7.4 JVM GC. Особенности работы
Предъявляются требования по:
●Объему данных.
●Производительности (скорость создания мусора).
●Гарантии время отклика.
●Ожидаемому сценарию нагрузки.
Counter prime = new Counter();
SoftReference soft = new SoftReference(prime) ;
prime = null;
26

27.

7.5 JVM GC. Копирующий сборщик
Память делится на две части “from-space” “to-space”.
Принцип работы такой:
1) Объекты аллоцируются в “from-space”
2) “from-space” заполняется, нужно собрать мусор
3) Приложение приостанавливается
4) Запускается сборщик мусора. Находятся живые объекты в “from-space” и копируются
5) Когда все объекты скопированы “from-space” полностью очищается
6) “to-space” и “from-space” меняются местами
Главный полюс такого подхода в том, что объекты плотно забивают память. Минусы подх
Приложение должно остановится пока не пройдет полный цикл сборки мусора
В худшем случае from-space и to-space должны быть одинакового размера. Это случай
27

28.

7.3 JVM GC. Mark&Sweep
Алгоритм можно описать так:
1) Объекты аллоцируются в памяти
2) Нужно запустить GC
3) Приложение приостанавливается
4) Сборщик проходится по дереву объектов, помечая живые объекты
5) Сборщик проходится по всей памяти, находя все не отмеченные куски памяти, сохра
6) Когда новые объекты начинают аллоцироватся они аллоцируются в память доступну
Минусы:
Приложение не работает пока происходит сборка мусора
Время работы зависит от размеров памяти и количества объектов
Если не использовать “compacting” память будет использоваться не эффективно
28

29.

7.4 JVM GC. Примеры
29

30.

7.5 Что учитывает реальный GC?
Нужно учитывать, что:
●Объекты часто умирают молодыми (гипотеза поколений) => объекты делятся на категории
●Потоки чаще всего использую данные, которые сами создают (гипотеза потоковой локально
●Существует мало связей между объектами, которые были созданы в прошлом и только что
●Немногие объекты:
●хранятся в хэш-таблицах (Как вычислить хэш быстро? Что может выполнять роль хэша в С
●используются для синхронизации (стандарт позволяет использовать любой объект для син
●Ожидаемый сценарий нагрузки.
●...
Что будет если нарушатся гипотезы?
Как на коллектор влияют разные виды ссылок?
Что случится если в Java появится алиасинг?
30

31.

7.5* Про синхронизацию
private Object obj = new Object();
public void doSomething() {
//...какая-то логика, доступная для всех потоков
synchronized (obj) {
//логика, которая одновременно доступна только для одного потока
}
}
«Синхронизация работает если использовать в качестве объекта синхронизации что угодно
«Объекты типа Integer иммутабельны, операция инкремента count++ не меняет состояние о
Как возможность синхронизации по объекту влияет на VM? А
31

32.

7.6 Как работает HotSpot VM?
Реализуется 4 сборщика, в каждом из них свои алгоритмы:
Serial GC;
Parallel GC (часть работы выполняет параллельно);
CMS GC;
G1 GC.
Serial GC делит память по количеству прошедших сборок на:
●Young generation — использует алгоритм minor GC;
●Old generation — использует алгоритм major GC (mark&sweep + compact — описан выше)
●Permanent generation.
Финализируемые объекты и большие объекты могут сразу попадать в Old generation.
32

33.

2.5 Какой подход используется в HotSpot VM?
minor GC
Как выявить ссылки на объекты c old generation на объекты в young generation не сканируя o
Память в old generation разбивается на карты (cards).
Структура card table:
1)Массив, каждая ячейка соответствует куску памяти (карте) в “old generation”.
2)Когда в каком то поле объекта обновляется ссылка, то в “card table” нужная карта помечае
3) для выявления ссылок “old-to-new” сканируется не весь “old-generation”, а только объекты
33

34.

2.5 Какой подход используется в HotSpot VM?
minor GC
“Young generation” делится на:
●Eden. Кусок памяти, где объекты алоцируются. После сборки мусора “Eden” пустой, мусор
●Survivor space. Тут находятся объекты, которые выжили при предыдущей сборке мусора, н
Алгоритм (похож на «Копирующий сборщик») :
1) Начало сборки мусора, приложение приостанавливается.
2) Живые объекты из “Eden” копируются в “to space”.
3) Живые объекты из “from space” копируются в “to space” или в “old generation”, если они
4) “Eden” и “from space” очищаются, так как в них остался только мусор.
5) “to space” и “from space” меняются местами
6) Приложение продолжает работу.
34

35.

2.5 Какой подход используется в HotSpot VM?
minor GC
До сборки:
35
После сборки:

36.

2.5 Какой подход используется в HotSpot VM?
Garbage First (G1) — самый современный.
Параллельный копирующий коллектор с мягкими гарантиями на паузы:
●Куча поделена на регионы;
●У каждого региона своя оценка стоимости сборки и потенциального количества мусора;
●Каждый регион знает все внешние ссылки на себя — можно собирать произвольный набор
●Работа поделена на части предсказуемого размера;
●Собирает память в регионах где много мусора;
●Необходимо использовать достаточно дорогие барьеры записи.
36

37.

Вопросы
1)Описать алгоритм сборки мусора в С++;
2)Можно ли для С++ написать GC как в Java? Куда его поместить?
3)Какие проблемы создает постоянное перемещение объекта GC, как с ними бороться?
4)* Кто (что) и на основании чего распределяет данные по регистрам процессора?
37

38.

Дополнительная литература
1. Управление вычислительными ресурсами:
1) Лекция 2.1 (50 мин.): https://www.lektorium.tv/lecture/12960.
2) Лекция 2.2 (60 мин.): https://www.lektorium.tv/lecture/12961.
2. Обратная совместимость и выбор стратегии реализации оной:
1) Лекция 3.1 (60 минут): https://www.lektorium.tv/lecture/12962
2) Лекция 3.2 (20 минут): https://www.lektorium.tv/lecture/12963
3) Лекция 4.2 (40 минут): https://www.lektorium.tv/lecture/13070
3. GC и большой heap: друзья или враги? : https://habr.com/post/148322/
4. Серия статей «Дюк, вынеси мусор» - https://habr.com/en/post/269863/ (описаны
5. Раскручиваем стек. Иван Пономарев. CoreHard Spring 2019 (50 мин.): https://ww
38

39.

Дополнительная литература
6. https://habr.com/en/company/getintent/blog/302910/ - Сравнение двух GC. Конф
7.Основные принципы настройки Garbage Collection с нуля: https://habr.com/en/po
1. https://habr.com/en/company/luxoft/blog/174231/ - use-case по оптимизации JVM
2.https://coderlessons.com/tutorials/java-tekhnologii/izuchite-virtualnuiu-mashinu-jav
39

40.

План лекции
JIT-компиляция:
1 Ahead-Of-Time и Just-In-Time компиляторы.
2 Профилировка и оптимизация, компиляция.
3 Когда компилировать/декомпилировать?
4 Клиентский компилятор.
40

41.

3.1 Ahead-Of-Time и Just-In-Time компиляторы
Компилятор транслирует байткод в машинный код. Либо во время исполнения, либо заранее
AOT:
●Требует больше ресурсов.
●Новый стандарт на промежуточное представление (.dll, .o).
●Трудно деоптимизировать.
JIT:
●Имеет больше информации для оптимизации (аппаратное обеспечение, типичное поведени
Комбинированные подходы (сохранение исходного байткода, подсказки JIT-у).
Что стоит компилировать?...
41

42.

3.2 Профилировка и оптимизация, компиляция
Цикл разработки?
Что выполняется:
●Обнаружение часто используемого кода.
●Оптимизация common path (типичный путь исполнения).
●Замена дорогих операций (каких?).
●Деоптимизация и реоптимизация — останавливает код, получает его состояние, заново по
С чем взаимодействует JIT-компилятор?
●Коллектором (реаллоцирует ссылки на перемещаемые объекты; занимает ли скомпилиров
●Интерпретатором если есть (может и не быть, обойтись можно одним JIT) — кому обработа
●Менеджер исключений.
●Отладчик — как отлаживать оптимизированный код?
●Менеджером исключений ОС (может быть установлен обработчик на исключение об испол
42

43.

3.3 Когда компилировать/декомпилировать?
Процессор (Дешифратор команды) - JIT?
●команда = набор инструкций {машинных кодов}.
●на системах с разными микроархитектурами можно реализовать одинаковую систему кома
Компиляция может выполняться при:
●Вызове метода.
●Возврате назад (On State Replacement) — компиляция цикла.
Декомпиляция:
●Нарушено представление компилятора о common path.
43

44.

3.4 Клиентский компилятор
(также существует серверный и комбинированный)
Простые оптимизации учитывая только количество исполнений (без частотного анализа).
●Использует CFG и SSA для линейных участков.
●Инлайнит простые функции.
●Регистровый аллокатор — linear scan.
●Кодогенератор на основе шаблонов (примитивов).
●Четырехфазный:
●Байткод → HIR (высокоуровневый IR с семантикой языка).
●HIR → LIR (низкоуровневый, привязан к машинному коду, RISC-подобный, с виртуальными
●Регистровый аллокатор (spilling и filling, т. к. реальных регистров не хватает).
●LIR с реальными регистрами → машинный код.
●Хранит информацию для деоптимизации вместе с кодом метода.
44

45.

Дополнительная литература
1. Linear Scan Register Allocation : http://www.cs.ucla.edu/~palsberg/course/cs132/li
45
English     Русский Rules