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

MySQLサーバー接続プロセスの説明と分析

巴扎黑
巴扎黑オリジナル
2017-05-01 13:45:111389ブラウズ

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 構文分析、クエリの実行、結果の返しなどに至るまでの「ソーシャル バタフライ」です。この変数は常に存在しており、要するに非常に重要な変数です。

コマンドの転送ステーションである構造体 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 の詳細」に非常に詳細なコード トレースが記載されています。興味のある学生は参照してください。参考のために関数呼び出しシーケンスを添付しました。

りー

以上がMySQLサーバー接続プロセスの説明と分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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