程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql的啟動進程詳解

mysql的啟動進程詳解

編輯:MySQL綜合教程

mysql的啟動進程詳解。本站提示廣大學習愛好者:(mysql的啟動進程詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql的啟動進程詳解正文


有一天,兩個不懂mysql內核的人想去懂得mysql內核代碼,兩小我不是去調試代碼、查找材料,而是在那裡思慮。由於不懂得內核,所以邊思慮邊去驗證。
 
應用的mysql代碼是5.1.7,調試情況是windows平台下的vs2003。
 
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)))
  }
}

Bingxi:“嗯,老楊。是否是懂得銀行動客戶分派了一個辦事人員,在這段時代一向為該客戶辦事。外面有個代碼段,是一向在等用戶下敕令。然則有能夠收集,或許被kill失落了,就像一小我存了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));
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved