Nginx 학습 의 4 - Nginx 프로 세 스 동기 화 방식 - 자동 잠 금 (spinlock)

2908 단어 nginxlinux서버
자전거 자물쇠 안내
Nginx 프레임 워 크 는 세 가지 메시지 전달 방식 을 사 용 했 습 니 다. 공유 메모리, 소켓, 신호 입 니 다.
Nginx 는 주로 세 가지 동기 화 방식 을 사용 했다. 원자 조작, 신 호 량, 파일 잠 금 이다.
원자 조작 을 바탕 으로 nginx 는 자전 자 물 쇠 를 실현 했다.자전 자 물 쇠 는 비 수면 자물쇠 의 일종 이다.프로 세 스 보기 가 자동 잠 금 을 가 져 오 면 잠 금 이 다른 프로 세 스 에 의 해 가 져 온 것 을 발견 하면 현재 프로 세 스 를 수면 상태 로 들 어가 지 않 고 실행 가능 한 상태 로 유지 합 니 다. 커 널 이 이 프로 세 스 를 실행 할 때마다 잠 금 을 가 져 올 수 있 는 지 계속 확인 합 니 다.
자동 잠 금 의 응용 장면
자동 잠 금 은 주로 다 중 프로세서 운영 체 제 를 위해 설 치 된 것 입 니 다. 그 가 해결 하고 자 하 는 공유 자원 보호 장면 은 프로 세 스 가 잠 금 을 사용 하 는 시간 이 매우 짧 습 니 다 (잠 금 을 오래 사용 하면 자동 잠 금 이 적합 하지 않 습 니 다. 대량의 CPU 자원 을 차지 하기 때 문 입 니 다).
대부분의 경우 Nginx 의 worker 프로 세 스 는 수면 상태 에 들 어가 지 않 는 것 이 좋 습 니 다. 매우 바 쁘 기 때문에 이 프로 세 스 의 epoll 에 10 만 내지 백만 개의 TCP 연결 이 처 리 를 기다 리 고 있 을 수 있 습 니 다. 프로 세 스 가 잠 든 후에 다른 사건 의 깨 우 침 을 기 다 려 야 합 니 다. 이 중간 과 빈번 한 프로 세 스 간 전환 으로 인 한 부하 소 모 는 사용자 가 받 아들 일 수 없습니다.
자동 잠 금 소스 코드 분석
다음은 소스 코드 를 통 해 자동 잠 금 의 구체 적 인 실현 (Nginx spinlock. c, Nginx 1.4.1 버 전) 을 보 겠 습 니 다.
/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#include <ngx_config.h>
#include <ngx_core.h>

//  :            ngx_spinlock   
//    :
//lock:        
//value:   ,          
//spin:        , ngx_spinlock        ,                             
void
ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)
{

#if (NGX_HAVE_ATOMIC_OPS)//      

    ngx_uint_t  i, n;

    //       ,      
    for ( ;; ) {

        //lock 0           ,   lock    value            
        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
            return;
        }

        //         
        if (ngx_ncpu > 1) {
            for (n = 1; n < spin; n <<= 1) {
                //           ,               
                for (i = 0; i < n; i++) {
                    ngx_cpu_pause();//  CPU           
                }

                //        
                if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
                    return;
                }
            }
        }

        //         ,          
        ngx_sched_yield();
    }

#else

#if (NGX_THREADS)

#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !

#endif

#endif

}

위의 코드 는 주의해 야 할 것 은 다 중 프로세서 에서 잠 금 이 다른 프로 세 스에 의 해 점용 되 는 것 을 발 견 했 을 때 현재 프로 세 스 는 사용 하고 있 는 CPU 프로 세 서 를 즉시 내 보 내 는 것 이 아니 라 일정 시간 을 기다 리 는 것 입 니 다. 다른 프로세서 의 프로 세 스 가 잠 금 을 풀 수 있 는 지 확인 하면 프로 세 스 간 전환 횟수 를 줄 일 수 있 습 니 다.
함수 ngxcpu_pause (): 허 도 입 니 다. 구조 시스템 에서 자 회전 자 물 쇠 를 위 한 명령 입 니 다. CPU 가 현재 자 회전 자물쇠 대기 상태 에 있 음 을 알려 줍 니 다. 보통 하나의 CPU 는 자신 을 에너지 절약 상태 에 두 고 전력 소 모 를 줄 입 니 다.그러나 현재 프로 세 스 는 사용 중인 프로 세 서 를 양보 하지 않 았 습 니 다.
함수. ngx_sched_yield (): 현재 프로 세 스 는 실행 가능 한 상태 에 있 지만, 프로 세 서 를 잠시 내 보 내 서, 프로세서 가 실행 가능 한 다른 프로 세 스 를 우선적으로 스케줄 링 할 수 있 도록 합 니 다. 프로 세 스 가 내부 핵 에 다시 스케줄 링 될 때, for 순환 코드 에서 다른 프로 세 스 가 자 물 쇠 를 풀 기 를 기대 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기