mysql의 시작 과정 설명

2881 단어
어느 날, mysql 핵을 모르는 두 사람이 mysql 핵 코드를 알고 싶어 했습니다. 두 사람은 코드를 디버깅하고 자료를 찾는 것이 아니라 그곳에서 생각했습니다.속내를 모르기 때문에 생각하면서 검증한다.사용하는 mysql 코드는 5.1.7이고 디버깅 환경은 윈도우즈 플랫폼의 vs 2003입니다.Bingxi: "alex, mysql의 시작 과정은 어떻게 될 것 같아요? 은행을 예로 들자."Alex: "응, bingxi. 아침에 은행이 문을 열면 먼저 환경을 준비한 다음에 문을 열고 손님을 맞이한다. mysql도 마찬가지다. mysql에는handle connections sockets 함수가 있다. 이 함수는 호출기와 같이 모든 사용자가 오면 번호를 찾고, 그 다음에 업무 처리를 한다."

   pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused))) 
  
{
  ……
  while (!abort_loop)
  {
    select((int) max_used_connection,&readFDs,0,0,0) < 0) // ,
    ……
    accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length)  //
    ……
    create_new_thread(thd);
  }
  //abort_loop=1, 。
}

Bingxi:"아, 이 안에는 두 가지 가능성이 있다. 1) 사용자가 한 명씩 작업자를 배정하여 처리한다. 2) 번호를 매긴 사람을 작업 대기열에 넣고 호출기에 따라 지정된 창으로 서비스를 받는다. 전자의 장면은 요청량이 많고 응답 속도가 매우 빠른 경우에 적합하지만 분배도 제한이 있다. 이른바 최대 연결수라는 경우는 흔히 볼 수 있다.인터넷 업계에 있어서 우리는 기계의 부하 변화 범위가 특히 크다는 것을 볼 수 있다.마찬가지로 이것도 그의 폐단이다. 모든 업무가 복잡하다고 가정하고 (자원 소모형 sql문장을) 동시에 처리하면 기계가 지탱하지 못할 것이다. 이때 두 번째 방법이 비교적 좋다. 이런 상황은 사무적인 장면에 속한다."
Alex: "네, 그렇습니다. Mysql은 전자를 선택했습니다.oracle는 두 가지 방법을 제공합니다. 다음 코드를 계속 보겠습니다. 만약 우리가 루틴 캐시를 설정하고 사용할 수 있는 캐시가 있다면, 이 루틴을 깨우십시오. 그렇지 않으면 새로운 루틴을 만듭니다."
 
  
static void create_new_thread(THD *thd)
{
 
    if (cached_thread_count > wake_thread)
    {
      start_cached_thread(thd);
    }
    else
    {
      if ((error=pthread_create(&thd->real_id,&connection_attrib,
                            handle_one_connection,
                            (void*) thd)))
  }
}

빙씨: "응, 양씨. 은행이 고객한테 서비스 직원을 배정해 준 거 이해가 되시나요? 그 동안 계속 고객한테 서비스를 해줬어요. 코드 섹션이 있는데 명령을 기다리고 있었어요. 그런데 인터넷이나 킬이 떨어졌을 수도 있어요. 한 사람이 100원을 저축하고 1원을 계속 찾는 것처럼 경비원에게 끌려갔어요."
 
  
pthread_handler_t handle_one_connection(void *arg)
{
    while (!net->error && net->vio != 0 &&
           !(thd->killed == THD::KILL_CONNECTION))
    {
      net->no_send_error= 0;
      if (do_command(thd))
       break;
    }
}

Alex: "응, 명령을 받아서 실행해. dispatch command 함수에서 계좌 개설, 입금 등 서로 다른 고객 요청에 따라 응답 처리해."
 
  
bool do_command(THD *thd)
{
 
  if ((packet_length=my_net_read(net)) == packet_error) //
 
  DBUG_RETURN(dispatch_command(command,thd, packet+1, (uint) packet_length));
}

좋은 웹페이지 즐겨찾기