рдУрдПрд╕ рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХрд╛ рд╕рдВрдЧрдарди

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



рдкрд░рд┐рдЪрдп


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

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

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

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

рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдпреЛрдЬрди рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рджреЛ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рдЖрдЗрдП рдПрдХ рдЧреИрд░-рдирд┐рд╡рд╛рд░рдХ рдирд┐рдпреЛрдЬрди рд╡рд┐рдзрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧреИрд░-рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдкреНрд▓рд╛рдирд░


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

рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЧреИрд░-рднреАрдбрд╝ рд╢реЗрдбреНрдпреВрд▓рд░

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

#include <stdio.h> #define TASK_COUNT 2 struct task { void (*func)(void *); void *data; }; static struct task tasks[TASK_COUNT]; static void scheduler(void) { int i; for (i = 0; i < TASK_COUNT; i++) { tasks[i].func(tasks[i].data); } } static void worker(void *data) { printf("%s\n", (char *) data); } static struct task *task_create(void (*func)(void *), void *data) { static int i = 0; tasks[i].func = func; tasks[i].data = data; return &tasks[i++]; } int main(void) { task_create(&worker, "First"); task_create(&worker, "Second"); scheduler(); return 0; } 


рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо:

рдкрд╣рд▓реЗ
рджреВрд╕рд░рд╛

CPU рд╡реНрдпрд╕реНрдд рдЧреНрд░рд╛рдл:



рдШрдЯрдирд╛-рдЖрдзрд╛рд░рд┐рдд рдЧреИрд░-рдирд┐рд╡рд╛рд░рдХ рд╕рдордпрдмрджреНрдзрдХ

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

 #include <stdio.h> #define TASK_COUNT 2 struct task { void (*func)(void *); void *data; int activated; }; static struct task tasks[TASK_COUNT]; struct task_data { char *str; struct task *next_task; }; static struct task *task_create(void (*func)(void *), void *data) { static int i = 0; tasks[i].func = func; tasks[i].data = data; return &tasks[i++]; } static int task_activate(struct task *task, void *data) { task->data = data; task->activated = 1; return 0; } static int task_run(struct task *task, void *data) { task->activated = 0; task->func(data); return 0; } static void scheduler(void) { int i; int fl = 1; while (fl) { fl = 0; for (i = 0; i < TASK_COUNT; i++) { if (tasks[i].activated) { fl = 1; task_run(&tasks[i], tasks[i].data); } } } } static void worker1(void *data) { printf("%s\n", (char *) data); } static void worker2(void *data) { struct task_data *task_data; task_data = data; printf("%s\n", task_data->str); task_activate(task_data->next_task, "First activated"); } int main(void) { struct task *t1, *t2; struct task_data task_data; t1 = task_create(&worker1, "First create"); t2 = task_create(&worker2, "Second create"); task_data.next_task = t1; task_data.str = "Second activated"; task_activate(t2, &task_data); scheduler(); return 0; } 


рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо:

рджреВрд╕рд░рд╛ рд╕рдХреНрд░рд┐рдп
рдкрд╣рд▓реЗ рд╕рдХреНрд░рд┐рдп

рд╕реАрдкреАрдпреВ рд╡реНрдпрд╕реНрдд рдЧреНрд░рд╛рдл



рд╕рдВрджреЗрд╢ рдЧреИрд░-рдирд┐рд╡рд╛рд░рдХ рд╕рдордпрдмрджреНрдзрдХ рдкрдВрдХреНрддрд┐рдмрджреНрдз рдХрд░рдирд╛

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

 #include <stdio.h> #include <stdlib.h> #define TASK_COUNT 2 struct message { void *data; struct message *next; }; struct task { void (*func)(void *); struct message *first; }; struct task_data { char *str; struct task *next_task; }; static struct task tasks[TASK_COUNT]; static struct task *task_create(void (*func)(void *), void *data) { static int i = 0; tasks[i].func = func; tasks[i].first = NULL; return &tasks[i++]; } static int task_activate(struct task *task, void *data) { struct message *msg; msg = malloc(sizeof(struct message)); msg->data = data; msg->next = task->first; task->first = msg; return 0; } static int task_run(struct task *task, void *data) { struct message *msg = data; task->first = msg->next; task->func(msg->data); free(data); return 0; } static void scheduler(void) { int i; int fl = 1; struct message *msg; while (fl) { fl = 0; for (i = 0; i < TASK_COUNT; i++) { while (tasks[i].first) { fl = 1; msg = tasks[i].first; task_run(&tasks[i], msg); } } } } static void worker1(void *data) { printf("%s\n", (char *) data); } static void worker2(void *data) { struct task_data *task_data; task_data = data; printf("%s\n", task_data->str); task_activate(task_data->next_task, "Message 1 to first"); task_activate(task_data->next_task, "Message 2 to first"); } int main(void) { struct task *t1, *t2; struct task_data task_data; t1 = task_create(&worker1, "First create"); t2 = task_create(&worker2, "Second create"); task_data.next_task = t1; task_data.str = "Second activated"; task_activate(t2, &task_data); scheduler(); return 0; } 


рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо:

рджреВрд╕рд░рд╛ рд╕рдХреНрд░рд┐рдп
рд╕рдВрджреЗрд╢ 2 рд╕реЗ рдкрд╣рд▓реЗ
рд╕рдВрджреЗрд╢ 1 рд╕реЗ рдкрд╣рд▓рд╛

рд╕реАрдкреАрдпреВ рд╡реНрдпрд╕реНрдд рдЧреНрд░рд╛рдл



рдЧреИрд░-рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдиреБрд╕реВрдЪрдХ рдХреЙрд▓ рдЖрджреЗрд╢ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде

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

 #include <stdio.h> #include <stdlib.h> #define TASK_COUNT 2 struct task { void (*func)(void *); void *data; struct task *next; }; static struct task *first = NULL, *last = NULL; static struct task *task_create(void (*func)(void *), void *data) { struct task *task; task = malloc(sizeof(struct task)); task->func = func; task->data = data; task->next = NULL; if (last) { last->next = task; } else { first = task; } last = task; return task; } static int task_run(struct task *task, void *data) { task->func(data); free(task); return 0; } static struct task *task_get_next(void) { struct task *task = first; if (!first) { return task; } first = first->next; if (first == NULL) { last = NULL; } return task; } static void scheduler(void) { struct task *task; while ((task = task_get_next())) { task_run(task, task->data); } } static void worker2(void *data) { printf("%s\n", (char *) data); } static void worker1(void *data) { printf("%s\n", (char *) data); task_create(worker2, "Second create"); task_create(worker2, "Second create again"); } int main(void) { struct task *t1; t1 = task_create(&worker1, "First create"); scheduler(); return 0; } 


рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо:

рдкрд╣рд▓реЗ рдмрдирд╛рдПрдВ
рджреВрд╕рд░рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ
рджреВрд╕рд░рд╛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ

рд╕реАрдкреАрдпреВ рд╡реНрдпрд╕реНрдд рдЧреНрд░рд╛рдл



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

рдПрдХреНрд╕рдЯреНрд░реВрдЬрд╝рди рдкреНрд▓рд╛рдирд░


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

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

рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рд╕рдВрджрд░реНрдн

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

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ x86 рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг:
 struct context { /* 0x00 */uint32_t eip; /**< instruction pointer */ /* 0x04 */uint32_t ebx; /**< base register */ /* 0x08 */uint32_t edi; /**< Destination index register */ /* 0x0c */uint32_t esi; /**< Source index register */ /* 0x10 */uint32_t ebp; /**< Stack pointer register */ /* 0x14 */uint32_t esp; /**< Stack Base pointer register */ /* 0x18 */uint32_t eflags; /**< EFLAGS register hold the state of the processor */ }; 


рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдкреНрд▓рд╛рдирд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдореМрд▓рд┐рдХ рд╣реИрдВред

рдкреНрд░рд╕рдВрдЧ рд╕реНрд╡рд┐рдЪ

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

X86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдкреНрд░рдХреНрд░рд┐рдпрд╛:
  .global context_switch context_switch: movl 0x04(%esp), %ecx /* Point ecx to previous registers */ movl (%esp), %eax /* Get return address */ movl %eax, CTX_X86_EIP(%ecx) /* Save it as eip */ movl %ebx, CTX_X86_EBX(%ecx) /* Save ebx */ movl %edi, CTX_X86_EDI(%ecx) /* Save edi */ movl %esi, CTX_X86_ESI(%ecx) /* Save esi */ movl %ebp, CTX_X86_EBP(%ecx) /* Save ebp */ add $4, %esp /* Move esp in state corresponding to eip */ movl %esp, CTX_X86_ESP(%ecx) /* Save esp */ pushf /* Push flags */ pop CTX_X86_EFLAGS(%ecx) /* ...and save them */ movl 0x04(%esp), %ecx /* Point ecx to next registers */ movl CTX_X86_EBX(%ecx), %ebx /* Restore ebx */ movl CTX_X86_EDI(%ecx), %edi /* Restore edi */ movl CTX_X86_ESP(%ecx), %esi /* Restore esp */ movl CTX_X86_EBP(%ecx), %ebp /* Restore ebp */ movl CTX_X86_ESP(%ecx), %esp /* Restore esp */ push CTX_X86_EFLAGS(%ecx) /* Push saved flags */ popf /* Restore flags */ movl CTX_X86_EIP(%ecx), %eax /* Get eip */ push %eax /* Restore it as return address */ ret 


рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреЗрдЯ рдорд╢реАрди

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



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

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

рд░рд╛рдЬреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

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

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



рд╕реГрдЬрди

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

 struct thread *thread_create(unsigned int flags, void *(*run)(void *), void *arg) { int ret; struct thread *t; //тАж /* below we are going work with thread instances and therefore we need to * lock the scheduler (disable scheduling) to prevent the structure being * corrupted */ sched_lock(); { /* allocate memory */ if (!(t = thread_alloc())) { t = err_ptr(ENOMEM); goto out; } /* initialize internal thread structure */ thread_init(t, flags, run, arg); //тАж } out: sched_unlock(); return t; } 


 void thread_init(struct thread *t, unsigned int flags, void *(*run)(void *), void *arg) { sched_priority_t priority; assert(t); assert(run); assert(thread_stack_get(t)); assert(thread_stack_get_size(t)); t->id = id_counter++; /* setup thread ID */ dlist_init(&t->thread_link); /* default unlink value */ t->critical_count = __CRITICAL_COUNT(CRITICAL_SCHED_LOCK); t->siglock = 0; t->lock = SPIN_UNLOCKED; t->ready = false; t->active = false; t->waiting = true; t->state = TS_INIT; /* set executive function and arguments pointer */ t->run = run; t->run_arg = arg; t->joining = NULL; //... /* cpu context init */ context_init(&t->context, true); /* setup default value of CPU registers */ context_set_entry(&t->context, thread_trampoline);/*set entry (IP register*/ /* setup stack pointer to the top of allocated memory * The structure of kernel thread stack follow: * +++++++++++++++ top * | * v * the thread structure * xxxxxxx * the end * +++++++++++++++ bottom (t->stack - allocated memory for the stack) */ context_set_stack(&t->context, thread_stack_get(t) + thread_stack_get_size(t)); sigstate_init(&t->sigstate); /* Initializes scheduler strategy data of the thread */ runq_item_init(&t->sched_attr.runq_link); sched_affinity_init(t); sched_timing_init(t); } 


рдЦрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛

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

рдкреНрд░рд╡рд╛рд╣ рдкреВрд░реНрдг рд╣реЛрдирд╛

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

 void __attribute__((noreturn)) thread_exit(void *ret) { struct thread *current = thread_self(); struct task *task = task_self(); struct thread *joining; /* We can not free the main thread */ if (task->main_thread == current) { /* We are last thread. */ task_exit(ret); /* NOTREACHED */ } sched_lock(); current->waiting = true; current->state |= TS_EXITED; /* Wake up a joining thread (if any). * Note that joining and run_ret are both in a union. */ joining = current->joining; if (joining) { current->run_ret = ret; sched_wakeup(joining); } if (current->state & TS_DETACHED) /* No one references this thread anymore. Time to delete it. */ thread_delete(current); schedule(); /* NOTREACHED */ sched_unlock(); /* just to be honest */ panic("Returning from thread_exit()"); } 


рдПрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб

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

 static void __attribute__((noreturn)) thread_trampoline(void) { struct thread *current = thread_self(); void *res; assert(!critical_allows(CRITICAL_SCHED_LOCK), "0x%x", (uint32_t)__critical_count); sched_ack_switched(); assert(!critical_inside(CRITICAL_SCHED_LOCK)); /* execute user function handler */ res = current->run(current->run_arg); thread_exit(res); /* NOTREACHED */ } 


рд╕рд╛рд░рд╛рдВрд╢: рд╕реНрдЯреНрд░реАрдо рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд╡рд░рдг

рдЗрд╕рд▓рд┐рдП, рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 struct thread { unsigned int critical_count; unsigned int siglock; spinlock_t lock; /**< Protects wait state and others. */ unsigned int active; /**< Running on a CPU. TODO SMP-only. */ unsigned int ready; /**< Managed by the scheduler. */ unsigned int waiting; /**< Waiting for an event. */ unsigned int state; /**< Thread-specific state. */ struct context context; /**< Architecture-dependent CPU state. */ void *(*run)(void *); /**< Start routine. */ void *run_arg; /**< Argument to pass to start routine. */ union { void *run_ret; /**< Return value of the routine. */ void *joining; /**< A joining thread (if any). */ } /* unnamed */; thread_stack_t stack; /**< Handler for work with thread stack */ __thread_id_t id; /**< Unique identifier. */ struct task *task; /**< Task belong to. */ struct dlist_head thread_link; /**< list's link holding task threads. */ struct sigstate sigstate; /**< Pending signal(s). */ struct sched_attr sched_attr; /**< Scheduler-private data. */ thread_local_t local; thread_cancel_t cleanups; }; 

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдРрд╕реЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЗрдЦ (рд╕рд┐рдЧрд╕реНрдЯреЗрдЯ, рд╕реНрдерд╛рдиреАрдп, рдХреНрд▓реАрдирдЕрдк) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдг рдкреЛрд╕рд┐рдХреНрд╕ рдереНрд░реЗрдбреНрд╕ (pthread) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред

рдирд┐рдпреЛрдЬрдХ рдФрд░ рдирд┐рдпреЛрдЬрди рд░рдгрдиреАрддрд┐

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

 extern void runq_init(runq_t *queue); extern void runq_insert(runq_t *queue, struct thread *thread); extern void runq_remove(runq_t *queue, struct thread *thread); extern struct thread *runq_extract(runq_t *queue); extern void runq_item_init(runq_item_t *runq_link); 


рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рдпреЛрдЬрди рд░рдгрдиреАрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдпреЛрдЬрдирд╛ рд░рдгрдиреАрддрд┐ рдЙрджрд╛рд╣рд░рдг

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

 void runq_item_init(runq_item_t *runq_link) { dlist_head_init(runq_link); } void runq_init(runq_t *queue) { dlist_init(queue); } void runq_insert(runq_t *queue, struct thread *thread) { dlist_add_prev(&thread->sched_attr.runq_link, queue); } void runq_remove(runq_t *queue, struct thread *thread) { dlist_del(&thread->sched_attr.runq_link); } struct thread *runq_extract(runq_t *queue) { struct thread *thread; thread = dlist_entry(queue->next, struct thread, sched_attr.runq_link); runq_remove(queue, thread); return thread; } 


рдпреЛрдЬрдирд╛рдХрд╛рд░

рдЕрдм рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ - рдЕрдиреБрд╕реВрдЪрдХ рдХрд╛ рд╡рд░реНрдгрдиред

рд╢реЗрдбреНрдпреВрд▓рд░ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ

рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдХрд╛рдо рдХрд╛ рдкрд╣рд▓рд╛ рдЪрд░рдг рдЗрд╕рдХреА рд╢реБрд░реВрдЖрдд рд╣реИред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд╛рддрд╛рд╡рд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рддреИрдпрд╛рд░ рдзрд╛рдЧреЗ рдХреА рдПрдХ рдХрддрд╛рд░ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдзрд╛рдЧрд╛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдПрдХ рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдереНрд░реЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕реНрд▓рд╛рдЗрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╢реЗрдбреНрдпреВрд▓рд░ рд▓реЙрдиреНрдЪ рдХреЛрдб:
 int sched_init(struct thread *idle, struct thread *current) { runq_init(&rq.queue); rq.lock = SPIN_UNLOCKED; sched_wakeup(idle); sched_ticker_init(); return 0; } 


рдЬрд╛рдЧреГрддрд┐ рдФрд░ рдПрдХ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдирд╛

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

 /** Locks: IPL, thread. */ static int __sched_wakeup_ready(struct thread *t) { int ready; spin_protected_if (&rq.lock, (ready = t->ready)) t->waiting = false; return ready; } /** Locks: IPL, thread. */ static void __sched_wakeup_waiting(struct thread *t) { assert(t && t->waiting); spin_lock(&rq.lock); __sched_enqueue_set_ready(t); __sched_wokenup_clear_waiting(t); spin_unlock(&rq.lock); } static inline void __sched_wakeup_smp_inactive(struct thread *t) { __sched_wakeup_waiting(t); } /** Called with IRQs off and thread lock held. */ int __sched_wakeup(struct thread *t) { int was_waiting = (t->waiting && t->waiting != TW_SMP_WAKING); if (was_waiting) if (!__sched_wakeup_ready(t)) __sched_wakeup_smp_inactive(t); return was_waiting; } int sched_wakeup(struct thread *t) { assert(t); return SPIN_IPL_PROTECTED_DO(&t->lock, __sched_wakeup(t)); } 


рдЙрдореНрдореАрдж

рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдореЗрдВ рдЬрд╛рдирд╛ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ (рдЬрдм рдЕрдкреЗрдХреНрд╖рд┐рдд рдШрдЯрдирд╛ рдЕрдВрддрддрдГ рд╣реЛрддреА рд╣реИ) рд╢рд╛рдпрдж рдкреНрд░реАрдореЗрдЪреНрдпреЛрд░ рдкреНрд▓рд╛рдирд┐рдВрдЧ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдФрд░ рд╕реВрдХреНрд╖реНрдо рдмрд╛рдд рд╣реИред рдЖрдЗрдП рд╕реНрдерд┐рддрд┐ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрд╕ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рд╕рдордЭрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдШрдЯрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдВрдХреЗрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЛрдЬрдирд╛рдХрд╛рд░ рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рд╣реБрдИ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдЙрд╕рдХреА рдШрдЯрдирд╛ рдХреА рд╢рд░реНрддреЗрдВ рдЕрднреА рддрдХ рдкреВрд░реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдордп рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реА рдШрдЯрдирд╛ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рддреНрдпрд╛рдкрди рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рдЬрд╛рдПрдЧреАред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣рд▓ рдХрд┐рдпрд╛ред
рдореИрдХреНрд░реЛ рдХреЛрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ
 #define SCHED_WAIT_TIMEOUT(cond_expr, timeout) \ ((cond_expr) ? 0 : ({ \ int __wait_ret = 0; \ clock_t __wait_timeout = timeout == SCHED_TIMEOUT_INFINITE ? \ SCHED_TIMEOUT_INFINITE : ms2jiffies(timeout); \ \ threadsig_lock(); \ do { \ sched_wait_prepare(); \ \ if (cond_expr) \ break; \ \ __wait_ret = sched_wait_timeout(__wait_timeout, \ &__wait_timeout); \ } while (!__wait_ret); \ \ sched_wait_cleanup(); \ \ threadsig_unlock(); \ __wait_ret; \ })) 


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

рдП - рд╕рдХреНрд░рд┐рдп
рдЖрд░ - рд░реЗрдбреА
рдбрдмреНрд▓реНрдпреВ - рдкреНрд░рддреАрдХреНрд╖рд╛

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


рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ

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

 static void sched_switch(struct thread *prev, struct thread *next) { sched_prepare_switch(prev, next); trace_point(__func__); /* Preserve initial semantics of prev/next. */ cpudata_var(saved_prev) = prev; thread_set_current(next); context_switch(&prev->context, &next->context); /* implies cc barrier */ prev = cpudata_var(saved_prev); sched_finish_switch(prev); } static void __schedule(int preempt) { struct thread *prev, *next; ipl_t ipl; prev = thread_self(); assert(!sched_in_interrupt()); ipl = spin_lock_ipl(&rq.lock); if (!preempt && prev->waiting) prev->ready = false; else __sched_enqueue(prev); next = runq_extract(&rq.queue); spin_unlock(&rq.lock); if (prev != next) sched_switch(prev, next); ipl_restore(ipl); assert(thread_self() == prev); if (!prev->siglock) { thread_signal_handle(); } } void schedule(void) { sched_lock(); __schedule(0); sched_unlock(); } 


рдкрд░реАрдХреНрд╖рдг рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
 #include <stdint.h> #include <errno.h> #include <stdio.h> #include <util/array.h> #include <kernel/thread.h> #include <framework/example/self.h> /** * This macro is used to register this example at the system. */ EMBOX_EXAMPLE(run); /* configs */ #define CONF_THREADS_QUANTITY 0x8 /* number of executing threads */ #define CONF_HANDLER_REPEAT_NUMBER 300 /* number of circle loop repeats*/ /** The thread handler function. It's used for each started thread */ static void *thread_handler(void *args) { int i; /* print a thread structure address and a thread's ID */ for(i = 0; i < CONF_HANDLER_REPEAT_NUMBER; i ++) { printf("%d", *(int *)args); } return thread_self(); } /** * Example's executing routine * It has been declared by the macro EMBOX_EXAMPLE */ static int run(int argc, char **argv) { struct thread *thr[CONF_THREADS_QUANTITY]; int data[CONF_THREADS_QUANTITY]; void *ret; int i; /* starting all threads */ for(i = 0; i < ARRAY_SIZE(thr); i ++) { data[i] = i; thr[i] = thread_create(0, thread_handler, &data[i]); } /* waiting until all threads finish and print return value*/ for(i = 0; i < ARRAY_SIZE(thr); i ++) { thread_join(thr[i], &ret); } printf("\n"); return ENOERR; } 


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


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

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


All Articles