nginx 의 이벤트 모듈
1. AIO (비동기 I / O)
2. / dev / poll (solaris 와 유 닉 스 특유)
3. epoll (linux 2.6 특유)
4. eventport (solaris 10 특유)
5. kqueue (BSD 특유)
6、poll
7. rtsig (실시 간 신호)
8、select
이벤트 모듈 의 주요 기능 은 accept 를 감청 한 후 만들어 진 연결 을 통 해 읽 기와 쓰기 이 벤트 를 추가 삭제 하 는 것 이다.이벤트 구동 모델 과 비 차단 I / O 모델 을 결합 하여 사용 합 니 다.I / O 가 읽 고 쓸 수 있 을 때 해당 읽 기와 쓰기 이벤트 가 깨 어 나 고 이 때 이벤트 의 리 셋 함 수 를 처리 합 니 다.
Linux 에 대해 nginx 대부분의 이 벤트 는 epoll EPOLLET (변두리 트리거) 방법 으로 이 벤트 를 깨 웁 니 다. listen 포트 의 읽 기 이 벤트 는 EPOLLLT (수평 트리거) 입 니 다. 변두리 트리거 에 대해 읽 기 가능 한 이벤트 가 발생 하면 제때에 처리 해 야 합 니 다. 그렇지 않 으 면 읽 기 파일 이 더 이상 트리거 되 지 않 고 처리 되 지 않 은 상황 이 발생 할 수 있 습 니 다.
이벤트 의 구조 체 는:
typedef struct {
ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
ngx_int_t (*add_conn)(ngx_connection_t *c);
ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
ngx_int_t (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);
ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
ngx_uint_t flags);
ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
void (*done)(ngx_cycle_t *cycle);
} ngx_event_actions_t;
accept 자물쇠
커 널 accpet 가 연결 되 어 있 을 때 기다 리 는 모든 프로 세 스 를 깨 웁 니 다. 그러나 실제로 하나의 프로 세 스 만 연결 을 가 져 올 수 있 습 니 다. 다른 프로 세 스 는 깨 울 수 없습니다.
nginx 의 이벤트 처리 입구 함 수 는 ngxprocess_events_and_timers (), 잠 금 추가 과정 은?
if (ngx_use_accept_mutex) {
if (ngx_accept_disabled > 0) {
ngx_accept_disabled--;
} else {
if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
return;
}
if (ngx_accept_mutex_held) {
flags |= NGX_POST_EVENTS;
} else {
if (timer == NGX_TIMER_INFINITE
|| timer > ngx_accept_mutex_delay)
{
timer = ngx_accept_mutex_delay;
}
}
}
}
재 ngxtrylock_accept_mutex 에서 자 물 쇠 를 가 져 오 면 listen 의 포트 읽 기 이 벤트 를 이벤트 처리 에 추가 하고 새로운 연결 이 올 때 accept 할 수 있 습 니 다.
ngx_process_이벤트 함 수 는 모든 이벤트 처리 의 입구 입 니 다. 모든 이 벤트 를 옮 겨 다 닙 니 다.accept 잠 금 을 빼 앗 는 프로 세 스 는 일반 프로 세 스 와 차이 가 있 습 니 다. 게다가 NGXPOST_EVENTS 플래그 표시 ngxprocess_events 는 사건 을 post이벤트 이벤트 의 대기 열 에서 처리 하지 않 습 니 다.ngx 까지accept_mutex 자 물 쇠 를 제거 한 후에 야 사건 을 처리 합 니 다.왜 이래?이렇게 하면 이 프로 세 스 가 자 물 쇠 를 빼 앗 은 후 accept 부터 끝 날 때 까지 다른 프로 세 스 가 새로운 연결 을 계속 받 아들 이 고 스루풋 을 높 일 수 있 기 때문이다.
ngx_posted_accept_이벤트 와 ngxposted_이 벤트 는 accept 지연 이벤트 큐 와 일반 지연 이벤트 큐 입 니 다.사실 ngxposted_accept_이벤트accept_mutex 자물쇠 에서 처 리 된 것 입 니 다. 이 대기 열 은 accept 이 벤트 를 처리 합 니 다. 커 널 backlog 에서 기다 리 는 연결 을 모두 accept 로 들 어 와 읽 기와 쓰기 이벤트 에 등록 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.