Асинхронная системная ловушка (AST ) относится к механизму, используемому в нескольких компьютерных операционных системах, разработанных первым Digital Equipment Corporation (DEC) из Мейнард, Массачусетс.
Различные события в этих системах могут опционально сигнализироваться обратно к пользовательским процессам через механизм AST. Эти AST действуют как вызовы подпрограмм, но доставляются асинхронно, то есть независимо от контекста основного потока. Из-за этого необходимо соблюдать осторожность:
AST чаще всего встречаются в результате выполнения вызовов QIO к ядру. О завершении ввода-вывода может сигнализировать выдача AST вызывающему процессу / задаче. Об определенных ошибках времени выполнения можно также сигнализировать с помощью механизма AST. В OpenVMS специальные AST режима ядра используются как стандартный механизм для получения доступа к контексту процесса; они выполняются с максимально возможным приоритетом для каждого процесса в следующий раз, когда планировщик делает этот процесс текущим, и используются, среди прочего, для получения информации на уровне процесса (в ответ на системный вызов $ GETJPI "getjob / process information") и для выполнения удаления процесса.
Следующие операционные системы реализуют AST:
AST примерно аналогичны Unix сигнализирует. Важные отличия заключаются в следующем:
VAX / VMS V4 и позже реализовал интересную оптимизацию для проблема синхронизации между кодом уровня AST и кодом не уровня AST. Системная служба с именем $ SETAST может использоваться для отключения или включения доставки AST для текущего и всех менее привилегированных режимов доступа (термин OpenVMS для кольцевых функций безопасности ). Однако, если критическая секция , нуждающаяся в защите от AST, имеет длину всего несколько инструкций, то накладные расходы на выполнение вызовов $ SETAST могут намного перевесить время на выполнение этих инструкций.
Таким образом, только для пользовательского режима (наименее привилегированное кольцо, обычно используемое обычными пользовательскими программами), пара битовых флагов была предоставлена в заранее определенной области памяти, доступной для записи пользователем (в пространстве «P1» для каждого процесса). Значения этих двух флагов могут быть истолкованы как «не доставлять AST» и «AST отключены». Вместо обычной пары вызовов $ SETAST код пользовательского режима будет устанавливать первый флаг перед выполнением последовательности инструкций, в течение которых необходимо заблокировать AST, и сбрасывать его после выполнения последовательности. Затем (обратите внимание на порядок здесь, чтобы избежать состояний гонки ), он проверит второй флаг, чтобы увидеть, был ли он установлен в течение этого времени: если да, то AST действительно отключены, и $ SETAST должен быть призвал снова включить их. В наиболее частом случае в течение этого времени не было бы ожидающих обработки AST, поэтому вызывать $ SETAST вообще не нужно.
Код доставки AST ядра, со своей стороны, будет проверять первый флаг перед попыткой доставки AST пользовательского режима; если он был установлен, то он напрямую установил бы бит отключения AST в блоке управления процессом (тот же бит, который был бы установлен явным вызовом $ SETAST из пользовательского режима), а также установил бы второй флаг перед возвратом и оставлением AST недоставленным.
Механизм асинхронного вызова процедуры в операционных системах семейства Windows NT является аналогичным механизмом.