解析mysql的啟動過程

有一天,兩個不懂mysql內核的人想去了解mysql內核代碼,兩個人不是去mysql代碼、查找資料,而是在那邊思考。因為不了解內核,所以邊思考邊去驗證。
使用的mysql代碼是5.1.7,調試環境是windows平臺下的vs2003。
bingxi:“alex,你覺得mysql的啟動過程會是什么樣的呢?我們以銀mysql例吧。”
alex:“嗯,bingxi。早上銀行開門了,會先準備好環境,然后開門迎客,mysql也是這樣。mysql里面會有一個hanmysqle_connections_socketsmysql,這個函數就好比是個叫號機,每個用戶來了都會取個號,然后就會進行業務處理。”

pthread_handler_t?handle_connections_sockets(void?*arg?attribute((unused)))    {    ??……    ??while?(!abort_loop)    ??{    ????select((int)?max_used_connection,&amp;readFDs,0,0,0)?<p>Bingxi:“啊,這里面存在兩種可能的,1)用戶來一個就分配一個工作人員處理,2)將排號的人丟進工作<a href="http://www.php.cn/wiki/1160.html" target="_blank">mysql</a>,根據叫號機到指定窗口獲取服務。前者的場景適合于請求量大,并且需要響應速度特別快的情況,但是分配也會有個限制,所謂的最大連接數,這樣的情況常見于互聯網行業,相應地我們可以看到機器的負載變化范圍特別大。同樣的,這也是它的一個弊端,假設每個業務都復雜(消耗資源型sql語句),同時處理的話,機器會支撐不住,這時候第二種方法就比較好,這種情況屬于事務性場景。”<br>Alex:“嗯,是的。Mysql選擇的是前者,oracle提供兩種方法供選擇。我們繼續往下面的代碼看,如果我們配置了線程<a href="http://www.php.cn/wiki/1160.html" target="_blank">mysql</a>,且有可用的緩存,則喚醒該線程,否則創建新的線程。”<br></p><pre class="brush:sql;">static?void?create_new_thread(THD?*thd)    {    ?    ????if?(cached_thread_count?&gt;?wake_thread)    ????{    ??????start_cached_thread(thd);    ????}    ????else    ????{    ??????if?((error=pthread_create(&amp;thd-&gt;real_id,&amp;connection_attrib,    ????????????????????????????handle_one_connection,    ????????????????????????????(void*)?thd)))    ??}    }

Bingxi:“嗯,老楊。是不是理解銀行為客戶分配了一個服務人員,在這段期間一直為該客戶服務。里面有個代碼段,是一直在等用戶下命令。但是有可能網絡,或者被kill掉了,就像一個人存了100,不斷取1塊錢一樣,被保安帶走了。”

pthread_handler_t?handle_one_connection(void?*arg)    {    ????while?(!net-&gt;error?&amp;&amp;?net-&gt;vio?!=?0?&amp;&amp;    ???????????!(thd-&gt;killed?==?THD::KILL_CONNECTION))    ????{    ??????net-&gt;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));    }

? ? ? ? ??

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享