<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                有一天,兩個不懂mysql內核的人想去了解mysql內核代碼,兩個人不是去調試代碼、查找資料,而是在那邊思考。因為不了解內核,所以邊思考邊去驗證。 使用的mysql代碼是5.1.7,調試環境是windows平臺下的vs2003。 ingxi:“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)); } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看