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