Up Top

同期排他処理 : biased locking の revoke/rebias 処理


Under Construction

概要(Summary)

(#Under Construction)

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

BiasedLocking::revoke_and_rebias() の処理

-> BiasedLocking::revoke_and_rebias()
   -> (1) 対象のオブジェクトに応じて以下の処理を行う. 上手くいった場合はここでリターン.
          
          * 「対象のオブジェクトが anonymously biased な状態であり, 引数で rebias はしないと指定された」場合は, 
            mark フィールドを CAS で非 biased locking なパターンに置き換える.
            CAS が成功したらここでリターン.

          * 「対象のオブジェクトの mark フィールドは biased pattern をしているが,
            そのクラス自体が bulk revoke されてしまっている」場合は, 
            mark フィールドを CAS で非 biased locking なパターンに置き換える.
            CAS が成功しても失敗してもここでリターン.

          * 「対象のオブジェクトの mark フィールドは biased pattern をしているが,
            bulk rebias によって epoch がずれてしまっている」場合は,
            CAS で自分に biased させる, または CAS で revoke する.
            CAS が成功すれば, ここでリターン.

      (2) 上記のどれでもない場合, あるいは上記のケースに当てはまったが CAS が失敗した場合は, 
          どうすべきかを決めるために heuristics を update する.

          -> update_heuristics()

      (3) heirustics 結果に応じて以下のように処理を行う
          
          * heuristics の結果が HR_NOT_BIASED であれば, ここでリターン.
          * heuristics の結果が HR_SINGLE_REVOKE であれば, 対象のオブジェクトを revoke させる.
            (なお, 自分以外に biased されている場合は safepoint 停止が必要)

            * 自分に biased されている場合:
              -> revoke_bias()
                 -> get_or_compute_monitor_info()
                    -> JavaThread::cached_monitor_info()
                    -> JavaThread::set_cached_monitor_info()
                 -> oopDesc::set_mark()

            * 自分以外に biased されている場合:
              -> VM_RevokeBias::VM_RevokeBias(Handle* obj, JavaThread* requesting_thread)
              -> VMThread::execute()
                 -> (See: here for details)
                    -> VM_RevokeBias::doit()
                       -> revoke_bias()
                          -> (同上)
                       -> clean_up_cached_monitor_info()

          * heuristics の結果が HR_BULK_REVOKE か HR_BULK_REBIAS であれば, bulk revoke/rebias を起こす.
            
            -> VMThread::execute()
               -> (See: here for details)
                  -> VM_BulkRevokeBias::doit()
                     -> bulk_revoke_or_rebias_at_safepoint()
                        -> bulk rebias か bulk revoke かに応じて処理を行う
                           * bulk rebias 処理の場合:
                             -> Klass::set_prototype_header()
                             -> get_or_compute_monitor_info()
                             -> oopDesc::set_mark()
                             -> revoke_bias()
                                -> (同上)
                           * bulk revoke 処理の場合:
                             -> Klass::set_prototype_header()
                             -> get_or_compute_monitor_info()
                             -> revoke_bias()
                                -> (同上)
                     -> clean_up_cached_monitor_info()

BiasedLocking::revoke() の処理

-> BiasedLocking::revoke()
   -> VM_RevokeBias::VM_RevokeBias(GrowableArray<Handle>* objs, JavaThread* requesting_thread)
   -> VMThread::execute()
      -> (See: here for details)
         -> VM_RevokeBias::doit()
            -> BiasedLocking::revoke_at_safepoint(GrowableArray<Handle>* objs)
               -> (後述)

BiasedLocking::revoke_at_safepoint(Handle obj) の処理

-> BiasedLocking::revoke_at_safepoint(Handle obj)
   -> (1) heuristic を計算する
          -> update_heuristics()
  
      (1) heuristic の結果に応じて以下のどちらかを呼び出す.
          * bulk_rebias や bulk_revoke の必要はない場合:
            -> revoke_bias()
               -> (上述)
          * bulk_rebias または bulk_revoke の必要がある場合:
            -> bulk_revoke_or_rebias_at_safepoint()
               -> (上述)
            
      (1) キャッシュしていた「使用中のロック情報」を消去する.
          -> clean_up_cached_monitor_info()

BiasedLocking::revoke_at_safepoint(GrowableArray<Handle>* objs) の処理

-> BiasedLocking::revoke_at_safepoint(GrowableArray<Handle>* objs)
   -> (1) heuristic を計算する
          -> update_heuristics()
  
      (1) heuristic の結果に応じて以下のどちらかを呼び出す.
          * bulk_rebias や bulk_revoke の必要はない場合:
            -> revoke_bias()
               -> (上述)
          * bulk_rebias または bulk_revoke の必要がある場合:
            -> bulk_revoke_or_rebias_at_safepoint()
               -> (上述)
  
      (1) キャッシュしていた「使用中のロック情報」を消去する.
          -> clean_up_cached_monitor_info()

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

BiasedLocking::revoke_and_rebias()

See: here for details

update_heuristics()

See: here for details

revoke_bias()

See: here for details

get_or_compute_monitor_info()

See: here for details

JavaThread::cached_monitor_info()

See: here for details

JavaThread::set_cached_monitor_info()

See: here for details

VM_RevokeBias::VM_RevokeBias(Handle* obj, JavaThread* requesting_thread)

See: here for details

VM_RevokeBias::VM_RevokeBias(GrowableArray* objs, JavaThread* requesting_thread)

See: here for details

VM_RevokeBias::doit()

See: here for details

clean_up_cached_monitor_info()

See: here for details

VM_BulkRevokeBias::doit()

See: here for details

bulk_revoke_or_rebias_at_safepoint()

See: here for details

BiasedLocking::revoke()

See: here for details

BiasedLocking::revoke_at_safepoint(Handle obj)

See: here for details

BiasedLocking::revoke_at_safepoint(GrowableArray* objs)

See: here for details


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