Агент (agent) включает набор контекстов выполнения ECMAScript, стек контекстов выполнения, текущий контекст выполнения, запись агента (Agent Record) и выполняемый поток (executing thread). За исключением исполняемого потока, компоненты агента принадлежат исключительно этому агенту.
Выполняемый поток агента выполняет задание в контекстах выполнения агента независимо от других агентов, за исключением того, что выполняющийся поток может использоваться в качестве исполняющего потока несколькими агентами, при условии, что ни один из агентов, совместно использующих поток, не имеет записи агента, у которой [[CanBlock] ] свойство верно — является true.
Например, некоторые веб-браузеры совместно используют один исполняемый поток на нескольких несвязанных вкладках окна браузера.
Пока исполняемый поток агента выполняет задания, агент является окружающим агентом (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]] были обнаружены любым агентом в кластере агентов, они не могут быть изменены.
Значения [[IsLockFree1]] и [[IsLockFree2]] не обязательно определяются оборудованием, но также могут отражать варианты реализации, которые могут меняться со временем и между реализациями ECMAScript.
Отсутствует свойство [[IsLockFree4]]: 4-байтовые атомарные операции всегда не блокируются.
На практике, если атомарная операция реализована с любым типом блокировки, операция не является свободной от блокировки. Отсутствие блокировки не означает отсутствие ожидания: не существует верхней границы того, сколько машинных шагов может потребоваться для выполнения атомарной операции без блокировки.
То, что атомарный доступ размера n является свободным от блокировки, не подразумевает ничего об (воспринимаемой) атомарности неатомарного доступа размера n, в частности, неатомарный доступ может по-прежнему выполняться как последовательность нескольких отдельных обращений к памяти. Подробнее см. ReadSharedMemory и WriteSharedMemory.
Агент — это механизм спецификации, который не обязательно должен соответствовать какому-либо конкретному артефакту реализации 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