<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SSCLI中GC垃圾回收源碼分析(2) - GarbageCollect()與Spin Lock

      繼續接著上篇的分析,

      F11從Fcall中跳出來,就到了sscli20\clr\src\vm\gcsmp.cpp中關于Garbage Collect的最外部的方法GCHeap::GarbageCollect:

      HRESULT
      GCHeap::GarbageCollect (int generation, BOOL collect_classes_p)
      {
      
          UINT GenerationAtEntry = GcCount;
          //This loop is necessary for concurrent GC because
          //during concurrent GC we get in and out of
          //GarbageCollectGeneration without doing an independent GC
          do
          {
              enter_spin_lock (&gc_heap::more_space_lock);
      
              COUNTER_ONLY(GetPrivatePerfCounters().m_GC.cInducedGCs ++);
      
              int gen = (generation < 0) ? max_generation :
                  min (generation, max_generation);
              GarbageCollectGeneration (gen, collect_classes_p);
      
              leave_spin_lock (&gc_heap::more_space_lock);
      
          }
          while (GenerationAtEntry == GcCount);
          return S_OK;
      }

      這里使用一個do-While循環的主要目的,是由于在并發GC的時候,需要在不同的時間進進出出地調用GarbageCollectGeneration方法。而在一個非并發獨立的GC中,則不需要這種循環。

      在enter_spin_lock和leave_spin_lock成對使用,這兩句的主要功能,就是訪問位于sscli20\clr\src\vm\gcsmppriv.h的GC Heap中定義的一個Spin Lock:

      GCSpinLock more_space_lock; //lock while allocating more space

      more_space_lock主要在以下三種情況下使用:

      1. 線程希望增加CPU分給這個線程的使用時間的時候。
      2. 線程在需要分配一大塊內存區域的時候。
      3. GarbageCollect在實現的時候,實際調用的是GarbageCollectGeneration方法,使用more_space_lock來阻止GarbageCollect之后程序直接調用GarbageCollectGeneration方法進行GC。

      關于Spinlock的讀寫在SSCLI中的實現,可以在sscli20\clr\src\vm\gcsmp.cpp中找到:

      inline
      static void enter_spin_lock (LONG volatile * lock)
      {
      retry:
      
          if (FastInterlockExchange (lock, 0) >= 0)
          {
              unsigned int i = 0;
              while (*lock >= 0)
              {
                  if (++i & 7)
                      __SwitchToThread (0);
                  else
                  {
                      WaitLonger(i);
                  }
              }
              goto retry;
          }
      }

      這里, FastInterlockExchange是比較有意思的。Spinlock的實現,是一個thread對一個flag標志位通過死循環來不停的查詢,直到這個Flag可用為止。出于效率和安全性的多方面因素的考慮,因為一個object是否可以使用,是在object的synblock里面有一個bit位來標識spinlock的,因此這個地方的FastInterlockExchange的實現,是直接使用匯編代碼來高效的實現,可以在sscli20\clr\src\vm\i386\asmhelpers.asm文件中找到:

      FASTCALL_FUNC ExchangeMP,8
              _ASSERT_ALIGNED_4_X86 ecx
              mov     eax, [ecx]      ; attempted comparand
      retryMP:
        lock  cmpxchg [ecx], edx
              jne     retry1MP        ; predicted NOT taken
              retn
      retry1MP:
              jmp     retryMP
      FASTCALL_ENDFUNC ExchangeMP

      對Spinlock的訪問就使用上面的代碼來一直讀,讀到相等就執行retn來退出,否則一直重復執行 cmpxchg指令來進行比較。

      在得到lock之后,就到了GC的主要實現部分,位于sscli20\clr\src\vm\gcsmp.cpp中的GCHeap::GarbageCollectGeneration (unsigned int gen, BOOL collect_classes_p)。

      posted on 2009-09-14 18:31  lbq1221119  閱讀(2484)  評論(2)    收藏  舉報

      導航

      主站蜘蛛池模板: 免费无码AV一区二区波多野结衣 | 成人午夜免费无码视频在线观看| 一区二区三区四区黄色网| 亚洲国产一区二区三区| 日韩a∨精品日韩在线观看| 奇米777四色在线精品| 无码国产偷倩在线播放| 深夜福利资源在线观看| 国产成人午夜福利院| 人人爽天天碰天天躁夜夜躁| 欧美国产精品不卡在线观看| 中文字幕无码不卡在线| 亚洲最大av资源站无码av网址| 国产精品一区二区三区四| 华安县| 人妻中文字幕精品系列| 国产揄拍国产精品| 一区二区三区精品视频免费播放| 国产边打电话边被躁视频| 亚洲国产成人av在线观看| 国产成人AV男人的天堂| 欧美性猛交xxxx乱大交丰满| 无套内内射视频网站| 在线天堂中文新版www| 亚洲乱亚洲乱妇50p| 亚洲中少妇久久中文字幕| 日韩有码中文在线观看| 亚洲国产精品综合久久20| 在线无码午夜福利高潮视频| 一区二区三区精品偷拍| 狠狠v日韩v欧美v| 无码人妻精品一区二区三区免费| 丁香婷婷色综合激情五月| 老熟妇乱子交视频一区| 日韩在线成年视频人网站观看| 国产欧美另类精品久久久| 色av永久无码影院av| 人妻中文字幕精品一页| 国产精品一二二区视在线 | 亚洲国产精品无码久久久| 国产午夜精品亚洲精品国产 |