рдЖрдкрдХрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдореЛрд░реА рд╣рд░ 7.8 ╬╝s рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ


рдЖрдзреБрдирд┐рдХ DDR3 SDRAMред рд╕реНрд░реЛрдд: BY-SA / 4.0 Kjerish рджреНрд╡рд╛рд░рд╛

рдорд╛рдЙрдВрдЯреЗрди рд╡реНрдпреВ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдЗрддрд┐рд╣рд╛рд╕ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рдпрд╛рддреНрд░рд╛ рдкрд░, рдлреЗрд░рд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХреЗ рдПрдХ рдкреНрд░рд╛рдЪреАрди рдЙрджрд╛рд╣рд░рдг рдиреЗ рдореЗрд░рд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ред


рд╕реНрд░реЛрдд: BY-SA / 3.0 рдХреЛрдВрд╕реНрдЯреЗрдВрдЯрд┐рди рд▓рд╛рдВрдЬрд╝реЗрдЯ рджреНрд╡рд╛рд░рд╛

рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдХреНрдпрд╛ рд░рд┐рдВрдЧреНрд╕ рдШреВрдорддреА рд╣реИрдВ (рдирд╣реАрдВ), рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдВрдЧ рдореЗрдВ рддреАрди рддрд╛рд░ рдХреНрдпреЛрдВ рдЬрд╛рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдХрдо рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд░реИрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!


рд╕реНрд░реЛрдд: рдЙрд▓рд░рд┐рдЪ рдбреНрд░реЗрдкрд░ рдХреА рдореЗрдореЛрд░реА рд╕рд╛рдЗрдХрд┐рд▓

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

рдЗрд╕рдиреЗ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ ... рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрддрд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдбрд╛рдпрдиреЗрдорд┐рдХ рд░реИрдо рдЕрдкрдЧреНрд░реЗрдб рдЯреНрд░реЗрдирд┐рдВрдЧ рдмреЗрд╕


рдкреНрд░рддреНрдпреЗрдХ DIMM рдореЗрдВ "рдХреЛрд╢рд┐рдХрд╛рдПрдВ" рдФрд░ "рдкрдВрдХреНрддрд┐рдпрд╛рдВ", "рдХреЙрд▓рдо", "рдкрдХреНрд╖" рдФрд░ / рдпрд╛ "рд░реИрдВрдХ" рд╣реЛрддреЗ рд╣реИрдВред рдпреВрдЯрд╛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреА рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рдирд╛рдордХрд░рдг рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреА рд╣реИред рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдореЛрд░реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ decode-dimms рд╕рд╛рде рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

  $ рдбрд┐рдХреЛрдб-рдбрд┐рдо
 рдЖрдХрд╛рд░ 4096 рдПрдордмреА
 рдмреИрдВрдХреЛрдВ x рдкрдВрдХреНрддрд┐рдпрд╛рдБ x рдХреЙрд▓рдо x 8 x 15 x 10 x 64 рдмрд┐рдЯреНрд╕
 рд░реИрдВрдХ 2 

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

рджреЛ рд╕реНрд░реЛрддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рдбрд╛рдпрдиреЗрдорд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╣рд░ 64 рдПрдордПрд╕ (рддрдерд╛рдХрдерд┐рдд рд╕реНрдЯреИрдЯрд┐рдХ рдЕрдкрдбреЗрдЯ) рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ 64 рдПрдордПрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдкрдбрд╝рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ 8192 рдЫреЛрдЯреЗ рдЕрдкрдбреЗрдЯ рдСрдкрд░реЗрд╢рди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ, рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓рд░ рдбреАрдЖрд░рдПрдПрдо рдЪрд┐рдкреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рднреЗрдЬрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЪрд┐рдк 1/8192 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ 64 рдПрдордПрд╕ / 8192 = 7812.5 рдПрдирдПрд╕ рдпрд╛ 7.81 ╬╝sред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдирд┐рдореНрди рд╣реИ:

  • рдПрдХ рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдкреНрд░рддреНрдпреЗрдХ 7812.5 рдПрдирдПрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ tREFI рдХрд╣рддреЗ рд╣реИрдВред
  • рдЕрджреНрдпрддрди рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд┐рдк рдлрд┐рд░ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд╕рдХрддреА рд╣реИред рддрдерд╛рдХрдерд┐рдд tRFC 75 ns рдпрд╛ 120 ns (рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдорд╛рдЗрдХреНрд░реЛрди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╣реИ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

рдпрджрд┐ рдореЗрдореЛрд░реА рдЧрд░реНрдо рд╣реИ (85 рдбрд┐рдЧреНрд░реА рд╕реЗрд▓реНрд╕рд┐рдпрд╕ рд╕реЗ рдЕрдзрд┐рдХ), рддреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рд╕рдордп рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреИрдЯрд┐рдХ рдЕрдкрдбреЗрдЯ рдХрд╛ рд╕рдордп 32 рдПрдордПрд╕ рддрдХ рдЖрдзрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, tREFI 3906.25 ns рдкрд░ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдореЛрд░реА рдЪрд┐рдк рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ: 0.4% рд╕реЗ 5% рддрдХред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрдореЛрд░реА рдЪрд┐рдкреНрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдкреНрдпреВрдЯрд░ рдХреА рдмрд┐рдЬрд▓реА рдХреА рдЦрдкрдд рдХреЗ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╢рдХреНрддрд┐ рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдЙрдиреНрдирдпрди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рдкреВрд░реА рдореЗрдореЛрд░реА рдЪрд┐рдк рдмреНрд▓реЙрдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣реА рд╣реИ, рдореЗрдореЛрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ 75 рдПрдирдПрд╕ рдХреЗ рд▓рд┐рдП рд╣рд░ 7812 рдПрдирдПрд╕ рдкрд░ рдмрдВрдж рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдирд╛рдкрддреЗ рд╣реИрдВред

рдкреНрд░рдпреЛрдЧ рдХреА рддреИрдпрд╛рд░реА


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

  for (i = 0; i < ...; i++) { //   . *(volatile int *) one_global_var; //   CPU.    _mm_clflush(one_global_var); //   ,     //    (25    160). // , - . asm volatile("mfence"); //     clock_gettime(CLOCK_MONOTONIC, &ts); } 

рдкреВрд░рд╛ рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдХреЛрдб рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдореЗрдореЛрд░реА рд░реАрдбрд┐рдВрдЧ рдХрд░реЗрдВред рд╣рдо рд╕реАрдкреАрдпреВ рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдбрдВрдк рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕рдордп рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред

(рдиреЛрдЯ: рджреВрд╕рд░реЗ рдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MOVNTDQA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреИрд░-рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдкреЗрдЬ рдФрд░ рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рдореНрди рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  # рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рдЪрдХреНрд░ рд╕рдордп
 3101895733, 134
 3101895865, 132
 3101896002, 137
 3101896134, 132
 3101896268, 134
 3101896403, 135
 3101896762, 359
 3101896901, 139
 3101897038, 137 

рдЖрдорддреМрд░ рдкрд░, рд▓рдЧрднрдЧ 140 рдПрдирдПрд╕ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЪрдХреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдордп-рд╕рдордп рдкрд░ рд╕рдордп рд▓рдЧрднрдЧ 360 рдПрдирдПрд╕ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо 3200 рдПрдирдПрд╕ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрдЯрд╛ рдмрд╣реБрдд рд╢реЛрд░ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдкрдбреЗрдЯ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рд╕рд╛рде рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рджреЗрд░реА рд╣реИред

рдлрд╛рд╕реНрдЯ рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо


рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдореБрдЭ рдкрд░ dawnedред рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдлрдПрдлрдЯреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рддреЗрдЬ рдлреВрд░рд┐рдпрд░ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо) рдореЗрдВ рдбреЗрдЯрд╛ рдЬрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдореБрдЦреНрдп рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВ: рдорд╛рд░реНрдХ рд╕реАрдмреЙрд░реНрди рдиреЗ рдкреНрд░рд╕рд┐рджреНрдз рднреЗрджреНрдпрддрд╛ рд░реЛрд╣рдорд░ рдХреЗ рд╕рд╛рде 2015 рдореЗрдВ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдорд╛рд░реНрдХ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рднреА, FFT рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдХрдард┐рди рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдлрдПрдлрдЯреА рдХреЛ рдПрдХ рдирд┐рд░рдВрддрд░ рдирдореВрдирд╛ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдо рд╢реЛрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЯреНрд░рд┐рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

  • рдЫреЛрдЯреЗ рдорд╛рди (1.8 рдФрд╕рдд рд╕реЗ рдХрдо) рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдЕрдиреНрдп рд╕рднреА рд░реАрдбрд┐рдВрдЧ рдХреЛ рдЗрдХрд╛рдЗрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд╢реЛрд░ рдХреЗ рдХрд╛рд░рдг рджреЗрд░реА рдХреЗ рдЖрдпрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред
  • рдореИрдВ 100 ns рдХреЗ рдирдореВрдиреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдмрд╕ рдЧрдпрд╛, рд▓реЗрдХрд┐рди Nyquist рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА (рдбрдмрд▓ рдЕрдкреЗрдХреНрд╖рд┐рдд рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА) рддрдХ рдХреЛрдИ рднреА рд╕рдВрдЦреНрдпрд╛ рдХрд░реЗрдЧрд╛ ред
  • FFT рдореЗрдВ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдирдореВрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рдЙрдЪрд┐рдд рдирдореВрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдмреБрдирд┐рдпрд╛рджреА рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдкрд░ рдмрд╕ рдЧрдпрд╛ред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

 UNIT=100ns A = [(timestamp, loop_duration),...] p = 1 for curr_ts in frange(fist_ts, last_ts, UNIT): while not(A[p-1].timestamp <= curr_ts < A[p].timestamp): p += 1 v1 = 1 if avg*1.8 <= A[p-1].duration <= avg*4 else 0 v2 = 1 if avg*1.8 <= A[p].duration <= avg*4 else 0 v = estimate_linear(v1, v2, A[p-1].timestamp, curr_ts, A[p].timestamp) B.append( v ) 

рдореЗрд░реЗ рдбреЗрдЯрд╛ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЙрдмрд╛рдК рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИ:

  [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...] 

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗрдХреНрдЯрд░ рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рд▓рдЧрднрдЧ 200 рд╣рдЬрд╛рд░ рдбреЗрдЯрд╛ рдкреЙрдЗрдВрдЯред рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк FFT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

 C = numpy.fft.fft(B) C = numpy.abs(C) F = numpy.fft.fftfreq(len(B)) * (1000000000/UNIT) 

рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕рд╕реЗ рджреЛ рд╡реИрдХреНрдЯрд░ рдмрдирддреЗ рд╣реИрдВ:

  • рд╕реА рдореЗрдВ рдЖрд╡реГрддреНрддрд┐ рдШрдЯрдХреЛрдВ рдХреА рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред рд╣рдореЗрдВ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ abs() рдХрдорд╛рдВрдб рд╕реЗ рд╕реБрдЪрд╛рд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдПрдл рдореЗрдВ рд▓реЗрдмрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╡реГрддреНрддрд┐ рдЕрд╡рдзрд┐ рд╡реЗрдХреНрдЯрд░ рд╕реА рдХреЗ рдХрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рд╣реЛрддреА рд╣реИред рд╣рдо рдЗрдирдкреБрдЯ рд╡реЗрдХреНрдЯрд░ рдХреА рдирдореВрдирд╛ рдЖрд╡реГрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рд╣реЗрдЯреНрдЬрд╝ рдХреЛ рдкреНрд░рддрд┐рдкрд╛рджрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдЪрд╛рд░реНрдЯ рдкрд░ рдкреНрд▓реЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдИ рдЕрдХреНрд╖, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрд░реА рд╕рдордп рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЖрд╡реГрддреНрддрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдлрдЯрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:



рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рддреАрди рдЪреЛрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдереЛрдбрд╝рд╛ рдЕрдиреБрднрд╡рд╣реАрди рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд╛рдж, рдФрд╕рдд рд╕реЗ рдХрдо рд╕реЗ рдХрдо рджрд╕ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХреЛ рдЫрд╛рдирдиреЗ рд╕рд╣рд┐рдд, рдЖрдк рдЖрдзрд╛рд░ рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

  127850.0
 127900.0
 127950.0
 255700.0
 255750.0
 255800.0
 255850.0
 255900.0
 255950.0
 383600.0
 383650.0 

рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ: 1000000000 (рдПрдирдПрд╕ / рдПрд╕) / 127900 (рд╣рд░реНрдЯреНрдЬ) = 7818.6 рдПрдирдПрд╕

рд╣реБрд░реНрд░реЗ! рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ рдкрд╣рд▓реА рдЫрд▓рд╛рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЦреЛрдЬ рд░рд╣реЗ рдереЗ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрджреНрдпрддрди рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

256 kHz, 384 kHz, 512 kHz рдкрд░ рд╢реЗрд╖ рдЪреЛрдЯрд┐рдпрд╛рдВ рддрдерд╛рдХрдерд┐рдд рд╣рд╛рд░реНрдореЛрдирд┐рдХреНрд╕ рд╣реИрдВ рдЬреЛ 128 kHz рдХреА рд╣рдорд╛рд░реА рдЖрдзрд╛рд░ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рдЧреБрдгрдХ рд╣реИрдВред рдпрд╣ рдПрдлрдПрдлрдЯреА рдХреЛ рд╡рд░реНрдЧ рддрд░рдВрдЧ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрдХреНрд╖ рдкреНрд░рднрд╛рд╡ рд╣реИред

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

  ~ / 2018-11-рдореЗрдореЛрд░реА-рд░рд┐рдлреНрд░реЗрд╢ $ рдореЗрдХ
 gcc -msse4.1 -ggdb -O3 -Wall -Wextra рдорд╛рдк-рдбреНрд░рд╛рдорд╛.c -o рдорд╛рдк-рдбреНрд░рд╛рдорд╛
 ./measure-dram |  python3 ./analyze-dram.py
 [*] ASLR рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛: рдореБрдЦреНрдп = режxрелрелрелрелрелрелрелрек stack реп реж рд╕реНрдЯреИрдХ = режx
 [] рдордЬреЗрджрд╛рд░ рддрдереНрдпред  рдореИрдВрдиреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 40663553 рдХреНрд▓реЙрдХ_рдЧреЗрдЯрдЯрд╛рдЗрдо () рдХрд┐рдпрд╛
 [*] рдорд╛рдкрдиреЗ MOVQ + CLFLUSH рд╕рдордпред  131072 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред
 [*] рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛
 [*] рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛: рдорд┐рди = резрез av рдПрд╡реАрдЬреА = рез 16рем рдореЗрдб = резрем = рдЕрдзрд┐рдХрддрдо = itemsрез =реи тАЛтАЛрдЖрдЗрдЯрдо = резрейрезреж .реи
 [*] рдХрдЯрдСрдл рд░реЗрдВрдЬ реирезреи-inf рд╣реИ
 [] 127849 рдЖрдЗрдЯрдо рдХрдЯрдСрдл рд╕реЗ рдиреАрдЪреЗ, 0 рдЖрдЗрдЯрдо рдХрдЯрдСрдл рд╕реЗ рдКрдкрд░, 3223 рдЖрдЗрдЯрдо рдиреЙрди-рдЬреАрд░реЛ
 [*] FFT рд░рдирд┐рдВрдЧ
 [*] 250kHz рд╕реЗ рдиреАрдЪреЗ 2kHz рд╕реЗ рдКрдкрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ 7716 рдХреА рдкрд░рд┐рдорд╛рдг рд╣реИ
 [+] 2kHZ рд╕реЗ рдКрдкрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╡рд╛рд▓реЗ рд╕реНрдкрд╛рдЗрдХреНрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
 127906Hz 7716
 255813 рд╣рд░реНрдЯреНрдЬ 7947
 383720Hz 7460
 511626 рд╣рд░реНрдЯреНрдЬ 7141 

рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд░реНрдмреЛ рдмреВрд╕реНрдЯ, рд╕реАрдкреАрдпреВ рдЖрд╡реГрддреНрддрд┐ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рдХрд╛рдо рд╕реЗ рджреЛ рдореБрдЦреНрдп рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред

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

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕реВрдХреНрд╖реНрдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдорд╛рдкрдирд╛ рдЕрдХреНрд╕рд░ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕реЛрдЪ рдиреЗ рдореВрд▓ рд░реЛрд╣рдореЗрд░ рднреЗрджреНрдпрддрд╛ рдХреА рдЦреЛрдЬ рдХреА, рдпрд╣ рдореЗрд▓реНрдЯрдбрд╛рдЙрди / рд╕реНрдкреЗрдХреНрдЯрд░ рд╣рдорд▓реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ рдИрд╕реАрд╕реА рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд░реЛрд╣рд╛рдорд░ рдкреБрдирд░реНрдЬрдиреНрдо рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмрд╣реБрдд рдХреБрдЫ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред рд╣рдордиреЗ рдореЗрдореЛрд░реА рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╕реНрдкрд░реНрд╢ рдХрд┐рдпрд╛ред рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ:


рдЕрдВрдд рдореЗрдВ, рдпрд╣рд╛рдБ рдкреБрд░рд╛рдиреА рдлреЗрд░рд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХрд╛ рдЕрдЪреНрдЫрд╛ рд╡рд░реНрдгрди рд╣реИ:

Source: https://habr.com/ru/post/hi431010/


All Articles