nginx 소스 코드 분석 1 - 프로 세 스 간 통신 메커니즘 2 (자동 잠 금)

3115 단어 nginx
자물쇠
자전 자물쇠
자 회전 자물쇠 와 다른 자물쇠 의 가장 큰 차 이 는 자 회전 자물쇠 가 호출 자의 수면 (비 수면 자물쇠) 을 일 으 키 지 않 는 다 는 것 이다. 즉, 시종 실행 가능 한 상태 이다.만약 자선 자물쇠 가 다른 실행 단원 에 의 해 유지 되 었 다 면, 호출 자 는 계속 그곳 에서 순환 해서, 자선 자물쇠 의 보유 자가 이미 자 물 쇠 를 풀 었 는 지 확인 해 야 한다.
자동 잠 금 적용 필드
자물쇠 의 사용 시간 이 매우 짧 을 때 자전 자 물 쇠 를 사용 할 수 있어 서 비용 이 매우 적다.시간 이 오래 걸 리 면 자물쇠 가 계속 자전 하고 다른 프로그램 을 예약 할 수 없 으 며 cpu 자원 이 대량으로 점용 되 어 적합 하지 않 습 니 다.장시간 의 자 물 쇠 는 자전 이 아니 라 휴면 시 키 는 자 물 쇠 를 사용 해 야 한다.자전 자 물 쇠 는 단 핵 이 든 다 핵 이 든 모두 효과 적 이 고 실행 가능 한 상태 에 있 으 며 상태 전환 이 적 을 수 있 습 니 다. 수면 상태 로 전환 하려 면 휴면 상태 에서 준비 상태 로 전환 해 야 cpu 스케줄 링 을 할 수 있 습 니 다 (잘 모 르 면 운영 체제 프로세서 스케줄 링 에 관 한 지식 을 많이 알 아야 합 니 다).
nginx 관련 실현
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 ( ;; ) {
        //      ,       (compare and set)
        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
        //          return。
                    return;
        }
        // cpu  1         
        if (ngx_ncpu > 1) {
            //       for    n   nginx_cpu_pause        。
            for (n = 1; n < spin; n <<= 1) {
                for (i = 0; i < n; i++) {
                    //                  ,    CPU           ,    CPU          ,    。                   。
                    ngx_cpu_pause();
                }
                //      ,           , spin       ,           。
                if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) {
                    return;
                }
            }
        }
        //   for    usleep(1)        
        ngx_sched_yield();
    }
#else
#if (NGX_THREADS)
#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !
#endif
#endif
}   

nginx 가 다 핵 과 단 핵 을 충분히 이용 한 장면 을 볼 수 있 습 니 다. 안의 이중 for 순환 도 넓 고 심오 하 며 나머지 디 테 일 도 특히 치밀 합 니 다.자전 자 물 쇠 는 짧 은 시간 에 잠 그 는 것 이 매우 효율 적 이 고 유용 하 다.섬세 한 당신, ngx 에서 발견 할 수 있 을 겁 니 다.shmtx_lock 방법 에서 도 자 회전 자물쇠 와 신 호 량 을 함께 하 는 방식 으로 이 루어 졌 습 니 다.

좋은 웹페이지 즐겨찾기