Up Top

生成された java.lang.Thread (= JavaThread) 側での処理 (2) : スレッドの起動処理(JavaThread 独自の部分)


概要(Summary)

スレッドの起動処理により Thread::run() が呼び出される (See: here for details). JavaThread は Thread::run() をオーバーライドしているので, 実際に呼び出されるのは JavaThraed::run() になる.

JavaThread::run() からは, 最終的に JavaThread オブジェクト生成時に指定された thread_entry() 関数が呼び出される. この thread_entry() 内でメインの処理を行う java.lang.Thread.run() が呼び出される.

処理の流れ (概要)(Execution Flows : Summary)

-> JavaThread::run()
   -> (1) TLAB(ThreadLocalAllocBuffer) の初期化を行う.
          -> JavaThread::initialize_tlab()
             -> ThreadLocalAllocBuffer::initialize()

      (1) スタック領域関連のフィールドを初期化する.
          -> JavaThread::record_base_of_stack_pointer()

      (1) スタック領域関連のフィールドを初期化する.
          -> Thread::record_stack_base_and_size()

      (1) 現在実行中のネイティブスレッドに, この JavaThread オブジェクトを対応付ける.
          -> Thread::initialize_thread_local_storage()

      (1) カレントスレッドのスタック上に guard page を設定.
          -> JavaThread::create_stack_guard_pages()

      (1) プラットフォーム固有のフィールドを(もしそんなものがあれば)初期化.
          -> JavaThread::cache_global_variables()

      (1) カレントスレッドの JavaThreadState を _thread_new から _thread_in_vm に変更.
          -> ThreadStateTransition::transition_and_fence()

      (1) カレントスレッドの JNI ローカル参照フレームを作成.
          -> JNIHandleBlock::allocate_block()
          -> Thread::set_active_handles()

      (1) カレントスレッドのメイン処理(及びメイン処理終了後の後片付け処理)を行う.
          -> JavaThread::thread_main_inner()
             -> (1) カレントスレッドのメイン処理を実行する
                    -> JavaThread::entry_point()()
                       (JavaThread::entry_point() が thread_entry へのポインタを返し, それが呼び出される)
                        これにより, コンストラクタ引数で渡されていた thread_entry() が呼び出される.
                    -> thread_entry()
                       -> JavaCalls::call_virtual()
                          -> (See: here for details)
                             -> java.lang.Thread.run()
                                (ここで実際の処理が行われる.
                                 Thread のサブクラスを作った場合は, そちらでオーバライドした run() メソッドが呼ばれる.
                                 そうでなければ, java.lang.Thread.run() の中で,
                                 登録した Runnable オブジェクトの run() メソッドが呼ばれる)

                (1) メイン処理終了後の後片付けを行う
                    -> JavaThread::exit()
                       -> (See: here for details)

処理の流れ (詳細)(Execution Flows : Details)

JavaThread::run()

See: here for details

JavaThread::initialize_tlab()

See: here for details

ThreadLocalAllocBuffer::initialize()

See: here for details

ThreadLocalAllocBuffer::initialize(HeapWord* start, HeapWord* top, HeapWord* end)

See: here for details

ThreadLocalAllocBuffer::invariants()

See: here for details

JavaThread::record_base_of_stack_pointer() (Linux x86 の場合)

See: here for details

JavaThread::record_base_of_stack_pointer() (Linux sparc の場合)

(#Under Construction)

JavaThread::record_base_of_stack_pointer() (Linux zero の場合)

(#Under Construction)

JavaThread::record_base_of_stack_pointer() (Solaris sparc の場合)

(#Under Construction)

JavaThread::record_base_of_stack_pointer() (Solaris x86 の場合)

(#Under Construction)

JavaThread::record_base_of_stack_pointer() (Windows x86 の場合)

(#Under Construction)

Thread::record_stack_base_and_size()

See: here for details

os::current_stack_base() (Linux x86 の場合)

See: here for details

current_stack_region() (Linux x86 の場合)

See: here for details

os::Linux::is_initial_thread()

See: here for details

os::Linux::initial_thread_stack_bottom()

See: here for details

os::Linux::initial_thread_stack_size()

See: here for details

os::current_stack_size() (Linux x86 の場合)

See: here for details

Thread::initialize_thread_local_storage()

See: here for details

ThreadLocalStorage::set_thread()

See: here for details

JavaThread::create_stack_guard_pages()

See: here for details

os::uses_stack_guard_pages() (Linux の場合)

See: here for details

os::uses_stack_guard_pages() (Solaris の場合)

See: here for details

os::uses_stack_guard_pages() (Windows の場合)

See: here for details

os::allocate_stack_guard_pages() (Linux の場合)

See: here for details

os::allocate_stack_guard_pages() (Solaris の場合)

See: here for details

os::allocate_stack_guard_pages() (Windows の場合)

See: here for details

os::create_stack_guard_pages() (Linux の場合)

See: here for details

os::create_stack_guard_pages() (Solaris の場合)

See: here for details

os::create_stack_guard_pages() (Windows の場合)

See: here for details

os::guard_memory() (Linux の場合)

See: here for details

linux_mprotect()

See: here for details

os::guard_memory() (Solaris の場合)

See: here for details

solaris_mprotect()

See: here for details

os::guard_memory() (Windows の場合)

See: here for details

JavaThread::cache_global_variables() (Linux x86 の場合)

See: here for details

JavaThread::cache_global_variables() (Linux sparc の場合)

(#Under Construction)

JavaThread::cache_global_variables() (Linux zero の場合)

(#Under Construction)

JavaThread::cache_global_variables() (Solaris sparc の場合)

(#Under Construction)

JavaThread::cache_global_variables() (Solaris x86 の場合)

(#Under Construction)

JavaThread::cache_global_variables() (Windows x86 の場合)

(#Under Construction)

ThreadStateTransition::transition_and_fence()

See: here for details

JNIHandleBlock::allocate_block()

See: here for details

Thread::set_active_handles()

See: here for details

JvmtiExport::post_thread_start()

(#Under Construction)

JavaThread::thread_main_inner()

See: here for details

JavaThread::entry_point()

See: here for details

thread_entry()

See: here for details

java.lang.Thread.run()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.