明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

解析mysql的打開(kāi)過(guò)程

[摘要]有一天,兩個(gè)不懂mysql內(nèi)核的人想去了解mysql內(nèi)核代碼,兩個(gè)人不是去調(diào)試代碼、查找資料,而是在那邊思考。因?yàn)椴涣私鈨?nèi)核,所以邊思考邊去驗(yàn)證。使用的mysql代碼是5.1.7,調(diào)試環(huán)境是windows平臺(tái)下的vs2003。Bingxi:“alex,你覺(jué)得mysql的啟動(dòng)過(guò)程會(huì)是什么樣的呢?我們...

有一天,兩個(gè)不懂mysql內(nèi)核的人想去了解mysql內(nèi)核代碼,兩個(gè)人不是去調(diào)試代碼、查找資料,而是在那邊思考。因?yàn)椴涣私鈨?nèi)核,所以邊思考邊去驗(yàn)證。
使用的mysql代碼是5.1.7,調(diào)試環(huán)境是windows平臺(tái)下的vs2003。
Bingxi:“alex,你覺(jué)得mysql的啟動(dòng)過(guò)程會(huì)是什么樣的呢?我們以銀行為例吧!
Alex:“嗯,bingxi。早上銀行開(kāi)門(mén)了,會(huì)先準(zhǔn)備好環(huán)境,然后開(kāi)門(mén)迎客,mysql也是這樣。Mysql里面會(huì)有一個(gè)handle_connections_sockets函數(shù),這個(gè)函數(shù)就好比是個(gè)叫號(hào)機(jī),每個(gè)用戶來(lái)了都會(huì)取個(gè)號(hào),然后就會(huì)進(jìn)行業(yè)務(wù)處理!

pthread_handler_t handle_connections_sockets(void *arg attribute((unused)))

{

  ……

  while (!abort_loop)

  {

    select((int) max_used_connection,&readFDs,0,0,0) < 0) //有連接了則往下來(lái)執(zhí)行,否則一直等待

    ……

    accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr),&length)  //接受請(qǐng)求

    ……

    create_new_thread(thd);

  }

  //abort_loop=1,則執(zhí)行到這里進(jìn)行推出。今天業(yè)務(wù)不處理了

}

Bingxi:“啊,這里面存在兩種可能的,1)用戶來(lái)一個(gè)就分配一個(gè)工作人員處理,2)將排號(hào)的人丟進(jìn)工作隊(duì)列,根據(jù)叫號(hào)機(jī)到指定窗口獲取服務(wù)。前者的場(chǎng)景適合于請(qǐng)求量大,并且需要響應(yīng)速度特別快的情況,但是分配也會(huì)有個(gè)限制,所謂的最大連接數(shù),這樣的情況常見(jiàn)于互聯(lián)網(wǎng)行業(yè),相應(yīng)地我們可以看到機(jī)器的負(fù)載變化范圍特別大。同樣的,這也是它的一個(gè)弊端,假設(shè)每個(gè)業(yè)務(wù)都復(fù)雜(消耗資源型sql語(yǔ)句),同時(shí)處理的話,機(jī)器會(huì)支撐不住,這時(shí)候第二種方法就比較好,這種情況屬于事務(wù)性場(chǎng)景!
Alex:“嗯,是的。Mysql選擇的是前者,oracle提供兩種方法供選擇。我們繼續(xù)往下面的代碼看,如果我們配置了線程緩存,且有可用的緩存,則喚醒該線程,否則創(chuàng)建新的線程。”

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:“嗯,老楊。是不是理解銀行為客戶分配了一個(gè)服務(wù)人員,在這段期間一直為該客戶服務(wù)。里面有個(gè)代碼段,是一直在等用戶下命令。但是有可能網(wǎng)絡(luò),或者被kill掉了,就像一個(gè)人存了100,不斷取1塊錢(qián)一樣,被保安帶走了!

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:“嗯,獲取命令,然后執(zhí)行命令。在dispatch_command函數(shù)中,根據(jù)不同的客戶請(qǐng)求進(jìn)行響應(yīng)的處理,比如開(kāi)賬戶、存錢(qián)等”

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));

}

以上就是解析mysql的啟動(dòng)過(guò)程的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門(mén)到精通的SQL知識(shí)。