現在のスレッドは、apache によって動的に管理されます。
Apache のソース コードの worker.c から: スレッドは必要に応じて開始されます。以下はワーカースレッドを起動する主な流れです。
static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
startup_children(remaining_children_to_start); //server/mpm/worker/worker.c
if (make_child(ap_server_conf, i) < 0) { //server/mpm/worker/worker.c
child_main(slot); //server/mpm/worker/worker.c
rv = apr_thread_create(&start_thread_id, thread_attr, start_threads
rv = apr_thread_create(&threads[i], thread_attr, worker_thread, my_info, pchild);
また、アイドル スレッド > max_spare_threads の場合、apache は子プロセス/スレッドを強制終了してアイドル スレッドの数を減らすことにより、スペア スレッドを減らそうとします。
if (idle_thread_count > max_spare_threads) {
/* Kill off one child */
ap_worker_pod_signal(pod, TRUE);
retained->idle_spawn_rate = 1;
}
内部でApacheがこれらの子プロセスを管理し、シグナルを使用して子プロセスと通信し、必要に応じてスレッドを調整します。すべてのスレッドはで管理されますap_scoreboard_image->servers[i][j];
apache はスレッド数を監視し、ソケット送信を使用して infoCollector に知らせます。ざっくり以下のコードで(関係ない行は削除)
./httpd/modules/cluster/mod_heartbeat.c
for (i = 0; i < ctx->server_limit; i++) {
....
for (j = 0; j < ctx->thread_limit; j++) {
ws = &ap_scoreboard_image->servers[i][j];
if (res == SERVER_READY && ps->generation == mpm_generation) {
ready++;
}
}
}
len = apr_snprintf(buf, sizeof(buf), "v=%u&ready=%u&busy=%u", MSG_VERSION, ready, busy);
...
rv = apr_socket_sendto(sock, ctx->mcast_addr, 0, buf, &len);
Tomcat の場合:
これらのスレッド情報は、./tomcat/java/org/apache/catalina/ha/backend/CollectedInfo.java によって受信され、/Users/twer/lab/tomcat/java/org/apache/catalina/ によって表示されます。 manager/StatusTransformer.java
writer.write(" currentThreadCount=\"" + mBeanServer.getAttribute(tpName, "currentThreadCount") + "\"");
ここに示すコードのほとんどはメイン フローであり、関係のない行は削除されています。ソースをダウンロードして詳細を確認してください。apache src をダウンロード: http://www.apache.org/dist/httpd/?C=S;O=A
tomcat src をダウンロード: http://tomcat.apache.org/download-70.cgi