2011-04-30 3 views
30

이벤트 기반 및 비동기는 종종 동의어로 사용됩니다. 둘 사이에 차이점이 있습니까?이벤트 구동 형과 비동기식의 차이점은 무엇입니까? epoll과 AIO간에?

또한 epollaio의 차이점은 무엇입니까? 어떻게 서로 잘 어울리나요?

마지막으로, Linux의 AIO가 끔찍하게 고장났다는 것을 여러 번 읽었습니다. 그것은 정확히 어떻게 깨졌습니까?

감사합니다.

+1

이벤트 구동 아키텍처를 사용할 때 비동기 동작을 독립적으로 허용하는 스레드를 상상해보십시오. 이벤트 중심 아키텍처는 종종 프로그램이 "하나의 컨테이너 내에 살아"(예 : 하나의 스레드, 하나의 프로세스 등을 일부 작업을 단순하게 유지할 수 있음) 허용하지만 다른 "컨테이너 간"비동기 기술을 배제하지 않습니다. –

답변

16

이벤트는 비동기 실행을 구현하는 패러다임 중 하나입니다. 그러나 모든 비동기 시스템에서 이벤트를 사용하는 것은 아닙니다. 그것은이 두 가지 의미 론적 의미에 관한 것입니다. 하나는 다른 것의 수퍼 엔티티입니다.

는 epoll 및 AIO은 다른 은유를 사용

는 epoll은 블록 조작 (epoll_wait())입니다 - 어떤 이벤트가 발생할 때까지 스레드를 차단 한 다음 코드에서 다른 절차/기능/지점에 이벤트를 전달합니다.

AIO에서 콜백 함수 (완료 루틴)의 주소를 시스템에 전달하면 시스템은 무언가가 발생하면 함수를 호출합니다.

AIO 문제 콜백 함수 코드는 시스템 스레드에서 실행되므로 시스템 스택 맨 위에서 실행됩니다. 상상할 수있는 몇 가지 문제가 있습니다.

2

이벤트 구동은 이벤트가 특정 시나리오에 대해 등록되는 단일 스레드입니다. 시나리오가 직면하면 이벤트가 시작됩니다. 그러나 그 당시에도 각 사건은 순차적 인 방식으로 해고된다. 그것에 대해 비동기적인 것은 없습니다. Node.js (웹 서버)는 이벤트를 사용하여 여러 요청을 처리합니다.

기본적으로 비동기식 멀티 태스킹입니다. 특정 함수를 실행하기 위해 여러 스레드 또는 프로세스를 생성 할 수 있습니다. 이는 각 스레드가 독립적이며 주 스레드와 쉽게 반응 할 수 없다는 의미에서 구동되는 이벤트와 완전히 다릅니다. Apache (웹 서버)는 들어오는 요청을 처리하기 위해 여러 스레드를 사용합니다.

17

완전히 다른 것들입니다.

이벤트 중심 패러다임은 이벤트가 발생했는지 여부를 알아 내기 위해 규칙적인 간격으로 폴링해야하는 "무언가"가 없어도 "이벤트"라는 개체가 프로그램에 보내지는 것을 의미합니다. 이 "이벤트"는 동기 또는 비동기 중 일부 동작 (즉, "처리기")을 수행하기 위해 프로그램에 의해 트랩 될 수 있습니다.

따라서 이벤트 처리는 동기식 또는 비동기식 중 하나 일 수 있습니다. 예를 들어, JavaScript는 동기 이벤트 시스템을 사용합니다.

비동기는 현재 "기본"실행 스트림과 독립적으로 동작이 발생할 수 있음을 의미합니다. 신경 쓰지 마시십시오. NOT "parallel"또는 "different thread"를 의미합니다. "비동기"액션은 실제로 메인 스레드에서 실행되어 그 동안 "메인"실행 스트림을 차단할 수 있습니다. 따라서 "비동기"와 "멀티 스레딩"을 혼동하지 마십시오.

당신은 기술적으로 말하면 말할 수는 비동기 작업이 자동으로 이벤 팅을 가정 - 적어도 선동자로 전송됩니다, "폴트"또는 "중단/취소"이벤트 (하나 또는 이들의 이상) "완료" (또는 하부에있는 O/S 자체)를 선택하여 작업이 중단되었음을 알립니다. 따라서 비동기는 항상 이벤트 중심이지만 다른 방법은 없습니다.

+0

당신은 말합니다 - "당신을 생각해보십시오,"평행 "또는"다른 실 "을 의미하지 않습니다." 예를 들어 더 설명해 주시겠습니까? 이벤트가 주 스레드 내에서 처리되는 경우 현재 주 실행 스트림과 어떻게 독립적입니까? –

+1

특정 소프트웨어 시스템은 동일한 스레드 내에서 실행 스트림 간을 전환 할 수있는 공동 루틴을 구현합니다. 그러나 다른 시스템은 이벤트 수신시 현재 작업을 "선점"하고 핸들러를 실행 한 다음 원래 스레드의 실행을 다시 시작합니다. 모두 동일한 스레드 내부에서 인터럽트를 생각합니다. 일부 시스템은 이러한 기능을 지원하지 않으므로 이벤트를 "저장"해야합니다. 메인 스레드가 현재 작업을 마친 후 명시 적으로 "가져 오기"를 기다립니다. JavaScript와 Windows 메시지 루프를 생각합니다. –

+0

안녕하세요 스티븐, 나는 리눅스 singal 처리기가이 시나리오에서 공동 루틴의 인스턴스라고 생각합니다. 맞아? – firo

관련 문제