본문 바로가기
카테고리 없음

에지 트리거(Edge Trigger, ET)와 레벨 트리거(Level Trigger, LT)의 차이점

by 왕 달팽이 2019. 4. 18.
반응형

시스템에서 특정 이벤트를 감지하기 위해 트리거(Trigger)라는 개념을 사용한다. 트리거는 기본적으로 전기전자에서 사용하는 개념이지만 시스템 프로그래밍에서도 비슷한 개념을 사용한다. (논리회로 수업 시간에 들었던 것 같은데 정확히 기억나지 않는다)

 

트리거는 크게 레벨 트리거(Level Trigger)’와 ‘에지 트리거(Edge Trigger)’로 나뉠 수 있다.

 

0과 1의 상태 변화

 

예를 들기 위해 0과 1을 가질 수 있는 상태변수를 생각해보자. 이 상태변수는 조건에 따라 0이 되기도 하고 1이되기도 한다. 이를 그래프로 그려보면 위와 같을 것이다.

 

레벨 트리거

레벨 트리거는 상태 변수의 현재 상황을 기준으로 동작한다. 상태 1인 경우를 체크하기 위한 레벨 트리거는 체크 당시 상태가 1이면 이벤트를 발생시킨다. 반면 상태 0인 경우에는 이벤트를 발생시키지 않는다.

 

 

위 그림에서 빨간색 구간이 레벨 트리거가 이벤트를 발생시키는 구간이다. 1인 구간에서는 레벨 트리거를 몇 번이고 수행해도 이벤트가 발생한다.

 

에지 트리거

 

에지 트리거는 상태 변수가 변하는 순간을 기준으로 동작한다. 상태가 0에서 1로 변하는 순간(상승에지, Rising Edge)을 검출하거나 1에서 0으로 변하는 순간(하강에지, Falling Edge)을 검출 할 수 있다. 상태가 0에서 0으로 혹은 1에서 1로 변하지 않는 상태에서 체크를 하면 트리거가 이벤트를 발생시키지 않는다.

 

위 그림에서 보면 상태가 0에서 1로 전이되는 순간 에지 트리거가 이벤트를 발생시킨다. 상태가 1인 상황에서 에지 트리거를 실행시키면 다음 상승에지(0 -> 1)까지 기다리게 된다.

 

 

 

소켓 통신을 예로 들어보자. 소켓 버퍼에 읽을 데이터가 있는 경우(상태 변수가 1)와 데이터가 없는경우(상태변수가 0)를 생각해보자.

 

소켓 버퍼에 데이터가 100바이트 도착했을 때, 소켓의 상태는 0에서 1로 변경된다. 이 때, 레벨 트리거와 에지 트리거 모두 이벤트를 발생시킨다. 레벨 트리거는 상태 1로 바뀌었기 때문에 이벤트를 발생시키고, 에지 트리거는 0에서 1로 상태가 변경되었기 때문에 이벤트를 발생시킨다. 

 

이 이벤트를 처리하기 위해 사용자 애플리케이션이 소켓 버퍼에서 데이터를 읽었다고 하자. 하지만 메모리 버퍼 사이즈 제한으로 30바이트만 읽었다고 하자. 여전히 소켓 버퍼에는 70바이트의 데이터가 남아있다. 

 

이 상황에서 레벨 트리거링을 해보면 이벤트가 발생한다. 소켓 버퍼에 데이터가 남아있기 때문이다. 하지만 에지 트리거링을 해보면 이벤트가 발생하지 않는다. 상태가 1에서 1로 유지되었기 때문이다.

 

소켓 통신에서 에지 트리거링을 사용할 때 epoll() 등의 시스템 호출이 Hang 상태에 빠지지 않게 주의해야한다. 소켓 버퍼에 데이터가 남아있어도 에지 트리거링에서는 이벤트가 발생하지 않고 대기하기 때문이다.

 

일반적으로 epoll() 등을 이용해 에지 트리거링을 할 때에는 소켓을 논블록(Non-block)으로 열어서 사용하며, read()나 write()가 EAGAIN(EWOULDBLOCK) 에러를 뱉을 때에만 에지 트리거링(epoll_wait())을 한다.

반응형

댓글