рдореИрдВ рдПрдХ рдЦрд┐рд▓реМрдирд╛ рдУрдПрд╕ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ (рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд▓рдн)


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

рддреЛ рдПрдХ рдЕрдиреБрд╕реВрдЪрдХ рдХреНрдпрд╛ рд╣реИ? рдЕрдиреБрд╕реВрдЪрдХ рдУрдПрд╕ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкрд╛рд╕ рдХрдИ рдХрд╛рд░реНрдп рд╣реИрдВред рдЗрд╕рдХреА рд╕реБрд╕рдВрдЧрдд рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдпрд╣ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ рдПрдХ рдХрд╛рд░реНрдп рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

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

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

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

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

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

рдЦрд┐рд▓реМрдирд╛ рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

DEFINE_ISR(timer, 0) { ... thrd->context = *stack_frame; //      thread_data update_priority_quantum(thrd); //       ... prio = &cpud->priorities[cpud->current_priority = highest]; //      struct thread_data *thrd2 = prio->active_tail; //        if (thrd2 != thrd) { //     -       *stack_frame = thrd2->context; //      wrmsr(MSR_FS_BASE, (uint64_t)thrd2); } ... } 


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

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

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

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

рд╕рдХреНрд░рд┐рдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдореБрдЦреНрдп рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдо рд╕реНрдкрд┐рдирдХреЙрдХ рд╣реИ ред рдЖрдзреБрдирд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ, рд╕реНрдкрд┐рдирд▓реЙрдХ рдкрд░рдорд╛рдгреБ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред X86 рдХреЗ рд▓рд┐рдП, рдпреЗ xchg, рд▓реЙрдХ cmpxchg, рдФрд░ рдЕрдиреНрдп рд╣реИрдВред рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХреЛ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╣реИред рдПрдХ рдЦрд┐рд▓реМрдиреЗ рдореЗрдВ рдПрдХ рд╕реНрдкрд┐рдирд▓реЙрдХ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХреИрдкреНрдЪрд░ рдФрд░ рд░рд┐рд▓реАрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛:

 struct spinlock { volatile uint8_t busy; }; static inline void create_spinlock(struct spinlock *lock) { lock->busy = false; } // zero tries means (practically) forever static inline bool acquire_spinlock_int(struct spinlock *lock, uint64_t tries) { uint8_t al; do ASMV("mov $1, %%al\nxchgb %%al, %0" : "+m"(lock->busy), "=&a"(al)); while (al && --tries); return !al; } static inline void release_spinlock_int(struct spinlock *lock) { ASMV("xorb %%al, %%al\nxchgb %%al, %0" : "+m"(lock->busy) : : "al"); } 


рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред

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


All Articles