ある日、mysql カーネルを理解していなかった 2 人は、コードをデバッグして情報を探す代わりに、mysql カーネル コードを理解したいと考えていました。カーネルが分からないので考えながら検証します。 使用した mysql コードは 5.1.7 で、デバッグ環境は Windows プラットフォームの vs2003 です。 Bingxi: 「アレックス、mysql の起動プロセスはどのようになると思いますか? 銀行
の動作
を例に考えてみましょう。」 Alex: 「そうですね、Bingxi。朝、銀行は準備をします。」ようこそ、mysql にも handl
e_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: ああ、ここには 2 つの可能性があります。1) ユーザーが来たらすぐに電話を処理するスタッフを割り当てる、2) キューに登録されている番号の人を呼び出す前者のシナリオは、リクエスト量が多く、応答速度が特に速い状況に適していますが、次のような場合もあります。割り当ての制限、いわゆる最大接続数の制限はインターネット業界ではよくあることですが、これも同様にマシンの負荷が非常に大きいことがわかります。各ビジネスが複雑で (リソースを消費する SQL ステートメント)、同時に処理される場合、この状況は 2 番目の方法の方が適切です。 : "そうです。Mysql は前者を選択します。Oracle は 2 つの方法から選択できます。スレッド
キャッシュ
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: 「そうですね、ラオヤン、銀行がこの期間中顧客にサービスを提供するサービススタッフを割り当てていることを理解していますか。その中にはユーザーのコマンドを待っているコードセグメントがありますが、それは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;
}
}
以上がmysqlの起動プロセスを解析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。