Up Top

同期排他処理 : ロック確保処理 : slow-path の処理 (2)


概要(Summary)

fast-path や slow-path 1 が失敗した場合, どの処理パスも最終的には ObjectSynchronizer::slow_enter() または ObjectSynchronizer::fast_enter() に到達する.

この ObjectSynchronizer::slow_enter()/ObjectSynchronizer::fast_enter() の処理は, インタープリタ種別/JIT 種別/CPU 等によらず共通.

なお, 実際の slow-path の処理は ObjectSynchronizer::slow_enter() の方に実装されている. ObjectSynchronizer::fast_enter() は, Biased Locking 機能を使用している場合に条件を変えてもう一度 fast-path 処理を試みるための関数で (See: here for details), 失敗した場合は ObjectSynchronizer::slow_enter() にフォールバックする.

備考(Notes)

この処理中で使われる ObjectMonitor::TrySpin_VaryDuration() が "Adaptive Spinning" 機能を実装した関数 (See: here for details).

なお, 実際の使用箇所では "TrySpin()" という名称で使用されている.

    ((cite: hotspot/src/share/vm/runtime/objectMonitor.cpp))
    #define TrySpin TrySpin_VaryDuration

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

ObjectSynchronizer::slow_enter() の処理パス

-> ObjectSynchronizer::slow_enter()
   -> ObjectSynchronizer::inflate()
      -> ReadStableMark()
      -> ObjectSynchronizer::omAlloc()
   -> ObjectMonitor::enter()
      -> ObjectMonitor::TrySpin_VaryDuration()
         -> ObjectMonitor::TryLock()
         -> SpinPause()
      -> ObjectMonitor::EnterI()
         -> ObjectMonitor::TryLock()
         -> DeferredInitialize()
         -> ObjectMonitor::TrySpin_VaryDuration()
            -> (同上)
         -> os::PlatformEvent::park()  or  os::PlatformEvent::park(jlong millis)
            -> (See: here for details)
         -> ObjectMonitor::UnlinkAfterAcquire()
      -> ObjectMonitor::ExitSuspendEquivalent()

ObjectSynchronizer::fast_enter() の処理パス

-> ObjectSynchronizer::fast_enter()
   -> (1) UseBiasedLocking オプションが指定されている場合は, safepoint かどうかに応じてどちらかを実行.
          (UseBiasedLocking オプションが指定されていなければ, 何もしない)
          * safepoint 中ではない場合: (自分への rebias を試みる. 成功すればここでリターン)
            -> BiasedLocking::revoke_and_rebias()
               -> (See: here for details)
          * safepoint 中の場合: (VM thread に rebias しても意味がないので revoke だけしておく)
            -> BiasedLocking::revoke_at_safepoint()
               -> (See: here for details)

      (2) slow-path にフォールバックする
          -> ObjectSynchronizer::slow_enter()
             -> (同上)

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

ObjectSynchronizer::slow_enter()

See: here for details

ObjectSynchronizer::inflate()

See: here for details

ReadStableMark()

(#Under Construction)

ObjectSynchronizer::omAlloc()

(#Under Construction)

ObjectSynchronizer::omRelease()

(#Under Construction)

ObjectMonitor::set_header()

See: here for details

ObjectMonitor::set_owner()

See: here for details

ObjectMonitor::set_object()

See: here for details

oopDesc::release_set_mark()

See: here for details

ObjectMonitor::enter()

See: here for details

ObjectMonitor::TrySpin_VaryDuration()

See: here for details

ObjectMonitor::TryLock()

See: here for details

SpinPause() (Linux x86-32 の場合)

See: here for details

SpinPause() (Linux x86-64 の場合)

See: here for details

SpinPause() (Linux Sparc の場合)

(#Under Construction)

SpinPause() (Linux zero の場合)

See: here for details

SpinPause() (Solaris Sparc の場合)

See: here for details

SpinPause() (Solaris x86 の場合)

(#Under Construction)

SpinPause() (Windows x86 の場合)

See: here for details

NotRunnable()

(#Under Construction)

Adjust()

See: here for details

ObjectMonitor::EnterI()

See: here for details

DeferredInitialize()

See: here for details

kvGetInt()

(#Under Construction)

ObjectMonitor::UnlinkAfterAcquire()

See: here for details

ObjectSynchronizer::fast_enter()

See: here for details


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