ホームページ  >  記事  >  データベース  >  MySQLサーバー接続プロセス分析

MySQLサーバー接続プロセス分析

黄舟
黄舟オリジナル
2017-02-22 11:23:261219ブラウズ

mysqld は MySQL サーバーのメインプロセスです。mysqld は MySQL の真のコアであると言え、すべての作業は mysqld プロセスを中心に実行されます。したがって、巨大な mysql を分析するには、mysqld のコードが最良の突破口となります。

すべてはおなじみの main() 関数から始まります。実際には、mysqld_main() 関数から始まります。これらのコードはすべて mysqld.cc にあります。次に、mysqld_main() は win_main)() を呼び出します。 win_main() 関数は主に初期化作業を行います。

初期化作業が完了すると、MySQL は接続を受け入れる準備が整います。次に、主人公の Handle_connections_methods() 関数が表示されます。この関数の主な仕事は、TCP/IP、名前付きパイプ、共有メモリの 3 つの方法で接続を受け入れる 3 つの新しいサブプロセスを作成することです。通常の状況では、お客様は最も柔軟な通信方法である TCP/IP (ソケット) を使用して MySQL サーバーに接続します。ただし、組み込みソフトウェアのアプリケーション環境では、後者の 2 つの通信方式を使用する必要があります。

  • 簡略化された handle_connections_methods() 関数:

static void handle_connections_methods()
{
  mysql_mutex_lock(&LOCK_thread_count);
  mysql_cond_init(key_COND_handler_count, &COND_handler_count, NULL);
  handler_count=0;
  handler_count++;
  mysql_thread_create(key_thread_handle_con_namedpipes, &hThread, &connection_attrib, handle_connections_namedpipes, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sockets, &hThread, &connection_attrib, handle_connections_sockets_thread, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sharedmem, &hThread, &connection_attrib, handle_connections_shared_memory, 0))
  while (handler_count > 0)
    mysql_cond_wait(&COND_handler_count, &LOCK_thread_count);
  mysql_mutex_unlock(&LOCK_thread_count);
}

3 つの新しいスレッドを作成した後、handle_connectins_methods() 関数は長いループに入り、3 つの接続スレッドすべてが終了するまで終了しません。ここでは主にソケット接続スレッドを調べます。この handle_connections_sockets_thread です。このスレッドは自身を初期化した後、handle_connections_sockets() を直接呼び出します。 handle_connections_sockets() 関数は、select() を使用して mysqld のリスニング ポートを呼び出し、クライアント接続を待ちます。クライアントが接続すると、この関数内で THD タイプの変数が作成されます。この変数は、接続の確立から SQL 構文分析、クエリの実行、結果の返しなどに至るまでの「ソーシャル バタフライ」です。この変数は常に存在しており、要するに非常に重要な変数です。

コマンドの転送ステーションである構造体 struct st_vio もあります。 vio タイプの構造は、「Social Butterfly」THD でも定義されています。この構造体の機能は、通信内容をストレージ ソケットから読み取り、その値を THD の vio 変数に割り当てることです。 VIO タイプは、リクエストの内容、時刻、リクエストのソケット アドレスなど、リクエストを詳細に記述します。次に行われるのは、この「ソーシャル バタフライ」をサービス スレッドに渡し、create_thread_to_handle_connection() がこの関数を実装することです。

    以下は削除されたコードです
  • ​​

    void create_thread_to_handle_connection(THD *thd)
    {
      if (cached_thread_count > wake_thread)
      {
        mysql_cond_signal(&COND_thread_cache);
      }
      else
      {
        mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib, handle_one_connection, (void*) thd)));    
      }
    }
  • この関数は、アイドル状態のキャッシュ スレッドがあるかどうかを確認します (MySQL は、切断されたサービス スレッドをすぐには破棄しませんが、キャッシュします)。存在する場合は、キャッシュ スレッドを使用します。そうでない場合は、接続を提供する新しいスレッドを作成します。この時点で、接続はサービス スレッドに入り、接続スレッドは戻って接続を待ち続けます。

以下の内容はすべてサービス スレッドに実装されています。「MySQL の詳細」に非常に詳細なコード トレースが記載されています。興味のある学生は参照してください。参考のために関数呼び出しシーケンスを添付しました。

handle_one_connection()
mysql_thread_create()
handle_one_connection()
do_handle_one_connection()
init_new_connection_thread()
init_new_connection_handler_thread()
do_command()
dispatch_command()
mysql_parse()
mysql_execuate_command()

上記は MySQL サーバーの接続プロセスの分析です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。