рднрд╛рдЧреНрдп рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ, рдореИрдВ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд╕рдВрдЧрдарди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЫрджреНрдо-рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ, рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдкрд░ рд╕рдордп рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдмреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рд╕рдореБрджрд╛рдп рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд╡рд░реЗрдЬ рдореЗрдВ рдЕрдкрдирд╛ рдорд╛рдореВрд▓реА рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ (рд╕рд╣рдХрд╛рд░реА рдФрд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдлрд┐рд░ рдореИрдВ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд┐рдпреЛрдЬрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реВрдБрдЧрд╛ред рдХрд╣рд╛рдиреА рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдП рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ рдЬреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдУрдПрд╕ рдХреЗ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдкрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕реЗ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдХрднреА рднреА "рд╕реНрд╡рд╛рдж рд▓реЗрдиреЗ" рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛рдХрд╛рд░ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИред рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА, рдЖрдк рддреБрд░рдВрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдХреЛрдб
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЦреИрд░, рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕реАрд▓ред
рдкрд░рд┐рдЪрдп
рдкрд╣рд▓реЗ рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ "рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ" рд╢рдмреНрдж рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред рдпрд╣рд╛рдБ рд░реВрд╕реА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рджреА рдЧрдИ рд╣реИ:
рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ (рдЕрдВрдЧреНрд░реЗрдЬреА рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ) - рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ (рдпрд╛ рдЫрджреНрдо-рд╕рдорд╛рдирд╛рдВрддрд░) рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕рдВрдкрддреНрддрд┐ред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдХрдо рд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:
рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ, рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдорд╛рди рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕рд╛рдзрди, рдЬреИрд╕реЗ 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 { uint32_t eip; uint32_t ebx; uint32_t edi; uint32_t esi; uint32_t ebp; uint32_t esp; uint32_t eflags; };
рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рдкреНрд▓рд╛рдирд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдореМрд▓рд┐рдХ рд╣реИрдВред
рдкреНрд░рд╕рдВрдЧ рд╕реНрд╡рд┐рдЪ
рдкреНрд░рд╕рдВрдЧ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ - рдПрдХ рдзрд╛рдЧреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ред рд╢реЗрдбреНрдпреВрд▓рд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдХрд┐ рд╢реЗрдбреНрдпреВрд▓рд░ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рдХреНрд░рд┐рдп рдереНрд░реЗрдб рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореЙрдбрд▓ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдиреБрд╕реВрдЪрдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрд╛рд╣рд░реА рдШрдЯрдирд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡реНрдпрд╡рдзрд╛рди - рдФрд░ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд╣рд░реА рдШрдЯрдирд╛ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдЯрд╛рдЗрдорд░ рд╣реИ, рдЬреЛ рд╕рдХреНрд░рд┐рдп рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдЧрд┐рдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХрд╛ рдПрдХ рд╕реНрд░реЛрдд рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдЯрд╛рдЗрдорд░, рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЯрд╛рдЗрдо рдореИрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
X86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдкреНрд░рдХреНрд░рд┐рдпрд╛:
.global context_switch context_switch: movl 0x04(%esp), %ecx movl (%esp), %eax movl %eax, CTX_X86_EIP(%ecx) movl %ebx, CTX_X86_EBX(%ecx) movl %edi, CTX_X86_EDI(%ecx) movl %esi, CTX_X86_ESI(%ecx) movl %ebp, CTX_X86_EBP(%ecx) add $4, %esp movl %esp, CTX_X86_ESP(%ecx) pushf pop CTX_X86_EFLAGS(%ecx) movl 0x04(%esp), %ecx movl CTX_X86_EBX(%ecx), %ebx movl CTX_X86_EDI(%ecx), %edi movl CTX_X86_ESP(%ecx), %esi movl CTX_X86_EBP(%ecx), %ebp movl CTX_X86_ESP(%ecx), %esp push CTX_X86_EFLAGS(%ecx) popf movl CTX_X86_EIP(%ecx), %eax push %eax ret
рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреЗрдЯ рдорд╢реАрди
рд╣рдордиреЗ рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЧреИрд░-рдкреНрд░реАрдореЗрдкреНрдЯрд┐рд╡ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА - рд╕рдВрджрд░реНрдн рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рд▓реЗрдХрд░ рдкреВрд░реНрдг рд╣реЛрдиреЗ рддрдХ рдПрдХ рдзрд╛рд░рд╛ рдХреНрдпрд╛ рд╣реЛрддреА рд╣реИ:
- рд╕реНрдЯреЗрдЯреНрд╕ рдЗрдирд┐рдЯ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдереНрд░реЗрдб рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдореЗрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдб рдиреЗ рдЕрдкрдирд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
- рд░рди рд╕реНрдЯреЗрдЯ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рддреИрдпрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╕реВрдЪрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдЕрдиреБрд╕реВрдЪрдХ рдХреА рдХрддрд╛рд░ рдореЗрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╡рд╕реНрдерд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдзрд╛рдЧрд╛ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рд╕рдордп рдХреА рдорд╛рддреНрд░рд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╕ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рд╕реЛ рдЬрд╛рдУ рдФрд░ рдЗрд╕ рд╕рдордп рдХреЗ рдмрд╛рдж рдЙрд╕ рд╕реНрдерд╛рди рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрд╣рд╛рдВ рд╡рд╣ рд╕реЛ рдЧрдпрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрд▓)ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдзрд╛рдЧрд╛ рд╡рд┐рднрд┐рдиреНрди рд░рд╛рдЬреНрдпреЛрдВ (рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░, рд╕реНрдЯреИрдВрдбрдмрд╛рдп рдореЛрдб рдореЗрдВ рдФрд░ рдЗрддрдиреЗ рдкрд░) рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЧреИрд░-рднреАрдбрд╝ рд╡рд╛рд▓реЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдкрд░ рдПрдХ рдзреНрд╡рдЬ рд╣реЛрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЗрд╕ рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд░рд╛рдЬреНрдп рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдзрд╛рдЧрд╛ рд╕реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рддрдХ рд╡рд╣ рдЬрд╛рдЧ рдирд╣реАрдВ рдЬрд╛рддрд╛, рдЙрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдм рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдПрдкреАрдЖрдИ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЬреНрдЮрд╛рди рдЧрд╣рд░рд╛рддреЗ рд╣реИрдВред
рд░рд╛рдЬреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдпрджрд┐ рдЖрдк рд░рд╛рдЬреНрдп рдЖрд░реЗрдЦ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ init рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрд╡рд╕реНрдерд╛рдПрдБ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ: рджреЛрдиреЛрдВ рд╣реА рддреИрдпрд╛рд░ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЕрдкрдирд╛ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрдирд┐рдЯ рдЕрд╡рд╕реНрдерд╛ рдмреЗрдорд╛рдиреА рд╣реИред
рдЕрдм рд╣рдо рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдЗрд╕ рд░рд╛рдЬреНрдп рдХреА рдЕрдкрдиреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╢реЗрдбреНрдпреВрд▓рд░ рдкрд░ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдХреА рдЪрд░реНрдЪрд╛ рдиреАрдЪреЗ рдХреА рдЬрд╛рдПрдЧреАред рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдорд╛рдкрди рджреЛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдкрд╣рд▓рд╛ - рдзрд╛рдЧрд╛ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ - рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдереНрд░реЗрдб рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдЕрдкрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдереНрд░реЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╢реЗрдбреНрдпреВрд▓рд░ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рднреА рдХрд░рддрд╛ рд╣реИред рд╢реЗрдбреНрдпреВрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдереНрд░реЗрдб рдХреЛ рдХрднреА рднреА рдХрд╛рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирд┐рдХрд╛рд╕ рд░рд╛рдЬреНрдп рдХрд╛ рдПрдХ рд╣реА рдореВрд▓реНрдп рд╣реИ - рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдзрд╛рд░рд╛ рдПрдХ рдирдпрд╛ рд╕рдордп рдХреНрд╡рд╛рдВрдЯрдо рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИ, рдЗрд╕реЗ рдЕрдиреБрд╕реВрдЪрдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдПрдХ рдЕрд▓рдЧ рд░рд╛рдЬреНрдп рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рд░рд╛рдЬреНрдп рд╣реИрдВред рд╣рдо рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЪреЗрдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд░ рдорд╛рдорд▓реЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЗ рдХрд╛рд░рдг, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдРрд╕рд╛ рдирд┐рд░реНрдгрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддреЛ, рдзрд╛рд░рд╛ рдХреА рд╕реНрдерд┐рддрд┐:
- рд╕рдХреНрд░рд┐рдп - рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд▓реЙрдиреНрдЪ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд
- рдкреНрд░рддреАрдХреНрд╖рд╛ - рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЗрдирд┐рдЯ рдФрд░ рдПрдХреНрдЬрд┐рдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
- рддреИрдпрд╛рд░ - рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдереНрд░реЗрдбреНрд╕ рдХреА рдХрддрд╛рд░ рдореЗрдВ рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд░рд╛рдЬреНрдп рдЙрд╕ рдЪрд┐рддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рд╡реНрдпрд╛рдкрдХ рд╣реИ рдЬреЛ рд╣рдо рдЪрд┐рддреНрд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдХреНрд░рд┐рдп рдФрд░ рддреИрдпрд╛рд░, рдЬрдмрдХрд┐ рддреИрдпрд╛рд░ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдХреНрд░рдордг рд░рд╛рдЬреНрдп рд╣реИрдВ рдЬрд╣рд╛рдВ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдиреАрдЪреЗ рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рд╕реГрдЬрди
рдПрдХ рдзрд╛рдЧрд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЖрд░рдВрднреАрдХрд░рдг (рдереНрд░реЗрдб_рдЗрдирд┐рдЯ рдлрд╝рдВрдХреНрд╢рди) рдФрд░ рдереНрд░реЗрдб рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╢реБрд░реБрдЖрдд рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рдореЗрдореЛрд░реА рдХреЛ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрджрд░реНрдн рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХ рдЭрдВрдбреЗ рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдо рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░рд╡рд╛рд╣ рдХреА рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдЕрдиреБрд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрдиреБрд╕реВрдЪрдХ рдХреЛ рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рди рд╣реЛ рдЬрд╛рдПред рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдзрд╛рдЧрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╛ рддреЛ рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдереНрд░реЗрдб рдкреНрд░рд╛рд░рдВрдн рдлрд╝рдВрдХреНрд╢рди рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рдПрдХ рд░рди / рд╡реЗрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЗрд╕реЗ рдиреАрдЪреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрддрд╛рдПрдВ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╢реЗрдбреНрдпреВрд▓рд░ рдХрддрд╛рд░ рдореЗрдВ рдереНрд░реЗрдб рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рддреЛ, рдереНрд░реЗрдб_рдХреНрд░рд┐рдПрдЯ рдФрд░ рдереНрд░реЗрдб_рдЗрдирд┐рдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:
struct thread *thread_create(unsigned int flags, void *(*run)(void *), void *arg) { int ret; struct thread *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++; dlist_init(&t->thread_link); 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; t->run = run; t->run_arg = arg; t->joining = NULL;
рдЦрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛
рдПрдХ рдзрд╛рдЧрд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рджреВрд╕рд░реЗ рд╕рдордп рдХреЛ рдЕрдкрдирд╛ рд╕рдордп рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдВрдж рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдмреБрд▓рд╛рдХрд░ред рдпрд╣реА рд╣реИ, рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧрд╛ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рд╕реЗ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рддрдХ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЧреИрд░-рдирд┐рд╡рд╛рд░рдХ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдЭрдВрдбрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА рдзрд╛рд░рд╛ рдХреЛ рджреВрд╕рд░реА рдХрддрд╛рд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗред рд╡реЗрдЯрд┐рдВрдЧ рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкрдВрдХреНрддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реИред рдзрд╛рд░рд╛ рдХреЛ рди рдЦреЛрдиреЗ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрддрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рд╡реНрдпрд╕реНрдд рдореНрдпреВрдЯреЗрдХреНрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд╕реЛ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рдЦреБрдж рдХреЛ рд░рдЦрддрд╛ рд╣реИред рдФрд░ рдЬрдм рдПрдХ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рдзрд╛рдЧреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреА рд░рд┐рд╣рд╛рдИ, рдпрд╣ рдЙрд╕реЗ рдЬрдЧрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдзрд╛рдЧреЗ рдХреЛ рддреИрдпрд╛рд░ рдХрддрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдПрдВрдЧреЗ, рдЬрдм рд╣рдо рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдХреЛрдб рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред
рдкреНрд░рд╡рд╛рд╣ рдкреВрд░реНрдг рд╣реЛрдирд╛
рдпрд╣рд╛рдВ рдзрд╛рдЧрд╛ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдереНрд░реЗрдб рдиреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдирд┐рдХрд╛рд╕ рд░рд╛рдЬреНрдп рдХреА рдЕрддрд┐рд░реЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдЕрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред
void __attribute__((noreturn)) thread_exit(void *ret) { struct thread *current = thread_self(); struct task *task = task_self(); struct thread *joining; if (task->main_thread == current) { task_exit(ret); } sched_lock(); current->waiting = true; current->state |= TS_EXITED; joining = current->joining; if (joining) { current->run_ret = ret; sched_wakeup(joining); } if (current->state & TS_DETACHED) thread_delete(current); schedule(); sched_unlock(); 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)); res = current->run(current->run_arg); thread_exit(res); }
рд╕рд╛рд░рд╛рдВрд╢: рд╕реНрдЯреНрд░реАрдо рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд╡рд░рдг
рдЗрд╕рд▓рд┐рдП, рднреАрдбрд╝-рднрд╛рдбрд╝ рд╡рд╛рд▓реЗ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдЬрд╛рдирдХрд╛рд░реА (рд╕рдВрджрд░реНрдн)ред
- рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рдЪрд╛рд╣реЗ рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реЛред
- рдЖрдИрдбреАред рдХрд┐рд╕реА рд╕рд░рдгреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред
- рдкреНрд░рд╛рд░рдВрдн рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХ, рд╢рд╛рдпрдж рдкрд░рд┐рдгрд╛рдо рднреАред
- рдореЗрдореЛрд░реА рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдкрддрд╛ рдЬреЛ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
struct thread { unsigned int critical_count; unsigned int siglock; spinlock_t lock; unsigned int active; unsigned int ready; unsigned int waiting; unsigned int state; struct context context; void *(*run)(void *); void *run_arg; union { void *run_ret; void *joining; } ; thread_stack_t stack; __thread_id_t id; struct task *task; struct dlist_head thread_link; struct sigstate sigstate; struct sched_attr sched_attr; 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; }
рдЬрд╛рдЧреГрддрд┐ рдФрд░ рдПрдХ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рдЧрдиреЗ рдФрд░ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИ, рд╡рд╣рд╛рдВ рд╣рдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рдЧреНрд░рдд рд╣реЛрдиреЗ рдкрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЬрд┐рд╕ рдЪрд┐рд╣реНрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдереНрд░реЗрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ: рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЛ рдЪреБрдХреЗ рд╣реИрдВ рдпрд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, "рдкреНрд░рддреАрдХреНрд╖рд╛"ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрдЯреНрд░реАрдо рдЕрднреА рднреА рддреИрдпрд╛рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рдЧреГрддрд┐ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо рд╢реЗрдбреНрдпреВрд▓рд░ рдХрддрд╛рд░ рдореЗрдВ рдзрд╛рдЧрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдирдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреИрдпрд╛рд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рдг рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЬрд╛рдЧреГрдд рдзрд╛рд░рд╛ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд░реНрддрдорд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рддрд╛рд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдкреВрд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рд╡реНрдпрд╡рдзрд╛рди рдЕрдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВредрдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрд╕рдПрдордкреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдХреА рдЬрд╛рдЧреГрддрд┐ рдФрд░ рд╢реБрд░реБрдЖрдд рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдЖрдкрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред static int __sched_wakeup_ready(struct thread *t) { int ready; spin_protected_if (&rq.lock, (ready = t->ready)) t->waiting = false; return ready; } 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); } 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__); cpudata_var(saved_prev) = prev; thread_set_current(next); context_switch(&prev->context, &next->context); 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 рдкрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИредрдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдереНрд░реЗрдб рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреБрд╕реВрдЪрдХ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓реЗ рдореЗрдВ рд╕рдордп рджреЗрддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдХрд┐ рд╢реЗрдбреНрдпреВрд▓рд░ рдХреА рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕рдЯреАрдХрддрд╛ рд╣реИ (рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓рдиреАрдп рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рдкрд╛рд╕ рдореЗрдВ, рдереНрд░реЗрдб рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪрдХреНрд░реЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВредрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреЛ рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВрдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВредрдпрджрд┐ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдпреЛрдЬрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рд╖рдп рдЦреБрд▓реЗ рд╣реИрдВред