Up Top

Thread の開始処理の枠組み : 生成されたスレッド側での動き : Linux の場合


概要(Summary)

生成されたスレッド側の処理の流れは以下のようになる.

  1. 実行が開始されると java_start() 関数から処理が始まる.

  2. java_start() からは最終的に Thread::run() が呼び出される.

(なお, java_start() は各 OS 毎に実装されている. ただし, どの場合でも最終的には Thread::run() に行き着く)

  1. この Thread::run() は virtual function であり, 実際には Thread の各サブクラスでオーバーライドされた run() メソッドが実行される.

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

java_start()
-> (1) TLS の設定
       -> ThreadLocalStorage::set_thread()

   (1) スレッドの作成に失敗した場合は, ここで OSThread::startThread_lock() に対して Monitor::notify_all() して終了.
       (生成したスレッドと同期を取る処理)

   (1) NUMA 関係の設定
       -> os::numa_get_group_id()
       -> Thread::set_lgrp_id()

   (1) シグナルマスクの設定
       -> os::Linux::hotspot_sigmask()
          -> (See: here for details)

   (1) FPU 関係の初期化
       -> os::Linux::init_thread_fpu_state()

   (1) 生成元のスレッドと同期を取る
       -> Monitor::notify_all()
          (OSThread::startThread_lock() に対して notify_all())
       -> Monitor::wait()
          (OSThread::startThread_lock() に対して wait)

   (1) 実際にこのスレッドのメイン処理を実行
       -> Thread::run()
          -> (Thread の各サブクラスでオーバーライドされた run() メソッドが呼び出される)

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

java_start() (Linux の場合)

See: here for details

ThreadLocalStorage::set_thread()

See: here for details

ThreadLocalStorage::pd_set_thread() (Linux x86 の場合)

See: here for details

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

See: here for details

os::Linux::gettid()

See: here for details

OSThread::set_thread_id()

See: here for details

thread_safetycheck()

See: here for details

os::Linux::is_LinuxThreads()

(#Under Construction)

os::Linux::is_floating_stack()

See: here for details

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

See: here for details

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

(#Under Construction)

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

(#Under Construction)

current_stack_region() (Linux x86 の場合)

See: here for details

current_stack_region() (Linux sparc の場合)

(#Under Construction)

current_stack_region() (Linux zero の場合)

(#Under Construction)

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

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

(#Under Construction)

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

(#Under Construction)

highest_vm_reserved_address()

(#Under Construction)

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

(#Under Construction)

Thread::set_lgrp_id()

See: here for details

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

See: here for details

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

See: here for details

os::Linux::init_thread_fpu_state() (sparc の場合)

See: here for details


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