- Заметки
- Основы Dart 2.x (DartVM, Isolates, Streams)
За последние 30 дней: 0 просмотров, 0 посетителей.
Основы Dart 2.x (DartVM, Isolates, Streams)
Dart virtual machine
- Прежде чем говорить о Dart_VM и остальных вещах в данной теме, необходимо понимать что такое процесс операционной системы и как это всё работает, ибо без этих знаний будет сложно разобраться о чем идет речь далее ...
Процесс - это (если коротко) выполняющаяся программа либо ваша программа во время выполнения. Программа - это статический обьект представляющий собой файл (или множество файлов) кодом и данными. Для того что бы данную программу можно было запустить (выполнить), ОС должна для данной программы (набор файлов) создать определенное окружение (или среду выполнения), включающую возможность доступа к различным системным ресурсам (память, устройства ввода\вывода и прочее) - такое окружение или среда выполнения получило название Процесс.
Поток - является последовательностью команд, обрабатываемых процессором. В рамках одного процесса могут находиться один или несколько потоков. Все потоки одного процесса разделяют между собой ресурсы процесса выделенные операционной системой. Они (потоки) находятся в общем адресном пространстве и имеют доступ к одним и тем же данным. Например, если один поток открывает файл для чтения, другие потоки могут читать файл.
VM (понятие виртуальной машины) - это программа, которая действует как компьютер. Она имитирует процессор с несколькими другими аппаратными компонентами, позволяя выполнять арифметику, считывать из памяти и записывать туда, а также взаимодействовать с устройствами ввода-вывода, словно настоящий физический компьютер.
Сколько аппаратного обеспечения имитирует конкретная VM — зависит от её предназначения. Некоторые VM воспроизводят поведение одного конкретного компьютера. создаёт одну стандартную архитектуру CPU, которая симулируется на различных аппаратных устройствах. В первую очередь это делается для облегчения разработки ПО. Представьте, что вы хотите создать программу, работающую на нескольких компьютерных архитектурах. Виртуальная машина даёт стандартную платформу, которая обеспечивает переносимость. Не нужно переписывать программу для разных платформ или ОС. Достаточно сделать только VM которая будет интерпретировать вашу программу для каждой платформы. После этого любую программу можно написать лишь единожды.
Dart_VM - состоит из набора компонентов для выполнения Dart кода. в частности, она включает в себя следующие компоненты:
- Среда исполнения
- "Сборщик мусора"
- Основные библиотеки и нативные методы
- Система отладка
- Профилировщик
- Симулятор ARM архитектуры
- Возможность использовать горячую перезагрузку (с применением JIT-компиляции) и компиляцию AOT (процесс компиляции выполняется полностью перед выполнением программы).
Разработчики Dart VM утверждают что VM которая используется для Dart это скорее среда выполнения (аналогию можно провести с CLR в .NET), нежели виртуальная машина, так как её работа и функциональность далеко за гранью обычно виртуальной машины.
Важно понимать:
Перед запуском вашей Dart программы в ОС, изначально запускается виртуальная машина Dart (или среда выполнения) и внутри её выполняется ваша программа.
Isotales (изоляты)
- Любой код Dart внутри виртуальной машины выполняется в некотором изоляте, который можно описать как некий (собственный) процесс Dart VM, так же со своей собственной памятью (кучей) и, как правило, со своим собственным потоком управления. Изолятов может быть большое количество, выполняющих ваш код одновременно, но общаться они могут только через сообщения.
Отношения между потоками ОС и изолятами немного размыты, гарантируется только следующее:
- Поток ОС может исполнять (принимать) только один изолят за один раз. Он (поток ОС) должен оставить текущий изолят, если он хочет выполнить другой изолят;
Однако тот же поток ОС может сначала вывести один изолят, выполнить код, затем оставить этот изолят и вывести другой изолят для выполнения.
Использовать изоляты - это единственный способ работы с многопоточностью в Dart.
Приведем пример:
Изоляты могут общаться между собой с помощью сообщений, каждый изолят предоставляет порт, который используется чтобы передать сообщение, этот порт называется SendPort.
Что бы ознакомится с Изолятами более подробно рекомендую обратится к документации:
DOC-DART_ISOLATES
Streams (потоки)
- В прошлой статье мы рассматривали Futures - как объект "результата", который возвращается, когда Dart завершил асинхронную работу. Сегодня поговрим про потоки в Dart, используя класс Streams для асинхронной работы.
Stream в Dart - это последовательность асинхронных событий. Stream сообщает вам, что есть событие и когда оно будет готово.
Существует два типа потоков:
- Потоки-подписки (single subscription)
- Широковещательные (broadcast).
Потоки-подписки - это тип потока который содержит последовательность событий, которые являются частями большего целого. События должны быть доставлены в правильном порядке без пропуска любого из них. Это тип потока, который вы получаете при чтении файла или получении веб-запроса. Такой поток можно слушать только один раз. Прослушивание позже, может означать пропуск начальных событий, и тогда остальная часть потока не имеет смысла. Когда вы начнете слушать, данные будут извлечены и предоставлены кусками.
Широковещательные потоки - тип потока предназначен для отдельных сообщений, которые могут обрабатываться по одному. Вы можете начать слушать такой поток в любое время, и вы получите события, произошедшие во время прослушивания. Поток могут слушать несколько слушателей. Вы можете снова начать слушать события потока после отмены предыдущей подписки.
Немного примеров:
- передаваемый тип (в нашем случае String) при создании StreamController определяет тип объектов, которые мы можем отправлять в поток. Это может быть абсолютно любой тип!
Прослушиваем поток:
- Прослушиваем используя метод .listen(), необходимо передать в метод .listen() некую функцию, чтобы как-то манипулировать с пришедшими данными. Функция должна принимать параметр типа, указанного при создании StreamController, в данном случае это String.
Вызов его метода .cancel() завершает подписку, освобождая ресурсы, и предупреждая вызов вашей прослушивающей функции после того, как это стало ненужным.
Пример:
Знания о Streams очень необходимы при работе с Rx, сокращенно от Reactive Extensions (реактивные расширения), — это потоки "на стероидах". Это концепция, очень похожая на Streams, которая была изобретена для .Net framework командой Microsoft. Так как .Net уже имел тип Stream, который используется для файлового ввода-вывода, они назвали Rx-потоки Observables и создали множество функций для манипулирования данными, проходящими через них. Dart имеет Streams, встроенные в его языковую спецификацию, которые уже предлагают большую часть этой функциональности, но не все. Вот почему был разработан пакет RxDart; он основан на Dart Streams, но расширяет их функциональность.
Подборка заметок