「Bitcoin Core 0.11 (ch 3): Initialization and Startup」を編集中
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
4行目: | 4行目: | ||
==プログラムエントリポイント== | ==プログラムエントリポイント== | ||
− | プログラムのエントリポイントは<u> bitcoind.cpp </u>にあります。 | + | プログラムのエントリポイントは<u> bitcoind.cpp </ u>にあります。 |
main()はコードの3行です: | main()はコードの3行です: | ||
12行目: | 12行目: | ||
− | AppInit:これは<u> bitcoind.cpp </u>の近くにあります。 | + | AppInit:これは<u> bitcoind.cpp </ u>の近くにあります。 |
*コマンドラインを解析する | *コマンドラインを解析する | ||
*データディレクトリを開きます。 | *データディレクトリを開きます。 | ||
*設定ファイルを読み込みます | *設定ファイルを読み込みます | ||
*プロセスをフォークします(デーモンとして実行している場合) | *プロセスをフォークします(デーモンとして実行している場合) | ||
− | *コントロールを<u> init.cpp </u>にあるAppInit2()に渡します。 | + | *コントロールを<u> init.cpp </ u>にあるAppInit2()に渡します。 |
− | ==初期化ステップ(<u> init.cpp </u>)== | + | ==初期化ステップ(<u> init.cpp </ u>)== |
AppInit2()はビットコインシステムを初期化します。 | AppInit2()はビットコインシステムを初期化します。 | ||
26行目: | 26行目: | ||
これには約800行のコードが含まれており、12段階に分かれています。 | これには約800行のコードが含まれており、12段階に分かれています。 | ||
− | 各ステップが始まる場所は、コードに文書化されています。 <u> Init.cpp </u>にはファイルの先頭にいくつかの関数がありますが、大部分はAppInit2()で構成されています。 | + | 各ステップが始まる場所は、コードに文書化されています。 <u> Init.cpp </ u>にはファイルの先頭にいくつかの関数がありますが、大部分はAppInit2()で構成されています。 |
次の表は、手順をまとめたものです。 | 次の表は、手順をまとめたものです。 | ||
94行目: | 94行目: | ||
− | AppInit2が終了すると、<u> bitcoind.cpp </u>のAppInit()に戻ります。 | + | AppInit2が終了すると、<u> bitcoind.cpp </ u>のAppInit()に戻ります。 |
− | そこで、コードのトップレベルスレッドは、WaitForShutdown()という関数で無期限にループします。 2秒間スリープ状態になり、ユーザーがctrl-Cを押したかどうかを確認します。 その場合は、<u> init.cpp </u>でShutdown()を呼び出します。 | + | そこで、コードのトップレベルスレッドは、WaitForShutdown()という関数で無期限にループします。 2秒間スリープ状態になり、ユーザーがctrl-Cを押したかどうかを確認します。 その場合は、<u> init.cpp </ u>でShutdown()を呼び出します。 |
シャットダウン()は、RPCサーバーをシャットダウンし、ノードを停止し、シグナルハンドラの登録を解除し、プログラムが完了します。 | シャットダウン()は、RPCサーバーをシャットダウンし、ノードを停止し、シグナルハンドラの登録を解除し、プログラムが完了します。 | ||
102行目: | 102行目: | ||
==キャッシュサイズ== | ==キャッシュサイズ== | ||
− | ステップ7は、キャッシュサイズを初期化した。手順7で考えられる3つのキャッシュがあります.2つはLevelDBデータベースキャッシュであり、もう1つはコインキャッシュであり、そのサイズは<u> main.cpp </u>のフラッシュコードによって管理されます。 | + | ステップ7は、キャッシュサイズを初期化した。手順7で考えられる3つのキャッシュがあります.2つはLevelDBデータベースキャッシュであり、もう1つはコインキャッシュであり、そのサイズは<u> main.cpp </ u>のフラッシュコードによって管理されます。 |
ユーザーは、-dbcacheを使用して合計キャッシュ・サイズを割り当てることができます。ユーザーは、特定の各キャッシュに割り当てるスペースを選択して選択することはできません。デフォルトの合計キャッシュサイズ= 100MB(最大:4GB、最小:4MB)。 | ユーザーは、-dbcacheを使用して合計キャッシュ・サイズを割り当てることができます。ユーザーは、特定の各キャッシュに割り当てるスペースを選択して選択することはできません。デフォルトの合計キャッシュサイズ= 100MB(最大:4GB、最小:4MB)。 | ||
122行目: | 122行目: | ||
'' '3)UTXOインメモリキャッシュ' '' | '' '3)UTXOインメモリキャッシュ' '' | ||
− | これは<u> main.cpp </u>コードで管理されるコインキャッシュです。 (FlushStateToDiskおよび関連する関数を参照) | + | これは<u> main.cpp </ u>コードで管理されるコインキャッシュです。 (FlushStateToDiskおよび関連する関数を参照) |
− | 変数(nCoinsCache)は、<u> main.h </u>のexternとして宣言されています。 <u> main.cpp </u>には、5000 * 300にハードコードされています(メモリ内コインは約300バイトなので5000コインを意味します)。しかし、ステップ7で再初期化する必要があります。 | + | 変数(nCoinsCache)は、<u> main.h </ u>のexternとして宣言されています。 <u> main.cpp </ u>には、5000 * 300にハードコードされています(メモリ内コインは約300バイトなので5000コインを意味します)。しかし、ステップ7で再初期化する必要があります。 |
このキャッシュには残りのキャッシュ領域がすべて与えられます。 | このキャッシュには残りのキャッシュ領域がすべて与えられます。 | ||
138行目: | 138行目: | ||
つまり、プログラムの活動の大部分がメッセージングスレッド(ThreadMessageHandler - 以下を参照)で行われるということです。 | つまり、プログラムの活動の大部分がメッセージングスレッド(ThreadMessageHandler - 以下を参照)で行われるということです。 | ||
− | ほとんどすべてのスレッドは、プログラムの起動時にスタック上に作成される単一のマスタースレッドグループの一部です(<u> bitcoind.cpp </u>を参照)。このスレッドグループはいくつかの子スレッドを生成する<u> init.cpp </u>に渡されます(いくつかのスクリプト検査スレッドを含みますが、これらはすべて別個のグループではなくマスタースレッドグループの一部です)。 | + | ほとんどすべてのスレッドは、プログラムの起動時にスタック上に作成される単一のマスタースレッドグループの一部です(<u> bitcoind.cpp </ u>を参照)。このスレッドグループはいくつかの子スレッドを生成する<u> init.cpp </ u>に渡されます(いくつかのスクリプト検査スレッドを含みますが、これらはすべて別個のグループではなくマスタースレッドグループの一部です)。 |
− | スレッドグループは<u> net.cpp </u>に渡され、メッセージ処理スレッドを含むネットワーキングスレッドが作成されます。 | + | スレッドグループは<u> net.cpp </ u>に渡され、メッセージ処理スレッドを含むネットワーキングスレッドが作成されます。 |
2つの他のスレッドグループはタスク固有です。 | 2つの他のスレッドグループはタスク固有です。 | ||
− | * rpcサーバースレッドグループ(<r> rpcserver.h / cpp </u>を参照) | + | * rpcサーバースレッドグループ(<r> rpcserver.h / cpp </ u>を参照) |
* minerスレッドグループ | * minerスレッドグループ | ||
150行目: | 150行目: | ||
'' '子スレッド' '' | '' '子スレッド' '' | ||
− | 親スレッド(プログラムが動作を開始するスレッドを意味する)は、ほとんどすべてのプログラムの作業を子スレッドに委譲します。 <u> init.cpp </u>と<u> net.cpp </u>でスレッドを生成した後、親スレッドは単にシャットダウンコマンドを待ちます。スレッドグループを開き、シャットダウンを続行します。 | + | 親スレッド(プログラムが動作を開始するスレッドを意味する)は、ほとんどすべてのプログラムの作業を子スレッドに委譲します。 <u> init.cpp </ u>と<u> net.cpp </ u>でスレッドを生成した後、親スレッドは単にシャットダウンコマンドを待ちます。スレッドグループを開き、シャットダウンを続行します。 |
子スレッドは、作成された順にリストされています。 | 子スレッドは、作成された順にリストされています。 | ||
156行目: | 156行目: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! | + | ! Thread !! When / Where Created !! Description |
|- | |- | ||
− | | | + | | Script-checking || Step 4<br>init.cpp || This is a set of threads - 4 by default.<br>Script-checking (including signature checking) is expensive so is handled in separate threads. |
|- | |- | ||
− | | | + | | Scheduler || Step 4<br>init.cpp || Scheduler thread.<br> (TODO: describe) |
|- | |- | ||
− | | | + | | RPC Threads || Step 4<br>rpcserver.cpp || If RPC server enabled, start a group of threads to handle RPC calls. |
|- | |- | ||
− | | | + | | Import || Step 10<br>init.cpp || Imports blocks. Three scenarios:<br>1) Reindex (rescan all known blocks from blk???.dat files).<br>2) Bootstrap (use bootstrap.dat as an alternative to full IBD from the network.)<br>3) -loadblock (scan a specific blk???.dat file)<br>If none of those apply, this thread does nothing. |
|- | |- | ||
− | | | + | | DNSAddressSeed || Step 11<br>net.cpp || Attempts to build a vector of IP addresses based on the dns seeds, stores the vector and the thread exits.<br>In a test in June 2014, this took about 4 seconds and found 158 addresses. |
|- | |- | ||
− | | | + | | Plug & Play || Step 11<br>net.cpp || UPNP (Universal Plug & Play) <br>Deals with port mapping for UPNP. |
|- | |- | ||
− | | SocketHandler || | + | | SocketHandler || Step 11<br>net.cpp || <u>This thread services the sockets:</u><br>Waits for I/O on all the relevant sockets with a 50ms timeout.<br>Processes new incoming connections on listening socket and creates a CNode for the new peer.<br>Receives and sends data streams.<br>Sets sockets that have not done anything to a disconnected state. |
|- | |- | ||
− | | OpenAddedConnections || | + | | OpenAddedConnections || Step 11<br>net.cpp || Initiates outbound connections specified by the user with the –addnode parameter.<br>If can't connect, sleeps for 2 minutes each cycle. |
|- | |- | ||
− | | OpenConnections || | + | | OpenConnections || Step 11<br>net.cpp || Initiates other outbound connections from DNS seeds (if that fails, find nodes based on fixed seeds)<br>If can't connect, sleeps for 500 milliseconds each cycle. |
|- | |- | ||
− | | MessageHandler || | + | | MessageHandler || Step 11<br>net.cpp || <u>This is the program's main thread.</u> <br> This thread runs a while(true) loop, receiving and sending messages. (See <u>net.cpp</u>:1049) <br>The code uses boost::signals2 to call the ProcessMessages and SendMessages functions in main.cpp.<br>(The code introducing signals is in PR 2154 - see the next-to-last commit in that pull.)<br>ProcessMessage and SendMessage run in this thread.<br>So, most of the code in <u>main.cpp</u> runs in this thread. |
|- | |- | ||
− | | | + | | Wallet Flusher || Step 12<br>init.cpp || If wallet is enabled, this thread flushes the wallet periodically. |
|} | |} | ||