рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдирдП рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░, рдХреБрдЫ рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдг рдзреАрдореЗ рд╣реЛ рдЧрдПред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд, рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдХрд╣реАрдВ рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╛ BIOS рдореЗрдВ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдорд╛рди рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЙрд╕реА "рдиреЙрдХ рдбрд╛рдЙрди" рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд╕рдХреЗред рдЪреВрдВрдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: 9 рдмрдирд╛рдо 19 рд╕реЗрдХрдВрдб (рдЪрд╛рд░реНрдЯ рдкрд░, рдиреАрд▓рд╛ рдкреБрд░рд╛рдирд╛ рд▓реЛрд╣рд╛ рд╣реИ рдФрд░ рдирд╛рд░рдВрдЧреА рдирдпрд╛ рд╣реИ), рдореБрдЭреЗ рдЧрд╣рд░рд╛ рдЦреЛрджрдирд╛ рдкрдбрд╝рд╛ред

рдПрдХ рд╣реА рдУрдПрд╕, рдПрдХ рд╣реА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░, рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░: 2 рдЧреБрдирд╛ рдзреАрдорд╛
9.1 рд╕реЗ 19.6 рд╕реЗрдХрдВрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ, рд╡рд┐рдВрдбреЛрдЬ рдФрд░ BIOS рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХреАред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдиреАрдЪреЗ рдирд╡реАрдирддрдо CPU рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рд╣реИ рдЬреЛ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Xeon Gold, рд╕реНрдХрд╛рдИрд▓реЗрдХ рдирд╛рдордХ рдПрдХ рдЕрд▓рдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдЬреЛ 2017 рдХреЗ рдордзреНрдп рд╕реЗ рдирдП рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрджрд┐ рдЖрдк рдирд╡реАрдирддрдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЦрд░реАрджрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ Skylake рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдорд┐рд▓реЗрдЧрд╛ред рдпреЗ рдЕрдЪреНрдЫреА рдХрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдирд╡реАрдирддрд╛ рдФрд░ рдЧрддрд┐ рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрди-рдбреАрдк рд░рд┐рд╕рд░реНрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдЗрдП рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

рд╡рд┐рдВрдбреЛрдЬ рдкрд░рдлреЙрд░рдореЗрдВрд╕ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ (WPA) рдХрд╛ рдЯреИрдм рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯреНрд░реЗрд╕ 2 (11 s) рдФрд░ рдЯреНрд░реЗрд╕ 1 (19%) рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрдВрддрд░ рдПрдХ рдзреАрдореА рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк CPU рдЦрдкрдд рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо
AwareLock :: Contention ,
JIT_MonEnterWorker_InlineGetThread_GetThread_PatchLabel рдФрд░
ThreadN.S.SWWit рджреЗрдЦреЗрдВрдЧреЗ ред рд╕рдм рдХреБрдЫ рд╕реАрдкреАрдпреВ рдореЗрдВ "рдХрддрд╛рдИ" рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ [рдХрддрд╛рдИ - рдПрдХ рддрд╛рд▓рд╛, рд▓рдЧрднрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрдХреНрд░реАрдп рдкреНрд░рдпрд╛рд╕ред рдкреНрд░рддрд┐ред], рдЬрдм рдереНрд░реЗрдбреНрд╕ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рдбрд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЧрд▓рдд рдирд┐рд╢рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдХрддрд╛рдИ рдирд╣реАрдВ рд╣реИред рддрд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдврд╝реА рд╣реБрдИ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрд╕рдиреЗ рддрд╛рд▓рд╛ рд▓рдЧрд╛ рд░рдЦрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реАрдкреАрдпреВ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред рдореИрдВрдиреЗ рд▓реЙрдХ рд╕рдордп рдФрд░ рдЕрдиреНрдп рдкреНрд░рдореБрдЦ рд╕рдВрдХреЗрддрдХ, рдЬреИрд╕реЗ рдбрд┐рд╕реНрдХ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЛ рд╕рдордЭрд╛ рд╕рдХреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реАрдкреАрдпреВ рдкрд░ рд▓реЛрдб рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯ рдЖрдпрд╛ред
рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╣рд╛рдБ рдЕрдЯрдХ рдЬрд╛рддрд╛ рд╣реИред WPA рдореЗрдВ рдлрд╝рд╛рдЗрд▓ # рдФрд░ рдкрдВрдХреНрддрд┐ # рдХреЙрд▓рдо рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ рдирд┐рдЬреА рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рд╣реИред рдЕрдЧрд▓реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ dll рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ Image RVA рдирд╛рдордХ рдирд┐рд░реНрджреЗрд╢ рд╕реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ dll рдХреЛ рдбрд┐рдмрдЧрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░рддреЗ рд╣реИрдВ
u xxx.dll+ImageRVA
рдлрд┐рд░ рд╣рдореЗрдВ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░реЛрдВ рдХреЛ рдЬрд▓рд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ "рдЧрд░реНрдо" рдкрддрд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдВрдбрдмрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкрддреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ:
0:000> u clr.dll+0x19566B-10
clr!AwareLock::Contention+0x135:
00007ff8`0535565b f00f4cc6 lock cmovl eax,esi
00007ff8`0535565f 2bf0 sub esi,eax
00007ff8`05355661 eb01 jmp clr!AwareLock::Contention+0x13f (00007ff8`05355664)
00007ff8`05355663 cc int 3
00007ff8`05355664 83e801 sub eax,1
00007ff8`05355667 7405 je clr!AwareLock::Contention+0x144 (00007ff8`0535566e)
00007ff8`05355669 f390 pause
00007ff8`0535566b ebf7 jmp clr!AwareLock::Contention+0x13f (00007ff8`05355664)
рдФрд░ рд╡рд┐рднрд┐рдиреНрди JIT рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:
0:000> u clr.dll+0x2801-10
clr!JIT_MonEnterWorker_InlineGetThread_GetThread_PatchLabel+0x124:
00007ff8`051c27f1 5e pop rsi
00007ff8`051c27f2 c3 ret
00007ff8`051c27f3 833d0679930001 cmp dword ptr [clr!g_SystemInfo+0x20 (00007ff8`05afa100)],1
00007ff8`051c27fa 7e1b jle clr!JIT_MonEnterWorker_InlineGetThread_GetThread_PatchLabel+0x14a (00007ff8`051c2817)
00007ff8`051c27fc 418bc2 mov eax,r10d
00007ff8`051c27ff f390 pause
00007ff8`051c2801 83e801 sub eax,1
00007ff8`051c2804 75f9 jne clr!JIT_MonEnterWorker_InlineGetThread_GetThread_PatchLabel+0x132 (00007ff8`051c27ff)
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧрд░реНрдо рдкрддрд╛ рдПрдХ рдЬрдореНрдк рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдШрдЯрд╛рд╡ рд╣реИред рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ рдЧрд░реНрдо рдирд┐рд░реНрджреЗрд╢ рдПрдХ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдард╣рд░рд╛рд╡ рдмрдпрд╛рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдзрд┐рдпрд╛рдБ рдПрдХ рд╣реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗрддреА рд╣реИред рдЖрдЗрдП рдард╣рд░рд╛рд╡ рдХрдерди рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рдХреЛ рдорд╛рдкреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рддрд░реНрдХ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрди рдЬрд╛рддреА рд╣реИред
рд╕реАрдкреАрдпреВ | рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ рд░реЛрдХреЗрдВ |
Xeon E5 1620v3 3.5 GHz | 4 |
Xeon┬о рдЧреЛрд▓реНрдб 6126 @ 2.60 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ | 43 |
рдирдП Skylake рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдард╣рд░рд╛рд╡ рдЕрдзрд┐рдХ рд╕рдордп рдХреЗ рд▓рд┐рдП рдмрдврд╝рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХреБрдЫ рднреА рддреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди
рджрд╕ рдЧреБрдирд╛ рдзреАрдорд╛? рдпрд╣ рдмрдЧ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реИред рдард╣рд░рд╛рд╡ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦреЛрдЬ
рдЗрдВрдЯреЗрд▓ рдХреЗ рдореИрдиреБрдЕрд▓ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдХрд╛рдИрд▓реЗрдХ рдорд╛рдЗрдХреНрд░реЛрдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдард╣рд░рд╛рд╡ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИ:

рдирд╣реАрдВ, рдпрд╣ рдХреЛрдИ рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ
рдкреЗрдЬ рднреА рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред
- рд╕реИрдВрдбреА рдкреБрд▓ 11
- рдЖрдЗрд╡реА рдмреНрд░рд╛рдЗрдбреЗрдЬ 10
- рд╣рд╕рд╡реЗрд▓ реп
- рдмреНрд░реЙрдбрд╡реЗрд▓ 9
- рд╕реНрдХрд╛рдИрд▓реЗрдХ 141
рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд╡реГрддреНрддрд┐ (рдЖрдорддреМрд░ рдкрд░ рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ) рдореЗрдВ рдЪрдХреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдиреИрдиреЛрд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдВрддрд┐рдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ .NET рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдФрд░ рдЕрдЧрд╕реНрдд 2017 рдореЗрдВ
рдПрдХ рдмрдЧ рджрд░реНрдЬ рдХрд┐рдпрд╛ ред рд╕рдорд╕реНрдпрд╛ .NET рдХреЛрд░ 2.1 рдФрд░ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.8 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдореЗрдВ
рддрдп рдХреА рдЧрдИ рдереАред
рдЗрдВрдЯреЗрд▓ рд╕реНрдХрд╛рдИрд▓реЗрдХ рдФрд░ рдмрд╛рдж рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░рд┐рдд рд╕реНрдкрд┐рди-рдкреНрд░рддреАрдХреНрд╖рд╛ред [495945, mscorlib.dll, рдмрдЧ]
рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ .NET 4.8 рдХреА рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рдореИрдВрдиреЗ рдлрд╝рд┐рдХреНрд╕реЗрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рддрд╛рдХрд┐ .NET 4.7.2 рдирдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдЧрддрд┐ рдкрд░ рд▓реМрдЯреЗред рдЪреВрдВрдХрд┐ .NET рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рддрд╛рд▓реЗ (рд╕реНрдкрд┐рдирд▓реЙрдХ) рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдереНрд░реЗрдб.рд╕реНрдкрд┐рдирд╡реЗрдЯ рдФрд░ рдЕрдиреНрдп рдХрддрд╛рдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдмрдврд╝реЗ рд╣реБрдП рд╕реАрдкреАрдпреВ рд▓реЛрдб рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Task.Result рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрддрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реАрдкреАрдпреВ рд▓реЛрдб рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡реГрджреНрдзрд┐ рдФрд░ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдХрдо рдкреНрд░рджрд░реНрд╢рди рдХреА рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВред
рдХрд┐рддрдирд╛ рдмреБрд░рд╛ рд╣реИ?
рдореИрдВрдиреЗ .NET рдХреЛрд░ рдХреЛрдб рдХреЛ рджреЗрдЦрд╛ рдХрд┐ рдХрдм рддрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдШреВрдорддрд╛ рд░рд╣реЗрдЧрд╛ рдЕрдЧрд░ "рдорд╣рдВрдЧреЗ" рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХреЗ рднреБрдЧрддрд╛рди рдХреЗ рд▓рд┐рдП WaitForSingleObject рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЙрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдереНрд░реЗрдб рдПрдХ рд╣реА рдХрд░реНрдиреЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХрд╣реАрдВ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдпрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЗрддрд╛ рд╣реИред
.NET рд▓реЙрдХ, рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдХрддрд╛рдИ рдЕрд╡рдзрд┐ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдирд┐рд░рдкреЗрдХреНрд╖ рдорд╛рдорд▓реЗ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░ рдкрд░ рдзрд╛рдЧрд╛ рдПрдХ рд╣реА рд▓реЙрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрддрд╛рдИ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред .NET рдореЗрдВ рдХрддрд╛рдИ 50-рдкреЙрдЬрд╝ рдХреЙрд▓ рдХреЗ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдШрд╛рддреАрдп рдЙрдореНрд░ рдмрдврд╝рдиреЗ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд┐рди рдХреА рд╕рдВрдЦреНрдпрд╛ рддрд┐рдЧреБрдиреА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЕрдЧрд▓реЗ рд╕реНрдкрд┐рди рдХрд╛рдЙрдВрдЯрд░ рдЙрдирдХреА рдЕрдзрд┐рдХрддрдо рдЕрд╡рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛ рдЬрд╛рдПред рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдХреЛрд░ рдХреА рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрддрд╛рдИ рдХреА рдХреБрд▓ рдЕрд╡рдзрд┐ рдХреА рдЧрдгрдирд╛ рдХреА:

рдиреАрдЪреЗ .NET рд▓реЙрдХрд┐рдВрдЧ рдореЗрдВ рд╕рд░рд▓реАрдХреГрдд рдХрддрд╛рдИ рдХреЛрдб рд╣реИ:
/// <summary> /// This is how .NET is spinning during lock contention minus the Lock taking/SwitchToThread/Sleep calls /// </summary> /// <param name="nCores"></param> void Spin(int nCores) { const int dwRepetitions = 10; const int dwInitialDuration = 0x32; const int dwBackOffFactor = 3; int dwMaximumDuration = 20 * 1000 * nCores; for (int i = 0; i < dwRepetitions; i++) { int duration = dwInitialDuration; do { for (int k = 0; k < duration; k++) { Call_PAUSE(); } duration *= dwBackOffFactor; } while (duration < dwMaximumDuration); } }
рдкрд╣рд▓реЗ, рдХрддрд╛рдИ рдХрд╛ рд╕рдордп рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдЕрдВрддрд░рд╛рд▓ (24 рдХреЛрд░ рдХреЗ рд▓рд┐рдП 19 рдПрдордПрд╕) рдореЗрдВ рдерд╛, рдЬреЛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд░реЛрдХреНрдд рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЬреЛ рдХрд┐ рддреАрд╡реНрд░рддрд╛ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рд▓реЗрдХрд┐рди рд╕реНрдХрд╛рдИрд▓реЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдХрддрд╛рдИ рд╕рдордп 246 рдПрдордПрд╕ рддрдХ 24-рдмрд┐рдЯ рдпрд╛ 48-рдХреЛрд░ рдорд╢реАрди рдкрд░ рдлрдЯ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдард╣рд░рд╛рд╡ рдирд┐рд░реНрджреЗрд╢ 14 рдмрд╛рд░ рдзреАрдорд╛ рд╣реЛ рдЧрдпрд╛ред рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реИ? рдореИрдВрдиреЗ рд╕реАрдкреАрдпреВ рдкрд░ рд╕рдордЧреНрд░ рдХрддрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдХ рд▓рд┐рдЦрд╛ рдерд╛ - рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдЙрдореНрдореАрджреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдпрд╣рд╛рдВ 24-рдХреЛрд░ рд╕реАрдкреАрдпреВ рдкрд░ 48 рдзрд╛рдЧреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд▓реЙрдХ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореЙрдиреАрдЯрд░ рдХрд╣рд╛ рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧрд╛ рджреМрдбрд╝ рдЬреАрдд рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди 47 рддрдм рддрдХ рдШреВрдорддрд╛ рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рд╡реЗ рд╣реГрджрдп рдЧрддрд┐ рдирд╣реАрдВ рдЦреЛ рджреЗрддреЗред рдпрд╣ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕рдмреВрдд рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реАрдкреАрдпреВ рд▓реЛрдб рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд▓рдВрдмреА рдХрддрд╛рдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИред рдпрд╣ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдЪрдХреНрд░ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХреЗ рдмрдЬрд╛рдп рдЪрд▓рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдард╣рд░рд╛рд╡ рдирд┐рд░реНрджреЗрд╢ рд╕реАрдкреАрдпреВ рдХреЗ рдХреБрдЫ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдиреАрдВрдж рдорд┐рд▓рддреА рд╣реИред рдХрддрд╛рдИ рдХрд╛ рдХрд╛рд░рдг рдХрд░реНрдиреЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рддреЗрдЬреА рд╕реЗ рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╕реАрдкреАрдпреВ рдкрд░ рд▓реЛрдб рдмрдврд╝рд╛рдирд╛ рдХреЗрд╡рд▓ рдирд╛рдордорд╛рддреНрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЧреБрдард▓реА рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рдЧреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдиреЗ рд▓рдЧрднрдЧ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдореА рджрд┐рдЦрд╛рдИ, рдЬрд╣рд╛рдВ рдПрдХ рдзрд╛рдЧрд╛ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рдо рдзрд╛рдЧрд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХрд╛рд░реНрдп рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдХрд╛рд░рдг рдЖрд░реЗрдЦ рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИред рдкреНрд░рддрд┐рдХреВрд▓ рд╕реНрдкрд┐рди рд╣рд░ рдЪрд░рдг рдореЗрдВ рдХрддрд╛рдИ рдХреЗ рдЯреНрд░рд┐рдкрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рджреМрд░ рдХреЗ рдмрд╛рдж, рд▓реЙрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧрд╛ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдХрддрд╛рдИ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдиреНрдп рдереНрд░реЗрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХреЗред рдЗрд╕рд╕реЗ рдЕрдЧрд▓реЗ рдЪреЗрдХ рдкрд░ рд▓реЙрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдХреЗрд╡рд▓ рдПрдХ рдкреВрд░реНрдг рд╕реНрдкрд┐рди рджреМрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдкрд╛рдВрдЪрд╡реЗрдВ рд╕реНрдкрд┐рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЙрдХ рд╕рд┐рдЧреНрдирд▓ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рд░рд╛рдЙрдВрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рджреМрд░ рдХреА рд╕реНрдкрд┐рди рдЕрд╡рдзрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдХрддрд╛рдИ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдХрдИ рдорд┐рд▓реАрд╕реЗрдХрдВрдбред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬреЛ рдЙрдкрднреЛрдХреНрддрд╛ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреА рдПрдХ рдХрддрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдЖрдЗрдЯрдо рдХреЛ 10 рдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЕрдЧрд▓реЗ рдХрд╛рд░реНрдп рдЖрдЗрдЯрдо рд╕реЗ рдкрд╣рд▓реЗ 1-9 рдПрдордПрд╕ рдХреА рджреЗрд░реА рд╣реЛрддреА рд╣реИред рдпрд╣ рдкреНрд░рднрд╛рд╡ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

рд╣рдо 1-2 ms рдХреА рджреЗрд░реА рдХреЗ рд▓рд┐рдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХреБрд▓ рдЕрд╡рдзрд┐ 2.2-2.3 s рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рддреЗрдЬреА рд╕реЗ 1.2 s рддрдХ рд╣реИред рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реАрдкреАрдпреВ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдХрддрд╛рдИ рдХреЗрд╡рд▓ рдереНрд░реЗрдбреЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд╕рд░рд▓ рд╕реВрддреНрд░рдг рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдзрд╛рдЧреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рд░рди рдХреЗ рд▓рд┐рдП, ETW рдбреЗрдЯрд╛ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ: рдпрд╣ рдХрддрд╛рдИ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реИ рдЬреЛ рдордирд╛рдпрд╛ рджреЗрд░реА рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:

рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ "рдмреНрд░реЗрдХ" рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо 11 рдПрдордПрд╕ рдХреЛ рд▓рд╛рд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрддрд╛рдИ рдХрд░рддреЗ рджреЗрдЦреЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ (рд╣рд▓реНрдХрд╛ рдиреАрд▓рд╛) рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рддрд╛рд▓рд╛ рджрд┐рдпрд╛ рд╣реИред

рдПрдХ рддреНрд╡рд░рд┐рдд рдЧреИрд░-рдЕрдкрдХреНрд╖рдпреА рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ 1 рдПрдордПрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрддрд╛рдИ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди
SkylakeXPause рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред
рдЬрд╝рд┐рдк рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ .NET рдХреЛрд░ рдФрд░ .NET 4.5 рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдмрд╛рдпрдиреЗрд░реАрдЬрд╝ рд╣реИрдВред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ .NET 4.8 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдлрд┐рдХреНрд╕ рдФрд░ .NET рдХреЛрд░ 2.0 рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЖрд╡реЗрджрди .NET рдорд╛рдирдХ 2.0 рдФрд░ .NET 4.5 рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ exe рдФрд░ dll рджреЛрдиреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЖрдк рдХреБрдЫ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдХрддрд╛рдИ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
readonly object _LockObject = new object(); int WorkItems; int CompletedWorkItems; Barrier SyncPoint; void RunSlowTest() { const int processingTimeinMs = 10; const int WorkItemsToSend = 100; Console.WriteLine($"Worker thread works {processingTimeinMs} ms for {WorkItemsToSend} times"); // Test one sender one receiver thread with different timings when the sender wakes up again // to send the next work item // synchronize worker and sender. Ensure that worker starts first double[] sendDelayTimes = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; foreach (var sendDelay in sendDelayTimes) { SyncPoint = new Barrier(2); // one sender one receiver var sw = Stopwatch.StartNew(); Parallel.Invoke(() => Sender(workItems: WorkItemsToSend, delayInMs: sendDelay), () => Worker(maxWorkItemsToWork: WorkItemsToSend, workItemProcessTimeInMs: processingTimeinMs)); sw.Stop(); Console.WriteLine($"Send Delay: {sendDelay:F1} ms Work completed in {sw.Elapsed.TotalSeconds:F3} s"); Thread.Sleep(100); // show some gap in ETW data so we can differentiate the test runs } } /// <summary> /// Simulate a worker thread which consumes CPU which is triggered by the Sender thread /// </summary> void Worker(int maxWorkItemsToWork, double workItemProcessTimeInMs) { SyncPoint.SignalAndWait(); while (CompletedWorkItems != maxWorkItemsToWork) { lock (_LockObject) { if (WorkItems == 0) { Monitor.Wait(_LockObject); // wait for work } for (int i = 0; i < WorkItems; i++) { CompletedWorkItems++; SimulateWork(workItemProcessTimeInMs); // consume CPU under this lock } WorkItems = 0; } } } /// <summary> /// Insert work for the Worker thread under a lock and wake up the worker thread n times /// </summary> void Sender(int workItems, double delayInMs) { CompletedWorkItems = 0; // delete previous work SyncPoint.SignalAndWait(); for (int i = 0; i < workItems; i++) { lock (_LockObject) { WorkItems++; Monitor.PulseAll(_LockObject); } SimulateWork(delayInMs); } }
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдПрдХ .NET рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдард╣рд░рд╛рд╡ рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕реНрдкрд┐рдирд▓реЙрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2016 рдХреЗ рдХреЛрд░ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рд╕рддрд╣ рдкрд░ рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯреЗрд▓ рдХрд╛рдлреА рджрдпрд╛рд▓реБ рдерд╛ - рдФрд░ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХрддрд╛рдИ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
.NET рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдЕрдЧрд╕реНрдд 2017 рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рд┐рддрдВрдмрд░ 2017 рдореЗрдВ .NET рдХреЛрд░ 2.0.3 рдХрд╛
рдПрдХ рдкреИрдЪ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓рд┐рдВрдХ рди рдХреЗрд╡рд▓ .NET рдХреЛрд░ рд╕рдореВрд╣ рдХреА рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рддрдереНрдп рд╣реИ рдХрд┐ рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рддрдп рдХреА рдЧрдИ рдереА, рд╕рд╛рде рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрддрд╛рдИ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрд╕реНрдХрдЯреЙрдк .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрддрдиреА рддреЗрдЬреА рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4.8 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рдЪреЗрд╣рд░реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рд╡реИрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдг рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдлрд┐рдХреНрд╕ рднреА рд▓рд╛рдЧреВ рд╣реИрдВред рдЕрдм рдореИрдВ .NET рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред .NET 4.7.2 рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдЧрддрд┐ рд╕реЗ рдФрд░ рдЕрдВрддрд┐рдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ .NET рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдкрд╣рд▓рд╛ рдмрдЧ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реАрдкреАрдпреВ рдЕрдиреБрджреЗрд╢ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред ETW рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдореБрдЦреНрдп рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд░рд╣рддрд╛ рд╣реИред рдпрджрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛, рддреЛ рдореИрдВ Microsoft рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ ETW рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рд▓рд┐рдирдХреНрд╕ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░реНрд╕ рдЕрднреА рднреА рдмрдХрд╡рд╛рд╕ рд╣реИрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛрдбрд╝реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдбрдмреНрд▓реНрдпреВрдкреАрдП рдЬреИрд╕реЗ рдХреЛрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред
рдпрджрд┐ рдЖрдк .NET рдХреЛрд░ 2.0 рдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ 2017 рдХреЗ рдордзреНрдп рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдирд╡реАрдирддрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд╣реИ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдПрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд╕реЗ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП - рдФрд░ .NET рдХреЛрд░ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ рдФрд░, рдЙрдореНрдореАрдж рд╣реИ, рдЬрд▓реНрдж рд╣реА .NET рдбреЗрд╕реНрдХрдЯреЙрдк рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ред
D:\SkylakeXPause\bin\Release\netcoreapp2.0>dotnet SkylakeXPause.dll -check
Did call pause 1,000,000 in 3.5990 ms, Processors: 8
No SkylakeX problem detected
рдпрд╛
D:\SkylakeXPause\SkylakeXPause\bin\Release\net45>SkylakeXPause.exe -check
Did call pause 1,000,000 in 3.6195 ms, Processors: 8
No SkylakeX problem detected
рдпрджрд┐ рдЖрдк .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдЙрдЪрд┐рдд рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рд╕реНрдХрд╛рдИрд▓реЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдкрдХрд░рдг рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЙрддрдирд╛ рд░реЛрдорд╛рдВрдЪрдХ рдкрд╛рдпрд╛ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдХрд╛рд░рдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХреЗрдВред рдмрд╛рдХреА рдХрд╛рдо рд╕рд┐рд░реНрдл рдЙрдмрд╛рдК рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рд╕реАрдкреАрдпреВ рдкрд░ рддрд╛рд▓рд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдЪрдХреНрд░реАрдп рдкреНрд░рдпрд╛рд╕ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реВрдВред