초보 nginx 소스 분석 데이터 구조 편 (11) 공유 메모리 ngxshm_t

초보 nginx 소스 분석 데이터 구조 편 (11) 공유 메모리 ngxshm_t
 
  • 작성 자: Echo Chen (진 빈)
  • Email:[email protected]
  • Blog:Blog.csdn.net/chen19870707
  • Date:Nov 14th, 2014   1. 공유 메모리
    공유 메모 리 는 Linux 에서 제공 하 는 가장 기본 적 인 프로 세 스 통신 방법 입 니 다. mmap 또는 shmget 시스템 을 통 해 메모리 에 연속 적 인 선형 주소 공간 을 만 들 었 습 니 다. munmap 또는 shmdt 시스템 을 통 해 이 메모 리 를 호출 하여 방출 합 니 다. 공유 메모 리 를 사용 하 는 장점 은 여러 프로 세 스 가 같은 메모 리 를 사용 할 때 모든 프로 세 스 가 공유 메모리 의 내용 을 수정 한 후에다른 프로 세 스 는 이 메모리 에 접근 하면 메모리 변 화 를 얻 을 수 있 습 니 다.
  • 2. 소스 코드 위치  헤더 파일:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx. h 원본 파일:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.c   3. 데이터 구조 정의
    ngx_shm_t: 공유 메모리 설명 에 사용:
       1: typedef struct {
       2:     u_char      *addr;            //           
       3:     size_t       size;            //       
       4:     ngx_str_t    name;            //         
       5:     ngx_log_t   *log;             //     ngx_log_t  
       6:     ngx_uint_t   exists;          //               , 1      
       7: } ngx_shm_t;

  •   4. Linux 공유 메모리 인터페이스  공유 메모리 신청 mmap:
       1: #include<sys/mman.h>
       2: void*mmap(void* start,size_t length,int prot,int flags,
       3: int fd,off_t offset);

    mmap 는 디스크 파일 을 메모리 에 매 핑 할 수 있 습 니 다. 메모 리 를 직접 조작 할 때 Linux 커 널 은 메모리 와 디스크 파일 의 데 이 터 를 동기 화 합 니 다. fd 인 자 는 동기 화 할 디스크 파일 을 실행 합 니 다. offset 은 파일 의 이 오프셋 에서 부터 공유 합 니 다. Nginx 는 이 기능 을 사용 하지 않 습 니 다.flags 매개 변수 에 MAP 추가ANON 혹은 MAPANONYMOUS 매개 변 수 는 파일 맵 방식 이 적용 되 지 않 는 다 고 표시 합 니 다. 이 때 fd 와 offset 매개 변 수 는 모두 의미 가 없고 전달 할 필요 가 없습니다.Nginx 에 서 는 디스크 에 동기 화 할 필요 가 없습니다.
    length 매개 변 수 는 메모리 에 열 릴 선형 주소 공간 크기 입 니 다.
    port 매개 변 수 는 이 공유 메모 리 를 조작 하 는 방식 을 표시 합 니 다. (읽 기 전용 또는 쓰기 가능)
    start 매개 변 수 는 원 하 는 공유 메모리 의 시작 주 소 를 설명 합 니 다. 보통 NULL 로 설정 합 니 다.
    공유 메모리 방출 munmap:
       1: #include<sys/mman.h>
       2: int munmap(void *start,size_t length);

    start 가 가리 키 는 맵 메모리 시작 주소, 인자 length 는 취소 하려 는 메모리 크기 입 니 다. 
  • 5. 공유 메모리 의 주요 조작

  • 공유 메모리 의 주요 동작 은 다음 과 같은 몇 가지 가 있 습 니 다.

  • 공유 메모리 할당
    ngx_shm_alloc
    공유 메모리 의 방출
    ngx_shm_free
    5.1 공유 메모리 의 분배 ngxshm_alloc
       1: ngx_int_t ngx_shm_alloc(ngx_shm_t *shm)
       2: {
       3:     //   shm->size             ,       shm->addr 
       4:     shm->addr = (u_char *) mmap(NULL, shm->size,
       5:                                 PROT_READ|PROT_WRITE,
       6:                                 MAP_ANON|MAP_SHARED, -1, 0);
       7:  
       8:     if (shm->addr == MAP_FAILED) {
       9:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
      10:                       "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
      11:         return NGX_ERROR;
      12:     }
      13:  
      14:     return NGX_OK;
      15: }
  •  5.2 공유 메모리 방출 ngxshm_free
  •    1: void
       2: ngx_shm_free(ngx_shm_t *shm)
       3: {
       4:     //  ngx_shm_t  addr size  munmap      
       5:     if (munmap((void *) shm->addr, shm->size) == -1) {
       6:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
       7:                       "munmap(%p, %uz) failed", shm->addr, shm->size);
       8:     }
       9: }

  • 6. 참고
  •  
  • - Echo Chen:Blog.csdn.net/chen19870707 -
  • 좋은 웹페이지 즐겨찾기