비동기식 시스템 트랩

Asynchronous System Trap

AST(Ansynchronous System Trap)는 메사추세츠주 메이너드의 구 DEC(Digital Equipment Corporation)가 설계한 여러 컴퓨터 운영체제에서 사용되는 메커니즘을 말한다.

메커니즘

이러한 시스템 내의 다양한 이벤트는 AST 메커니즘을 통해 사용자 프로세스에 선택적으로 다시 신호로 전달될 수 있다.이러한 AST는 서브루틴 호출과 같이 작동하지만, 비동기적으로, 즉 메인 스레드의 컨텍스트에 관계 없이 전달된다.이 때문에 다음과 같은 주의를 기울여야 한다.

  • 메인 스레드와 AST 사이에 공유되는 모든 코드가 재입력되도록 설계되어야 한다.
  • 공유되는 모든 데이터는 AST에 의해 언제든지 수정될 경우 부패로부터 안전해야 한다.그렇지 않으면 중요한 섹션 동안 AST를 차단하여 데이터를 보호해야 한다.

AST는 Q 발행의 결과로 가장 흔하게 발생한다.IO커널에 호출됨I/O 완료는 AST가 호출 프로세스/태스크에 발급되면 알 수 있다.AST 메커니즘을 사용하여 특정 런타임 오류를 나타낼 수도 있다.OpenVMS 내에서 특수 커널 모드 AST는 프로세스 컨텍스트에 비교적 편리하게 접근할 수 있는 표준 메커니즘으로 사용된다(프로세스를 필요에 따라 물리적 메모리에 페이징하는 것을 포함).이러한 유형의 AST는 다음 번에 스케줄러가 해당 프로세스를 최신 상태로 만들 때 가능한 가장 높은 프로세스별 우선 순위로 실행되며, 프로세스 수준 정보를 검색하고($GETJPI "getjob/process information" 시스템 호출에 응답함) 프로세스 삭제 수행을 위해 여러 가지 용도로 사용된다.

다음 운영 체제는 AST를 구현한다.

AST는 대략 유닉스 신호와 유사하다.중요한 차이점은 다음과 같다.

  • AST에 할당된 "신호 코드"는 없다: 처리기를 신호 코드에 할당하고 코드를 올리는 대신 AST는 주소에 의해 직접 지정된다.이를 통해 모든 수의 AST가 한 번에 보류될 수 있다(쿼터 처리의 대상이 됨).
  • AST는 진행 중인 시스템 호출을 중단하지 않는다.실제로, $HIBER 시스템 호출로 스스로를 "하이버나이트" 상태로 만들거나 $WITFR을 호출하여 이벤트 플래그를 기다리는 과정이 가능하며, 여기서 $WAITFR은 AST가 전달되기만을 기다릴 뿐이다.AST가 전달되면(IO 완료, 타이머 또는 기타 이벤트에 의해 트리거됨), AST를 실행하기 위한 대기에서 프로세스가 일시적으로 해제된다.AST 절차가 완료되면 프로세스를 최대 절전 모드 또는 이벤트 플래그 대기 상태로 전환한 호출이 다시 이루어지며, 본질적으로 대기 이유는 재평가된다.(프로세스 삭제와는 별도로) 이 루프에서 벗어나는 유일한 방법은 $WAKE 또는 $SETEF 시스템 호출을 실행하여 대기 시간을 만족시키는 것이다.이는 AST 내에서 $WAKE 또는 $SETEF를 호출하거나 (글로벌 이벤트 플래그를 사용하는 경우) $SETEF를 다른 프로세스에서 호출하여 프로세스 자체에서 수행할 수 있다.

VAX/VMS V4 이상에서는 AST 레벨과 비AST 레벨 코드 간의 동기화 문제에 대해 나중에 흥미로운 최적화를 구현했다.$SETAST라는 이름의 시스템 서비스를 사용하여 현재 및 모든 권한이 적은 액세스 모드( 기반 보안 기능에 대한 OpenVMS 용어)에 대한 AST의 제공을 비활성화하거나 활성화할 수 있다.그러나 AST로부터 보호가 필요한 중요 섹션이 몇 가지 지침만 길다면, $SETAST 호출에 따른 오버헤드는 해당 지침 실행 시간을 훨씬 초과할 수 있다.

따라서 사용자 모드(일반적으로 일반 사용자 프로그램에서 사용되는 가장 낮은 권한의 링)에 대해서만 미리 정의된 사용자가 쓰기 가능한 메모리 위치(프로세스당 "P1" 공간)에 비트 플래그 쌍이 제공되었다.이 두 깃발의 의미는 "AST를 전달하지 않음"과 "AST가 비활성화됨"으로 해석될 수 있다.일반적인 쌍의 $SETAST 호출 대신, 사용자 모드 코드는 AST를 차단해야 하는 명령 순서를 실행하기 전에 첫 번째 플래그를 설정하고 시퀀스 후에 지운다.그런 다음(여기 순서에 유의, 경주 조건을 피하기 위해) 두 번째 플래그가 이 시간 동안 설정되었는지 여부를 확인할 것이다. 그렇다면 AST가 정말로 비활성화되었으며 $SETAST를 호출하여 다시 활성화해야 한다.가장 일반적인 경우 이 기간 동안 보류 중인 AST가 없으므로 $SETAST를 호출할 필요가 전혀 없을 것이다.

커널 AST 전달 코드는 사용자 모드 AST를 전달하기 전에 첫 번째 플래그를 확인하고, 설정된 경우 ASTs-disabled 비트를 프로세스 제어 블록(사용자 모드에서 명시적인 $SETAST 호출로 설정되는 비트)에서 직접 설정하고, 두 번째 플래그를 설정한 후 AST를 반환하고 종료한다.무배송의

윈도 NT 운영체제 계열의 비동기 프로시저 호출 메커니즘은 유사한 메커니즘이다.

참조

추가 읽기

  • OpenVMS 알파 내부 및 데이터 구조 : 스케줄링 및 프로세스 제어 버전 7.0, Ruth Goldenberg, Saro Saravanan, Denise Dumas, ISBN1-55558-156-0