ECMAScript | Агенты

ECMAScript | Агенты

Агент (agent) включает набор контекстов выполнения ECMAScript, стек контекстов выполнения, текущий контекст выполнения, запись агента (Agent Record) и выполняемый поток (executing thread). За исключением исполняемого потока, компоненты агента принадлежат исключительно этому агенту.

Выполняемый поток агента выполняет задание в контекстах выполнения агента независимо от других агентов, за исключением того, что выполняющийся поток может использоваться в качестве исполняющего потока несколькими агентами, при условии, что ни один из агентов, совместно использующих поток, не имеет записи агента, у которой [[CanBlock] ] свойство верно — является true.

Примечание 1

Например, некоторые веб-браузеры совместно используют один исполняемый поток на нескольких несвязанных вкладках окна браузера.

 

Пока исполняемый поток агента выполняет задания, агент является окружающим агентом (surrounding agent) для кода в этих заданиях. Код использует окружающий агент для доступа к объектам выполнения уровня спецификации, содержащимся внутри агента: текущему контексту выполнения, стеку контекста выполнения и полям записи агента.

Имя поля Значение Смысл
[[LittleEndian]] Boolean Значение по умолчанию, вычисляемое для параметра isLittleEndian, когда оно требуется алгоритмами GetValueFromBuffer и SetValueInBuffer. Выбор определяется реализацией и должен быть альтернативой, наиболее эффективной для реализации. После того, как значение было обнаружено, оно не может измениться.
[[CanBlock]] Boolean Определяет, может ли агент блокировать или нет.
[[Signifier]] Любое глобально-уникальное значение Однозначно идентифицирует агент в его кластере агентов.
[[IsLockFree1]] Boolean Значение true, если атомарные операции с однобайтовыми значениями не блокируются, в противном случае — false.
[[IsLockFree2]] Boolean Значение true, если атомарные операции с двухбайтовыми значениями не блокируются, в противном случае — значение false.
[[IsLockFree8]] Boolean Значение true, если атомарные операции с восьмибайтовыми значениями не блокируются, в противном случае — false.
[[CandidateExecution]] Запись Кандидата выполнения Смотри Модель памяти.
[[KeptAlive]] Список объектов Первоначально новый пустой список, представляющий список объектов, которые должны оставаться активными до конца текущего задания.

Таблица 29: Поля записи агента

После того, как значения [[Signifier]], [[IsLockFree1]] и [[IsLockFree2]] были обнаружены любым агентом в кластере агентов, они не могут быть изменены.

 

Примечание 2

Значения [[IsLockFree1]] и [[IsLockFree2]] не обязательно определяются оборудованием, но также могут отражать варианты реализации, которые могут меняться со временем и между реализациями ECMAScript.

Отсутствует свойство [[IsLockFree4]]: 4-байтовые атомарные операции всегда не блокируются.

На практике, если атомарная операция реализована с любым типом блокировки, операция не является свободной от блокировки. Отсутствие блокировки не означает отсутствие ожидания: не существует верхней границы того, сколько машинных шагов может потребоваться для выполнения атомарной операции без блокировки.

То, что атомарный доступ размера n является свободным от блокировки, не подразумевает ничего об (воспринимаемой) атомарности неатомарного доступа размера n, в частности, неатомарный доступ может по-прежнему выполняться как последовательность нескольких отдельных обращений к памяти. Подробнее см. ReadSharedMemory и WriteSharedMemory.

 

Примечание 3

Агент — это механизм спецификации, который не обязательно должен соответствовать какому-либо конкретному артефакту реализации ECMAScript.

 

AgentSignifier ( )

Абстрактная операция AgentSignifier (Агентская служба) не принимает аргументов. При вызове он выполняет следующие шаги:

1. Пусть AR будет Записью Агента окружающего агента.
2. Вернуть AR.[[Signifier]].

 

AgentCanSuspend ( )

Абстрактная операция AgentCanSuspend (Агент может приостановить работу) не принимает аргументов. При вызове он выполняет следующие шаги:

1. Пусть AR будет Записью Агента окружающего агента.
2. Вернуть AR.[[CanBlock]].
Примечание

В некоторых средах приостановка работы данного агента может быть нецелесообразной. Например, в среде веб-браузера может быть разумным запретить приостановку основного потока обработки событий документа, в то же время позволяя приостановить потоки обработки событий рабочих.

 

Информационные ссылки

Предыдущая тема — ECMAScript | InitializeHostDefinedRealm ( )

Стандарт ECMAScript — Раздел «9.6 Agents» — https://tc39.es/ecma262/#sec-agents