рд▓реЗрдХрд┐рди рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рднрд╛рдЧ II: рдореЗрдореЛрд░реА рдСрд░реНрдбрд░рд┐рдВрдЧ

рдЪрд┐рддреНрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

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

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


рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдиреНрдпреВрдирддрдо

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

рдХреИрд╢ рдбрд┐рд╡рд╛рдЗрд╕


"рдореБрдЦреНрдп рдореЗрдореЛрд░реА" рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдФрд░ рдЖрдзреБрдирд┐рдХ рдорд╢реАрдиреЛрдВ рдкрд░ рднреА рд╕реИрдХрдбрд╝реЛрдВ рдиреИрдиреЛрд╕реЗрдХрдВрдб рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рдорд┐рдХ рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЬреАрд╡рдВрддрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдХреЗ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреИрд╢ рдФрд░ рдЙрдирдХреА рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╢рдмреНрдж рдпрд╣рд╛рдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рдд рдореЗрдВ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреИрд╕реЗ рджреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдПрдХрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ (рдпрд╛ рдХрд░реНрдиреЗрд▓) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рдХрдИ рдХреЛрд░ (YAY MULTITHREADING!) рдХреЗ рд╕рд╛рде , рд╕рд╡рд╛рд▓ рдкрд╣рд▓реЗ рд╣реА рдЙрдардиреЗ рд╢реБрд░реВ рд╣реЛ рдЧрдП рд╣реИрдВред
рдкреНрд░реЛрд╕реЗрд╕рд░ A рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ A рдиреЗ рдХреИрд╢ рдХрд┐рдпрд╛ рд╣реИ рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ B рдиреЗ рдХреБрдЫ рдореВрд▓реНрдп рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ?

рдпрд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреИрд╢ рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ?

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рджреБрдирд┐рдпрд╛ рдХреА рдПрдХ рд╕реБрд╕рдВрдЧрдд рддрд╕реНрд╡реАрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдореЗрдВ рд╡реЗ рдЬреЛ рдирд┐рдпрдо рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдХреЛрд╣рд░реЗрдВрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдХреИрд╢ рдХреЛрд╣реЗрд░реЗрдВрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓


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

MESI рдореЗрдВ, рдХреИрд╢ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдЪрд╛рд░ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


рд░рд╛рдЬреНрдп рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд┐рдирд┐рдордп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рд╛рд░реВрдк рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рд╡рд┐рдбрдВрдмрдирд╛ рд╣реИ рдХрд┐ рдЗрддрдиреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдареАрдХ рд╣реЛрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛, рдЕрднрд┐рдиреЗрддрд╛ рдореЙрдбрд▓ рд╣реЗрдЯрд░реНрд╕?

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

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

MESI рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдПрдВ


рд╕реНрдЯреЛрд░ рдмрдлрд╝рд░реНрд╕


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

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

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

 void executedOnCpu0() { value = 10; finished = true; } void executedOnCpu1() { while(!finished); assert value == 10; } 

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЖрдк рдЬреЛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рддрдХ, Cpu0 рдЕрдирдиреНрдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реИ, рдФрд░ value рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ value рдмрдлрд░ finished рдмрд╛рдж рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред рдФрд░ рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ Cpu1 true рд░реВрдк рдореЗрдВ finished рдЬрд╛рдПрдЧрд╛, рдФрд░ value 10 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рд░реАрдСрд░реНрдбрд░рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХреЗрд╡рд▓ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ, рдЬреЛ рднреА рдХрд╛рд░рдг рд╕реЗ, рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реИрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдорд╛рдиреНрдп рдХрддрд╛рд░реЛрдВ


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

 void executedOnCpu0() { value = 10; finished = true; } void executedOnCpu1() { while(!finished); assert value == 10; } 


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдереЗ (рдпрд╛ рд╣рдордиреЗ рдХреБрдЫ рдЧреБрдкреНрдд рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛), рдФрд░ Cpu0 рдиреЗ рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЙрд╕ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдХреНрдпрд╛ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рд╡реЗ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ Cpu1 рдХреИрд╢ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ? рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рд╕рдХрддреЗ рдереЗ, рдирд╣реАрдВред рд╣рдо рдпрд╣ рднреА рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдЕрдм рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рд╕реНрдЯреЗрдЯ рдореЗрдВ Cpu1 рдХреИрд╢ рдореЗрдВ value рд╕реЗрд▓ рд╣реИред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдлрд┐рд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

#Cpu0Cpu0: рдорд╛рдиCPU0: рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛CPU1Cpu1: рдорд╛рдиCPU1: рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛
0(...)0 (рд╕рд╛рдЭрд╛)рдЕрд╕рддреНрдп (рдЕрдирдиреНрдп)(...)0 (рд╕рд╛рдЭрд╛)(рдЕрдорд╛рдиреНрдп)
1
 value = 10; - store_buffer(value) тЖР invalidate(value) 
0 (рд╕рд╛рдЭрд╛)
(рд╕реНрдЯреЛрд░ рдмрдлрд░ рдореЗрдВ 10)
рдЕрд╕рддреНрдп (рдЕрдирдиреНрдп)
2
 while (!finished); тЖР read(finished) 
0 (рд╕рд╛рдЭрд╛)(рдЕрдорд╛рдиреНрдп)
3
 finished = true; 
0 (рд╕рд╛рдЭрд╛)
(рд╕реНрдЯреЛрд░ рдмрдлрд░ рдореЗрдВ 10)
рд╕рдЪ (рд╕рдВрд╢реЛрдзрд┐рдд)
4
 тЖТ invalidate(value) тЖР invalidate_ack(value) - invalidate_queue(value) 
0 (рд╕рд╛рдЭрд╛)
(рдЕрдорд╛рдиреНрдп рдХрддрд╛рд░ рдореЗрдВ)
(рдЕрдорд╛рдиреНрдп)
5
 тЖТ read(finished) тЖР read_resp(finished) 
0 (рд╕рд╛рдЭрд╛)
(рд╕реНрдЯреЛрд░ рдмрдлрд░ рдореЗрдВ 10)
рд╕рдЪ (рд╕рд╛рдЭрд╛)
6
 тЖТ read_resp(finished) 
0 (рд╕рд╛рдЭрд╛)
(рдЕрдорд╛рдиреНрдп рдХрддрд╛рд░ рдореЗрдВ)
рд╕рдЪ (рд╕рд╛рдЭрд╛)
7
 > assert value == 10; 
0 (рд╕рд╛рдЭрд╛)
(рдЕрдорд╛рдиреНрдп рдХрддрд╛рд░ рдореЗрдВ)
рд╕рдЪ (рд╕рд╛рдЭрд╛)
рдЕрднрд┐рдХрдерди рд╡рд┐рдлрд▓
рдПрди
 - invalidate(value) 
(рдЕрдорд╛рдиреНрдп)рд╕рдЪ (рд╕рд╛рдЭрд╛)


рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ, рд╣реИ рдирд╛? рд╕рдорд╕реНрдпрд╛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реИ (4) - (6)ред (4) рдореЗрдВ invalidate рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрддрд╛рд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рдЪрд░рдг (6) рдореЗрдВ рд╣рдореЗрдВ read рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП read_response рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ (2) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрдВ value рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЬреЛрд░ рдкрдбрд╝рддрд╛ рд╣реИред рдпрджрд┐ рдСрдкрд░реЗрд╢рди (рдПрди) рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдореМрдХрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕ рд▓рд╛рдирдд рдЕрдиреБрдХреВрд▓рди рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рд╡рд╣ рдЗрддрдиреА рддреЗрдЬрд╝ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЕрд▓реНрдЯреНрд░рд╛-рд▓реЛ-рд▓реЗрдЯреЗрдВрд╕реА тДв рджреЗрддреА рд╣реИ! рдпрд╣реА рджреБрд╡рд┐рдзрд╛ рд╣реИред рд▓реЛрд╣реЗ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдФрд░ рдЬрдм рдпрд╣ рдХреБрдЫ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рдорд╛рд░реЗ рдКрдкрд░ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ: тАЬрдЕрдХреЗрд▓реЗ рдЬрд╛рдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИред рдпрд╣ рд▓реЛ! тАЭ

рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдореЛрд░реА рдореЙрдбрд▓


рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рдЬрд╛рджреВрдИ рддрд▓рд╡рд╛рд░ рдЬреЛ рдбреНрд░реЗрдЧрди рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдИ рдереА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд▓рд╡рд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдо рд╣реИрдВред рд╡реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреНрдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддрд▓рд╡рд╛рд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдФрд░ рд╣реИред MESI рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдРрд╕реА рддрд▓рд╡рд╛рд░реЗрдВ рд╣реИрдВ:

рд╕реНрдЯреЛрд░ рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ (рдПрд╕рдЯреА, рдПрд╕рдПрдордмреА, smp_wmb рднреА) - рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЙрди рд╕рднреА рд╕реНрдЯреЛрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рдж рдкрд╛рд▓рди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдмрдлрд░ рдореЗрдВ рд╣реИрдВред

рд▓реЛрдб рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ (рдПрд▓рдбреА, рдЖрд░рдПрдордмреА, smp_rmb рднреА) - рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрд┐рд╕реА рднреА рд▓реЛрдб рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрддрд╛рд░ рдореЗрдВ рд╕рднреА рдЕрдорд╛рдиреНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдирдП рд╣рдерд┐рдпрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 void executedOnCpu0() { value = 10; storeMemoryBarrier(); finished = true; } void executedOnCpu1() { while(!finished); loadMemoryBarrier(); assert value == 10; } 


рдорд╣рд╛рди, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ! рдЖрдк рд╢рд╛рдВрдд, рдЙрддреНрдкрд╛рджрдХ рдФрд░ рд╕рд╣реА рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рд▓рд┐рдЦ рдФрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░реЛрдХ ...

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬрд╛рд╡рд╛ рдХрд╣рд╛рдБ рд╣реИ?


рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗрдВ @ рдХрд╣реАрдВ рднреА рдЪрд▓рд╛рдПрдВ


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрди рд╕рднреА рд╡рд┐рднрд┐рдиреНрди рдХреИрд╢ рдХреЛрд╣реЗрд░реЗрдВрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЭрд┐рд▓реНрд▓реА, рдлреНрд▓рд╢ рдХрд┐рдП рдЧрдП рдХреИрд╢ рдФрд░ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬреЗрдВ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рд╣реИ рдирд╛? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд╛рд╡рд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдореЗрдВ рдХреЛрдИ рд░реАрдСрд░реНрдбрд░рд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред
рдПрдирдмреА : рдпрджрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдЖрдкрдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЬрдм рддрдХ рдЖрдк рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕рдордЭрддреЗ, рддрдм рддрдХ рд▓реЗрдЦ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рди рд░рдЦреЗрдВред рдФрд░ рдкрдврд╝реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред рдХреЛрдИ "рд░реАрдСрд░реНрдбрд░рд┐рдВрдЧ" рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЦреБрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рд░реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЫрд┐рдкрд╛ рд░рд╣реЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЖрд╕рдкрд╛рд╕ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд╖рдбреНрдпрдВрддреНрд░ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рднреА рд╣рдо рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдФрд░ рдЬрд╛рдирдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣реЗрдВрдЧреЗред рдЗрд╕реЗ рдмреБрдЭрд╛ рджреЛ! рд╣рдорд╛рд░реЗ рд╣рд╛рд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реБрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд▓реЗрдВ: [ github ]

 public class TestSubject { private volatile boolean finished; private int value = 0; void executedOnCpu0() { value = 10; finished = true; } void executedOnCpu1() { while(!finished); assert value == 10; } } 


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

рдкрд┐рдЫрд▓реА рдмрд╛рд░, рд╣рдордиреЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рджреЗрдЦрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдмрд╛рд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ (C1) рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП Openjdk-7u40-fcs-src-b43-26_aug_2013 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реЗ OpenJDK рд╕реНрд░реЛрдд рдХреЛрдб (рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕реЗ рдЦреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рдЦреЛрд▓рд╛ рд╣реИ), рдпрд╣ рдЦреЛрдЬрдирд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХрд╣рд╛рдБ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдмрд╛рдпрдЯреЗрдХреЛрдб рдкрд░ рдЧреМрд░ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдирд╛рдо рдкрддрд╛ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдЦреЛрдЬреЗрдВред

 $ javac TestSubject.java && javap -c TestSubject void executedOnCpu0(); Code: 0: aload_0 //    this 1: bipush 10 //    10 3: putfield #2 //     this (value)    (10) 6: aload_0 //    this 7: iconst_1 //    1 8: putfield #3 //     this (finished)    (1) 11: return void executedOnCpu1(); Code: 0: aload_0 //    this 1: getfield #3 //      this (finished) 4: ifne 10 //    ,     10( ) 7: goto 0 //     10: getstatic #4 //     $assertionsDisabled:Z 13: ifne 33 //  assertions ,    33() 16: aload_0 //    this 17: getfield #2 //      this (value) 20: bipush 10 //    10 22: if_icmpeq 33 //      ,    33() 25: new #5 //   java/lang/AssertionError 28: dup //      29: invokespecial #6 //   ( <init>) 32: athrow //  ,      33: return 

рдПрдирдмреА : рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред JIT рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдпрд╣рд╛рдВ рдХреМрди рд╕реА рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдкрд╣рд▓реА рдЫреЛрдЯреА рдмрд╛рдд рдЬреЛ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рджрд╛рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ -ea рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ -ea рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдРрд╕рд╛ рд╣реИ, рдмрдХрд╡рд╛рд╕ рд╣реИред getfield рдФрд░ putfield рдХреЗ рдирд╛рдо рдХреЗ рд▓рд┐рдП рд╣рдо рдпрд╣рд╛рдВ рдЖрдП рдереЗред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ? (рдмреЗрд╢рдХ, Gleb! рдмрд╕ рдХреИрд╕реЗ рд╣рдо рдмреЗрдХрди, рд╕рд╡рд╛рд░ рдФрд░ рджреЛ рдмреНрд░рд╛ рд╕реЗ рдбрд╛рдпрд╕рди рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ ?)

рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдХреЗ рдиреАрдЪреЗ


рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ volatile рдЬрд╛рдирдХрд╛рд░реА рдХрд╣рд╛рдБ рдирд┐рд╣рд┐рдд рд╣реИред рдлрд╝реАрд▓реНрдб рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ share/vm/ci/ciField.hpp рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ
 176 
 bool is_volatile () { return flags().is_volatile(); } 
volatile рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА 1 рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд▓рдХреЛрдард░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдФрд░ рдкреНрд░рд╛рдЪреАрди рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдХрдИ рд╕реНрдХреНрд░реЙрд▓ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдлрд╝рд╛рдЗрд▓ share/vm/c1/c1_LIRGenerator.cpp рдореЗрдВ рдЦреБрдж рдХреЛ рдкрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЙрдирдХрд╛ рдирд╛рдо рд╣рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ ( LIR , рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐) рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП putfield рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП C1 рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐


рд╕реА 1 рдореЗрдВ рдЖрдИрдЖрд░ рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдорд╛рд░реЗ putfield рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЕрдВрддрддрдГ рдпрд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ volatile рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:
 1734 1735 1736 
 if (is_volatile && os::is_MP()) { __ membar_release(); } 
рдпрд╣рд╛рдБ __ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬреЛ gen()->lir()-> рдлреИрд▓рддрд╛ рд╣реИред рдФрд░ membar_release рдкрджреНрдзрддрд┐ membar_release share/vm/c1/c1_LIR.hpp рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 1958 
 void membar_release() { append(new LIR_Op0(lir_membar_release)); } 
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд▓рд╛рдЗрди рдиреЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ membar_release рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЬреЛрдбрд╝рд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
 1747 1748 1749 
 if (is_volatile && !needs_patching) { volatile_field_store(value.result(), address, info); } 
volatile_field_store рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реЗ volatile_field_store рд╣реА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, x86 ( cpu/x86/vm/c1_LIRGenerator_x86.cpp ) рдкрд░, рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВ: рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдлрд╝реАрд▓реНрдб 64-рдмрд┐рдЯ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдЕрд╕рдорд╛рдирддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реИрдХ рдореИрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдлрд┐рд░ рднреА рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ volatile рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ volatile рдЯрд╛рдЗрдк long рдФрд░ double рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЧреИрд░-рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ?

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ, рдПрдХ рдФрд░ рдореЗрдореЛрд░рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░ рд░рд┐рд▓реАрдЬ рдХреЗ рдмрд┐рдирд╛:
 1759 1760 1761 
 if (is_volatile && os::is_MP()) { __ membar(); } 
 1956 
 void membar() { append(new LIR_Op0(lir_membar)); } 
рдирд╛рдпрдм : рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рдирд┐рд╢реНрдЪрдп рд╣реА рдЪрд▓ рд░рд╣реА рдХреБрдЫ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЫреБрдкрд╛рдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬреЛрдбрд╝рддреЛрдбрд╝ред рдкрд╛рдардХ рдХреЛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


IR рдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдмрджрд▓реЗрдВ


рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрд╕рдЯреА рдФрд░ рдПрд▓рдбреА рдкрд╛рд╕ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣рд╛рдВ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реЛрдз рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛, рд╡рд╣ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп MESI рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдФрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдЪрд▓реЗ рдЧрдП рд╣реИрдВ, рдФрд░ рд╢рд░реНрддреЛрдВ рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЗрдореЛрд░реА рдСрдкрд░реЗрд╢рди рд╣реИрдВ: рд╕реНрдЯреЛрд░ рдФрд░ рд▓реЛрдбред рдлрд┐рд░ рджреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдЪрд╛рд░ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдпреЛрдЬрди рд╣реИрдВ: рд▓реЛрдб рдФрд░ рд▓реЛрдб, рд▓реЛрдб рдФрд░ рд╕реНрдЯреЛрд░, рд╕реНрдЯреЛрд░ рдФрд░ рд▓реЛрдб, рд╕реНрдЯреЛрд░ рдФрд░ рд╕реНрдЯреЛрд░ред рд╣рдордиреЗ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА: рд╕реНрдЯреЛрд░рд╕реНрдЯреЛрд░ рдФрд░ рд▓реЛрдбрд▓реЙрдб - рдФрд░ рд╡рд╣реА рдХреБрдЫ рдЕрд╡рд░реЛрдз рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ MESI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рджреЗрдЦреЗ рдереЗред рдЕрдиреНрдп рджреЛ рднреА рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЛрдбрд╕реНрдЯреЛрд░ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд┐рдд рд╕рднреА рд▓реЛрдб рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдЯреЛрд░ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрдЯреЛрд░рд▓реЙрдб рдХреЗ рд╕рд╛рде, рдХреНрд░рдорд╢рдГ рд╡рд┐рдкрд░реАрдд рд╕рдЪ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSR-133 рдХреБрдХрдмреБрдХ рдореЗрдВ ред

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

рдЕрдм рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрд╡реАрдПрдо рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдХреМрди рд╕реА рдЭрд┐рд▓реНрд▓реА рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдмрдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ LIR рдореЗрдВ рджреЗрдЦрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдирд┐рдореНрди-рд╕реНрддрд░, рдЕрднреА рднреА рдореВрд▓ рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдЬреЛ JIT рдХреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ C1 рдХреИрд╕реЗ LIR рдХреЛ рдореВрд▓ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рд╕реАрдзреЗ рдлрд╛рдЗрд▓ share/vm/c1/c1_LIRAssembler.cpp ред рд╡рд╣рд╛рдВ, IR рдХрд╛ рдкреВрд░рд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛрдб рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╣реБрдд рд╣реА рднрдпрд╛рд╡рд╣ рд░реЗрдЦрд╛ рдореЗрдВ, lir_membar_release рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
 665 666 667 
 case lir_membar_release: membar_release(); break; 
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рд╣реИ, рдФрд░ x86 рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб cpu/x86/vm/c1_LIRAssembler_x86.cpp :
 3733 3734 3735 3736 
 void LIR_Assembler::membar_release() { // No x86 machines currently require store fences // __ store_fence(); } 
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдПрдХ рд╕рдЦреНрдд рдореЗрдореЛрд░реА рдореЙрдбрд▓ (рдЯреАрдПрд╕рдУ-рдЯреЛрдЯрд▓ рд╕реНрдЯреЛрд░ рдСрд░реНрдбрд░ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдореЗрдореНрдмрд░ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИ:
 3723 3724 3725 3726 
 void LIR_Assembler::membar() { // QQQ sparc TSO uses this, __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad)); } 

рдпрд╣рд╛рдБ __ рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ _masm-> , рдФрд░ _masm-> рд╡рд┐рдзрд┐ cpu/x86/vm/assembler_x86.hpp рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 
 void membar(Membar_mask_bits order_constraint) { if (os::is_MP()) { // We only have to handle StoreLoad if (order_constraint & StoreLoad) { // All usable chips support "locked" instructions which suffice // as barriers, and are much faster than the alternative of // using cpuid instruction. We use here a locked add [esp],0. // This is conveniently otherwise a no-op except for blowing // flags. // Any change to this code may need to revisit other places in // the code where this idiom is used, in particular the // orderAccess code. lock(); addl(Address(rsp, 0), 0);// Assert the lock# signal here } } } 
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ x86 рдкрд░ рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ volatile рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдкрд░ lock addl $0x0,(%rsp) рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдорд╣рдВрдЧреА StoreLoad рдмрд╛рдзрд╛ рдбрд╛рд▓ рджреАредрдСрдкрд░реЗрд╢рди рдорд╣рдВрдЧрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдмрдлрд░ рдореЗрдВ рд╕рднреА рд╕реНрдЯреЛрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрдВ рд╡рд╣реА рдкреНрд░рднрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ volatile- рдЕрдиреНрдп рд╕рднреА рдзрд╛рдЧреЗ рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдерд╛ред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ x86 рдкрд░ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рд╕рдмрд╕реЗ рдЖрдо рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рддреНрд╡рд░рд┐рдд рдирд┐рд░реАрдХреНрд╖рдг LIRGenerator::do_LoadFieldрд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЙрдореНрдореАрдж рдХреА рдереА, membar_acquire рд╕реЗрдЯ рд╣реИ, рдЬреЛ x86 рдкрд░ рдЗрд╕ рддрд░рд╣ рд╣реИ:
 3728 3729 3730 3731 
 void LIR_Assembler::membar_acquire() { // No x86 machines currently require load fences // __ load_fence(); } 
рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ volatile readрд╕рд╛рдорд╛рдиреНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдУрд╡рд░рд╣реЗрдб рдХреЛ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ readред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдореВрд▓ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рднреА рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реЛ, IR рдореЗрдВ рдПрдХ рдЕрд╡рд░реЛрдз рдХреА рдореМрдЬреВрджрдЧреА рд╣реА рд╕рдВрдХрд▓рдХ рдХреЛ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИред (рдЕрдиреНрдпрдерд╛ рдЖрдк рдЕрдЬреАрдм рдХреАрдбрд╝реЗ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ )ред рдЕрд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡ рд╣реИрдВред рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ ред

рдЬреВрдБ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ


PrintAssembly


рд╕реНрд░реЛрдд рдкрд░ рдмреИрдардирд╛ рдФрд░ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрд┐рд╕реА рднреА рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧреНрдп рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЕрднреА рднреА рджреЗрдЦрддреЗ рд╣реИрдВ PrintAssemblyред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реВрдк рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЦрд░рдЧреЛрд╢ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЗрдирд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ (рдЙрддреНрдкрдиреНрди рдХреЛрдб рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╡реАрдПрдо рдореЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВ, рдХрдердиреЛрдВ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:

 $ java -client -ea -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:MaxInlineSize=0 TestSubject ... # {method} 'executedOnCpu0' '()V' in 'TestSubject' ... 0x00007f6d1d07405c: movl $0xa,0xc(%rsi) 0x00007f6d1d074063: movb $0x1,0x10(%rsi) 0x00007f6d1d074067: lock addl $0x0,(%rsp) ;*putfield finished ; - TestSubject::executedOnCpu0@8 (line 15) ... # {method} 'executedOnCpu1' '()V' in 'TestSubject' ... 0x00007f6d1d061126: movzbl 0x10(%rbx),%r11d ;*getfield finished ; - TestSubject::executedOnCpu1@1 (line 19) 0x00007f6d1d06112b: test %r11d,%r11d ... 

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

рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди


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

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

 static class State { int x; int y; // acq/rel var } @Override public void actor1(State s, IntResult2 r) { sx = 1; sx = 2; sy = 1; sx = 3; } @Override public void actor2(State s, IntResult2 r) { r.r1 = sy; r.r2 = sx; } 


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдзрд╛рдЧреЗ рд╣реИрдВ: рдПрдХ рд░рд╛рдЬреНрдп рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд░рд╛рдЬреНрдп рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕рдиреЗ рджреЗрдЦрд╛ рдерд╛ред рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ ред рд╣рдо рджреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рджреВрд╕рд░реА рдзрд╛рд░рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: [1, 0]рдФрд░ [1, 1]ред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ y == 1, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдордиреЗ рдпрд╛ рддреЛ x( x == 0) рдореЗрдВ рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдпрд╛ рд╣рдордиреЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп рдирд╡реАрдирддрдо рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ y, рдЕрд░реНрдерд╛рдд x == 1ред рд╣рдорд╛рд░реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдРрд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ:

 $ java -jar tests-all/target/jcstress.jar -v -t ".*UnfencedAcquireReleaseTest.*" ... Observed state Occurrence Expectation Interpretation [0, 0] 32725135 ACCEPTABLE Before observing releasing write to, any value is OK for $x. [0, 1] 15 ACCEPTABLE Before observing releasing write to, any value is OK for $x. [0, 2] 36 ACCEPTABLE Before observing releasing write to, any value is OK for $x. [0, 3] 10902 ACCEPTABLE Before observing releasing write to, any value is OK for $x. [1, 0] 65960 ACCEPTABLE_INTERESTING Can read the default or old value for $x after $y is observed. [1, 3] 50929785 ACCEPTABLE Can see a released value of $x if $y is observed. [1, 2] 7 ACCEPTABLE Can see a released value of $x if $y is observed. 


рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 83731840 (рд▓рдЧрднрдЧ 0.07%) рдореЗрдВ рд╕реЗ 65960 рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдордиреЗ рджреЗрдЦрд╛ y == 1 && x == 0рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрди: рд╣реБрдЖ рд╣реИред рд╣реБрд░реНрд░реЗ, рдЖрдк рдЯрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


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

рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд ┬й

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

рдмреЗрд╢рдХ, рд╕рд░реНрд╡рд░ рдХрдВрдкрд╛рдЗрд▓рд░ (C2) C1 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рд╕реНрдорд╛рд░реНрдЯ рд╣реИ, рдЬрд┐рд╕рдХреА рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА, рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред

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

рдмрд╣рд╛рджреБрд░ TheShade , cheremin рдФрд░ artyushov рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж , рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдмрдЬрд╛рдп рдЖрдо рд▓реЛрдЧреЛрдВ рдХреЛ рдирд╣реАрдВ рд▓рд╛рддрд╛, рдмреЗрд╡рдХреВрдл рдЪреБрдЯрдХреБрд▓реЗ рдФрд░ рдУрд╡рд░рд╕рд╛рдЗрдЯреНрд╕ рд╕реЗ рднрд░рд╛ рдХреБрдЫ рдмрдХрд╡рд╛рд╕ред

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


All Articles