찾다
백엔드 개발PHP 튜토리얼nginx 소스 코드 연구 노트(21) - 이벤트 모듈 2 - 이벤트 기반 코어 ngx_process_events_and_timers

우선, 이전 서브스레드 실행 연산에 관련되지 않은 내용인 ngx_process_events_and_timers가 있다는 점을 계속해서 상기해 보겠습니다. 오늘은 이 함수에 대해 공부하겠습니다.

이 기사의 출처: http://blog.csdn.net/lengzijian/article/details/7601730

섹션 19의 일부 스크린샷을 살펴보겠습니다.

nginx 源码学习笔记(二十一)—— event 模块二 ——事件驱动核心ngx_process_events_and_timers

오늘은 이벤트 중심 기능을 주로 설명하겠습니다. 사진에서 빨간색 부분:

[cpp] view 일반 카피프린트?

  1. src/event/ngx_event.c  
  2.   
  3. void   
  4. ngx_process_events_and_timers(ngx_cycle_t *cycle)  
  5. {  
  6.     ngx_uint_t  플래그;  
  7.     ngx_msec_t  타이머, 델타;  
  8.   
  9.     if (ngx_timer_solution) {  
  10.         타이머 = NGX_TIMER_INFINITE;  
  11.         플래그 = 0;  
  12.   
  13.     } 그 외 {  
  14.         타이머 = ngx_event_find_timer();  
  15.         플래그 = NGX_UPDATE_TIME;  
  16.     }  
  17.       
  18.     /* 
  19.     ngx_use_accept_mutex变weight代表是否使用accept互斥体 
  20.     默认是使用,可通过accept_mutex off;指令关闭; 
  21.     뮤텍스 수락 적작용就是避免惊群,同时实现负载均衡 
  22.     */   
  23.      (ngx_use_accept_mutex) {  
  24.         /* 
  25.         ngx_accept_disabled变weight 에서ngx_event_accept函数中计算。 
  26.         如果ngx_accept_disabled大于0,就表示该进程接受的链接过多, 
  27.         因此放弃一次争抢수락 mutex의 机会,同时将自己减一。 
  28.         然后 继续处理已有连接上的事件。 
  29.         nginx就利用这一点实现了继承关于连接的基本负载均衡。 
  30.         */  
  31.         인 경우 (ngx_accept_disabled > 0) {  
  32.             ngx_accept_ 장애인--;  
  33.   
  34.         } 그밖에 {  
  35.             /* 
  36.            尝试锁accept mutex,只有成功获取锁的进程,才会将들어보세요套接字放到epoll中。 
  37.            因此,这就保证了只有一个进程拥有监听套接口,故所有进程阻塞在epoll_wait时, 
  38.             才不会惊群现象。
  39. */
  40. 🎜 > (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {                                  🎜>                           >
  41. 프로세스가 잠금을 획득하면 NGX_POST_EVENTS 플래그가 추가됩니다.
  42. 이 플래그의 기능은 생성된 모든 이벤트를
  43. 대기열에 넣은 다음 이벤트가 해제된 후 천천히 이벤트를 처리하는 것입니다. .
  44. 처리 시간이 매우 오래 걸릴 수 있으므로 잠금을 먼저 해제하고 처리하지 않으면 프로세스가 오랫동안 잠금을 차지하게 됩니다. ,
  45. 결과적으로 다른 프로세스가 잠금을 얻을 수 없으므로 ACCEPT의 효율성이 낮습니다.
  46. _POST_EVENTS
  47.                                                                   
  48. /*
  49. 획득된 프로세스가 없으며 물론 NGX_POST_EVENTS 플래그도 필요하지 않습니다.
  50. 하지만 잠금을 위해 싸우기 전에 지연 시간을 설정해야 합니다.> == NGX_TIMER_INFINITE
  51. || 타이머 > )                                                                       타이머 = cept_mutex_delay;
  52. }
  53.                                             🎜>
  54.  델타 = ngx_current_msec;
  55.  
  56. /*다음으로 epoll은 대기 이벤트를 시작합니다.
  57. ngx_process_events의 구체적인 구현은 epoll 모듈의 ngx_epoll_process_events 함수에 해당합니다.
  58. 자세한 내용은 나중에 설명하겠습니다
  59. * /
  60. (void) ngx_process_events(주기, 타이머, 플래그) ;
  61. //이 대기 이벤트의 시간 소비 통계
  62. delta = ngx_current_msec - 델타
  63. ngx_log_debug1(NGX_LOG_DEBUG_EVENT, 사이클->log, 0,       " 타이머 델타: %M", 델타);
  64. >
  65. ngx_posted_accept_events는 epoll이 청취 소켓에서 기다리는 수락 이벤트를 임시로 저장하는 이벤트 queue입니다.
  66. 위에서 언급한 NGX_POST_EVENTS 플래그가 사용된 후 모든 수락 이벤트는 이 대기열
  67. */
  68. ngx_event_process_posted (cycle, &ngx_posted_accept_events) 🎜>  //모든 승인 이벤트 처리 후 잠금이 유지되면 해제합니다.
  69. if (ngx_accept_mutex_held) { ngx_shmtx_unlock(&ngx_accept_mutex)                                      🎜>
  70. delta는 이전에 계산된 시간 소모입니다. 밀리초 수준의 시간 소모가 있는 경우
  71. 경우입니다. timeout을 사용하는 경우, time rbtree에서 만료된 타이머를 삭제하고 해당 이벤트의 핸들러 함수를 호출하여 처리
  72. */
  73. if
  74. (델타) {
  75. ngx_event_expire_timers( );
  76. }
  77.                                                > /*
  78. 일반 이벤트 처리(연결에서 얻은 이벤트 읽기 및 쓰기),
  79. 이벤트마다 고유한 핸들러 메소드가 있으므로
  80. */
  81.  if (ngx_posted_events) {
  82.  
  83. if
  84. (ngx_threaded) {
  85. ngx _wakeup_worker_thread(주기)
  86. } else
  87. {
  88. ngx_event_process_posted(cycle, &ngx_posted_events)
  89. }
  90. }  
  91. 앞서 말한 accept 이벤트는 실제로 소켓에서 새 이벤트를 수신합니다. 승인 시간 방법은 아래와 같습니다:
  92. ngx_event_accept:
  93. [cpp] 보기 일반 카피프린트?
    1. src/event/ngx_event_accept.c  
    2.   
    3. void   
    4. ngx_event_accept(ngx_event_t *ev)  
    5. {  
    6.     socklen_t          socklen;  
    7.     ngx_err_t          오류;  
    8.     ngx_log_t         *log;  
    9.     ngx_socket_t       s;  
    10.     ngx_event_t       *rev, *wev;  
    11.     ngx_listening_t   *ls;  
    12.     ngx_connection_t  *c, *lc;  
    13.     ngx_event_conf_t  *ecf;  
    14.     u_char             sa[NGX_SOCKADDRLEN];  
    15.       
    16.     //省略part代码  
    17.   
    18.     lc = ev->data;  
    19.     ls = lc->듣기;  
    20.     ev->준비 = 0;  
    21.   
    22.     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,  
    23.                    "%V에서 수락, 준비: %d", &ls->addr_text, ev->사용 가능);  
    24.   
    25.     하세요 {  
    26.         socklen = NGX_SOCKADDRLEN;  
    27.         //accept 一个 new连接  
    28.         s = accept(lc-> ;fd, (struct sockaddr *) sa, &socklen);  
    29.         //省略part代码  
    30.           
    31.         /* 
    32.         accept到一个新的连接后,就重新计算ngx_accept_disabled的值, 
    33.         它主要是用来做负载均衡,之前有提过。 
    34.          
    35.         这里,我们可以看到他的就只方式 
    36.         “总连接数的八分之一-   剩余的连接数“ 
    37.         总连接指每个进程设数,这个数字可以再配置文件中指정입니다.
    38.                                                                                                ngx_accept_disabled가 0보다 크고 연결이 과부하되었습니다
    39. 🎜>
    40. ngx_accept_disabled = ngx_cycle->connection_n / 8
    41. - ngx_cycle- >free_connection_n;
    42. >
    43. c = ngx_get_connection(s, ev->log)
    44. //새 링크에 대한 메모리 풀 생성
    45. >
    46. c->pool = ngx_create_pool(ls->pool_size, ev->log); 🎜>
    47.                                                                                     이온(c );
    48. c->sockaddr = ngx_palloc(c->pool, socklen); > if (c->sockaddr == NULL) {
    49. ngx_close_accepted_connection(c); > return; c->sockaddr, sa, socklen) 🎜>(ngx_log_t));
    50. >
    51. ngx_close_accepted_connection(c)
    52. 🎜> }  
    53.   
    54.         /* aio에 대한 차단 모드 및 기타에 대한 비차단 모드 설정*/
    55.   
    56.         if (ngx_inherited_nonblocking) {  
    57.            인 경우 (ngx_event_flags & NGX_USE_AIO_EVENT) {  
    58.                if (ngx_blocking( s) == -1) {  
    59.                  ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,  
    60.                                 ngx_blocking_n " 실패했습니다");  
    61.                    ngx_close_accepted_connection(c);  
    62.                   반품;  
    63.                }  
    64.            }  
    65.   
    66.         } else {  
    67.            //我们使用epoll模型 ,这里我们设置连接为논블로킹  
    68.             (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {  
    69.                if (ngx_nonblocking(s) == -1) {  
    70.                    ngx_log _error(NGX_LOG_ALERT, ev->log , ngx_socket_errno,  
    71.                              ngx_nonblocking_n " 실패했습니다");  
    72.                    ngx_close_accepted_connection(c);  
    73.                   반품;  
    74.                }  
    75.            }  
    76.         }  
  94.   
  95.         *log = ls->log;  
  96.         //初始化新的连接  
  97.         c->recv = ngx_rec v;  
  98.         c->send = ngx_send;  
  99.         c->recv_chain = ngx_recv_chain;  
  100.         c->send_chain = ngx_send_chain;  
  101.   
  102.         c->log = log;  
  103.         c->풀->log = log;  
  104.   
  105.         c->socklen = socklen;  
  106.         c->듣기 = ls;  
  107.         c->local_sockaddr = ls->sockaddr;  
  108.   
  109.         c->unexpected_eof = 1;  
  110.   
  111. #if (NGX_HAVE_UNIX_DOMAIN)  
  112.         if (c->sockaddr->sa_family == AF_UNIX) {  
  113.             c->tcp_nopush = NGX_ TCP_NOPUSH_DISABLED ;  
  114.             c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;  
  115. #if (NGX_SOLARIS)  
  116.            /* Solaris의 sendfilev() AF_NCA, AF_INET 및 AF_INET6 지원*/  
  117.            c->sendfile = 0;  
  118. #endif  
  119.        }  
  120. #endif  
  121.   
  122.         rev = c->read;  
  123.         wev = c->write;  
  124.   
  125.         wev->ready = 1;  
  126.   
  127.          (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT)) {  
  128.            /* rtsig, aio, iocp */  
  129.             rev->ready = 1;  
  130.         }  
  131.   
  132.         (ev- >deferred_accept) {  
  133.             rev->준비 = 1;  
  134. #if (NGX_HAVE_KQUEUE)  
  135.             rev->사용 가능 = 1;  
  136. #endif  
  137.         }  
  138.   
  139.         rev->log = log;  
  140.         wev->log = log;  
  141.   
  142.         /* 
  143.          * TODO: MT: - ngx_atomic_fetch_add() 
  144.          *           또는 중요한 섹션 또는 가벼운 뮤텍스에 의한 보호
  145.         * 
  146.          * TODO: MP: - 공유 메모리에 할당됨 
  147.          * - ngx_atomic_fetch_add() 
  148.          *          또는 중요한 섹션이나 가벼운 뮤텍스에 의한 보호
  149.          * /  
  150.   
  151.         c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);  
  152.           
  153.         인 경우 (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {  
  154.             인 경우 (ngx_add_conn(c) == NGX_ERROR) {  
  155.                 ngx_close_accepted_connection(c );  
  156.                반품;  
  157.             }  
  158.        }  
  159.   
  160.         로그->데이터 = NULL;  
  161.         로그->핸들러 = NULL;  
  162.           
  163.         /* 
  164.         这里듣기 핸들러很重要,它将完成新连接的最后初始化工事, 
  165.         동종挂에는 핸들러가 있습니다.函数, 
  166.         就是ngx_http_init_connection 지금 지后http模块中재详细介绍 
  167.         */   
  168.         ls->handler(c);  
  169.   
  170.         if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {  
  171.             ev->사용 가능--;  
  172.         }  
  173.   
  174.     } 동안 (ev ->사용 가능);  
  175. }  

accpt事件的handler방식也就是如此了。지后就是每个连接的读写事件handler방식,这一part分会直接将我们引入http模块,我们还不急,还要school习下nginx经典模块epoll。

위 내용은 nginx 소스 코드 연구 노트(21) - 이벤트 모듈 2 - 대기열 콘텐츠를 포함한 이벤트 중심 코어 ngx_process_events_and_timers를 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

동시성에 대해 PHP 8.1의 섬유를 설명하십시오.동시성에 대해 PHP 8.1의 섬유를 설명하십시오.Apr 12, 2025 am 12:05 AM

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티 : 자원, 지원 및 개발PHP 커뮤니티 : 자원, 지원 및 개발Apr 12, 2025 am 12:04 AM

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP vs. Python : 차이점 이해PHP vs. Python : 차이점 이해Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP : 죽어 가거나 단순히 적응하고 있습니까?PHP : 죽어 가거나 단순히 적응하고 있습니까?Apr 11, 2025 am 12:13 AM

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래 : 적응 및 혁신PHP의 미래 : 적응 및 혁신Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.