술어
event : 일어날 수있는 일.
이벤트 발생 : 특정 이벤트 발생; 이벤트가 발생합니다.
이벤트 리스너 : 이벤트 발생을 찾는 것.
event handler : 이벤트 리스너가 이벤트 발생을 감지 할 때 발생하는 것입니다.
event subscriber : 이벤트 핸들러가 호출해야하는 응답.
이러한 정의는 구현에 의존하지 않으므로 다른 방식으로 구현할 수 있습니다.
이러한 용어 중 일부는 일반적으로 사용자가 서로 구별 할 필요가 없기 때문에 동의어로 오인됩니다.
일반적인 시나리오
프로그래밍 논리 이벤트.
이벤트는 몇 가지 방법이 호출 될 때입니다.
이벤트 발사는 그 방법에 대한 특정 호출입니다.
이벤트 리스너는 이벤트 핸들러를 호출 각 이벤트 발사에라고 이벤트 방법에 훅입니다.
이벤트 핸들러는 이벤트 가입자의 컬렉션을 호출합니다.
이벤트 가입자 는 이벤트 발생에 대한 응답으로 시스템이 의미하는 모든 행동을 수행합니다.
외부 행사.
이 사건 은 관측 가능한 것으로 추론 할 수있는 외부 사건입니다.
이벤트 소성 그 외부 일어나는 발생한 것으로 인식 할 수있는 경우이다.
이벤트 리스너는 어떻게 든 자주 폴링에 의해, 이벤트 발사를 감지 관찰 (들), 다음이 발사 이벤트를 감지하면 이벤트 핸들러를 호출합니다.
이벤트 핸들러는 이벤트 가입자의 컬렉션을 호출합니다.
이벤트 가입자 는 이벤트 발생에 대한 응답으로 시스템이 의미하는 모든 행동을 수행합니다.
폴링 vs. 이벤트의 발사 메커니즘에 후크 삽입
다른 사람들의 요점은 종종 폴링이 필요하지 않다는 것입니다. 이벤트 발생시 이벤트 핸들러가 자동으로 이벤트 핸들러를 호출하도록하여 이벤트 리스너를 구현할 수 있기 때문입니다. 이는 이벤트가 시스템 레벨 발생 일 때이를 구현하는 가장 효율적인 방법입니다.
우체국 직원이 문을 두드리고 직접 우편물을 건네주는 경우 매일 우편함에서 우편물을 확인하지 않아도됩니다.
그러나 이벤트 리스너는 폴링을 통해 작동 할 수도 있습니다. 폴링이 반드시 특정 값이나 다른 관찰 가능한 값을 확인할 필요는 없습니다. 더 복잡 할 수 있습니다. 그러나 전반적으로 폴링의 요점은 일부 이벤트가 발생했을 때 응답 할 수 있도록 추론하는 것입니다.
유추하여 우편 배달원이 우편물을 보내기 만하면 우편함을 매일 확인해야합니다. 우체국 직원에게 문을 두드리라 고 지시 할 수 있다면이 폴링 작업을 수행 할 필요는 없지만 종종 가능하지는 않습니다.
연쇄 이벤트 로직
많은 프로그래밍 언어에서 키보드의 키를 누르거나 특정 시간에 방금 호출되는 이벤트를 작성할 수 있습니다. 외부 이벤트이지만 폴링 할 필요는 없습니다. 왜?
운영 체제가 사용자를 폴링하기 때문입니다. 예를 들어, Windows는 키보드 상태 변경과 같은 것을 확인하고이를 감지하면 이벤트 가입자를 호출합니다. 따라서 키보드 프레스 이벤트에 가입하면 실제로는 폴링 이벤트에 대한 가입자 자체 인 이벤트에 가입하게됩니다.
유사하게, 당신이 아파트 단지에 살고 있고 우체국 직원이 공동 우편 영수증 지역으로 우편물을 가져옵니다. 그런 다음 운영 체제와 유사한 작업자가 모든 사람을 위해 해당 메일을 확인하여 무언가를받은 사람들의 아파트로 메일을 배달 할 수 있습니다. 이렇게하면 다른 모든 사람이 메일 수신 영역을 폴링해야하는 번거 로움을 덜 수 있습니다.
내 직감은 이벤트 리스너가 이벤트가 발생했는지 지속적으로 확인한다고 가정합니다. 즉, 시나리오에서는 이벤트가 발생했는지 모든 프레임을 확인하는 것과 다르지 않습니다.
수업 토론을 바탕으로 이벤트 리스너가 다른 방식으로 작동하는 것 같습니다.
이벤트 리스너는 어떻게 작동합니까?
의심 한대로 이벤트 는 폴링을 통해 작동 할 수 있습니다 . 그리고 이벤트가 키보드 키를 누르는 것과 같이 외부에서 발생하는 문제와 관련이있는 경우 어느 시점에서 폴링이 발생해야합니다.
이벤트에 반드시 폴링이 필요하지는 않습니다. 예를 들어, 이벤트가 단추를 눌렀을 때 발생하는 경우 해당 단추의 이벤트 리스너는 마우스 클릭이 단추를 누르는 것으로 판단 될 때 GUI 프레임 워크가 호출 할 수있는 메소드입니다. 이 경우 마우스 클릭이 감지 되려면 여전히 폴링이 발생해야하지만 마우스 리스너는 이벤트 체인을 통해 기본 폴링 메커니즘에 연결된보다 수동적 인 요소입니다.
업데이트 : 저수준 하드웨어 폴링
USB 장치 및 기타 최신 통신 프로토콜에는 상호 작용을위한 다소 매혹적인 네트워킹과 유사한 프로토콜 세트가있어 키보드 및 마우스를 포함한 I / O 장치가 임시 토폴로지 에 참여할 수 있습니다.
흥미롭게도 " 인터럽트 "는 매우 필수적인 동기식이므로 임시 네트워킹 토폴로지를 처리하지 않습니다 . 이 문제를 해결하기 위해 " 인터럽트 "는 " 인터럽트 트랜잭션 " (USB 컨텍스트) 또는 " 메시지 신호 인터럽트 " (PCI 컨텍스트 ) 라고하는 비동기 우선 순위가 높은 패킷으로 일반화되었습니다 . 이 프로토콜은 USB 사양에 설명되어 있습니다.
- " 그림 8-31. "범용 직렬 버스 사양, 개정 2.0 "의 벌크 / 제어 / 인터럽트 OUT 트랜잭션 호스트 상태 머신 " -222 페이지; PDF-250 페이지 (2000-04-27)
요점은 I / O 장치 및 통신 구성 요소 (USB 허브 등)가 기본적으로 네트워크 장치처럼 작동하는 것 같습니다. 따라서 포트를 폴링해야하는 메시지를 보냅니다. 이를 통해 전용 하드웨어 라인이 필요하지 않습니다.
윈도우와 같은 운영 체제가 폴링 과정 자체를 처리하는 것, 예에 설명 된대로 에 대한 MSDN 문서 USB_ENDPOINT_DESCRIPTOR
의 제어하는 방법에 대해 설명합니다 얼마나 자주 윈도우 여론 조사 인터럽트 / 등시성 메시지에 대한 USB 호스트 컨트롤러 :
이 bInterval
값에는 인터럽트 및 등시성 엔드 포인트에 대한 폴링 간격이 포함됩니다. 다른 유형의 엔드 포인트의 경우이 값을 무시해야합니다. 이 값은 장치의 펌웨어 구성을 반영합니다. 드라이버는 변경할 수 없습니다.
폴링 간격은 장치 속도 및 호스트 컨트롤러 유형과 함께 드라이버가 인터럽트 또는 등시 전송을 시작해야하는 빈도를 결정합니다. 의 값은 bInterval
고정 된 시간 을 나타내지 않습니다. 상대 값이며 실제 폴링 주파수는 장치와 USB 호스트 컨트롤러가 저속, 전속 또는 고속으로 작동하는지에 따라 달라집니다.
- "USB_ENDPOINT_DESCRIPTOR 구조" , Microsoft 하드웨어 개발 센터
DisplayPort 와 같은 최신 모니터 연결 프로토콜도 동일한 것으로 보입니다.
멀티 스트림 전송 (MST)
- 슬라이드 # 14를 "DisplayPortTM ver.1.2 도서 개요" (2010-12-06)
이 추상화는 한 연결에서 3 개의 모니터를 실행하는 것과 같은 몇 가지 깔끔한 기능을 허용합니다.
또한 DisplayPort Multi-Stream Transport를 사용하면 3 개 이상의 장치를 함께 연결할 수 있지만 반대의 "소비자"지향 구성으로 단일 출력 포트에서 여러 디스플레이를 동시에 구동 할 수 있습니다.
- "DisplayPort" , Wikipedia
개념적으로,이 점에서 벗어나는 요점은 폴링 메커니즘이보다 일반화 된 직렬 통신을 허용한다는 것입니다. 이는보다 일반적인 기능을 원할 때 매우 좋습니다. 따라서 하드웨어와 OS는 논리 시스템에 대해 많은 폴링을 수행합니다. 그러면 이벤트를 구독하는 소비자는 자체 폴링 / 메시지 전달 프로토콜을 작성할 필요없이 하위 수준 시스템에서 처리하는 세부 정보를 즐길 수 있습니다.
궁극적으로 키 누름과 같은 이벤트는 소프트웨어 수준의 필수 이벤트 발생 메커니즘에 도달하기 전에 다소 흥미로운 일련의 이벤트를 거치는 것으로 보입니다.