рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб (рдФрд░ рди рдХреЗрд╡рд▓) рд╕реА # рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рдЕрдХреНрд╕рд░ "рдПрдХ рдмрд╛рд░" рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛, рд╡реАрдПрд╕2012 рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХред
рдкрд░рд┐рдЪрдп
рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдПрдХ рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдФрд░ рд░реЗрдбреА-рдЯреВ-рдпреВрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред
рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХрд┐рд╕реА рдирдИ рд╡рд╕реНрддреБ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдмрдбрд╝рд╛ рдЦрд░реНрдЪ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ .NET рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд╢ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд▓ рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдирд┐рдореНрди рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИ:
- рдРрд╕реА рд╡рд╕реНрддреБрдПрдБ рдЬреЛ рдмрдирд╛рдиреЗ рдФрд░ / рдпрд╛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рдВрдЧреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг: рд╕реЙрдХреЗрдЯ, рдкреНрд░рд╡рд╛рд╣, рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди);
- рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╕реНрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдХреА рд▓рд╛рдЧрдд рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ);
- рдмрд╣реБрдд рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВред
рдореИрдВ рдереЛрдбрд╝рд╛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╕рдордЭрд╛рддрд╛ рд╣реВрдБред рдпрджрд┐ рдЖрдкрдХреА рд╡рд╕реНрддреБ 85,000 рдмрд╛рдЗрдЯреНрд╕ рдпрд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рд░рд╣рддреА рд╣реИ, рддреЛ рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреА рджреВрд╕рд░реА рдкреАрдврд╝реА рдореЗрдВ рдПрдХ рдмрдбрд╝реА рд╡рд╕реНрддреБ рдвреЗрд░ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ "рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╣рдиреЗ рд╡рд╛рд▓реА" рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИред рдЗрд╕ рд╡рд┐рдЦрдВрдбрди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдпрд╣ рдвреЗрд░ рд╕рд┐рдХреБрдбрд╝рддрд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдирд┐рд░рдВрддрд░ рдЖрд╡рдВрдЯрди / рд╡рд┐рдирд╛рд╢ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдкреВрд▓ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдорд╣рдВрдЧреА" рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИ:
var obj = pool.Take();
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ:
- рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкрд┐рдЫрд▓реЗ рдЙрдкрдпреЛрдЧ рдмрд╛рдж рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗрдВ;
- рдкреВрд▓ рдХреЛ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
- рдкреВрд▓ рдХреЛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЗрд╕рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╕реНрддреБ рдЙрдкрд▓рдмреНрдз рди рд╣реЛред
рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдПрдХ рдирдП рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛:
- рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкреВрд▓ рдХреА рд╕реБрд░рдХреНрд╖рд╛ред
- рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкреВрд▓ рдХрд╛рд░реНрдп, рдЬрд┐рд╕рдореЗрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- рдХреЛрдб рдореЗрдВ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧред
- рдХрдореА рд╣реЛрдиреЗ рдкрд░ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдСрдЯреЛ-рдЖрд╡рдВрдЯрди, рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд░рдВрднреАрдХрд░рдгред
- рдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВред
- рдЬрдм рд╡рд╣ рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИ рддреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдСрдЯреЛ-рдХреНрд▓реАрдирд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред
- рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ (рдЕрдзрд┐рдорд╛рдирддрдГ, рдиреНрдпреВрдирддрдо рддреБрд▓реНрдпрдХрд╛рд▓рди рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде)ред
- рдХрдИ рдкреВрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рдпрд╣рд╛рдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрдиреЗ рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВ)ред
рдЙрдкрдпреЛрдЧ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛
рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ IPoolable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рд╕рдорд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдкреВрд▓ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PoolSlot рдЬреЗрдиреЗрд░рд┐рдХ рд╢реЗрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВ рдФрд░ рдкреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИред рдкреВрд▓ рд╣реА рдЗрди рд╕реНрд▓реЙрдЯреНрд╕ рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░рдЧрд░реНрднрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рджреЛ рдЕрд╕рддреНрдп рддрд░реАрдХреЗ рд╣реИрдВред
public abstract class Pool<T> { public PoolSlot<T> TakeSlot() {...}
рд╕реЙрдХреЗрдЯрд╕реЗрдВрд╕реЗрдЯрдЗрд╡реЗрдВрдЯрдЖрд░реНрдЧреНрд╕ рдХреНрд▓рд╛рд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдкреВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ public class SocketClientPool : Pool<SocketAsyncEventArgs> { private readonly int _bufferSize; public SocketClientPool(int bufferSize, int initialCount, int maxCapacity) : base(maxCapacity) { if (initialCount > maxCapacity) throw new IndexOutOfRangeException(); _bufferSize = bufferSize; TryAllocatePush(initialCount);
рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
var pool = new SocketClientPool(1024, 5, 10);
рдпрд╛ рдЗрд╕ рддрд░рд╣ рднреА:
using(var slot = pool.TakeSlot())
рдЬреЛ рд▓реЛрдЧ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ .NET рдореЙрдбрд▓ рдФрд░ / рдпрд╛ рдПрдХ рд╣реА рд╕реЙрдХреЗрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЙрдХреЗрдЯ.рдПрдХреНрд╕рдПрдХреНрд╕рдПрдПрдирдПрдХреНрд╕рдПрдХреНрд╕ рд╡рд┐рдзрд┐рдпрд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕реЙрдХреЗрдЯрд╕реЗрдХреНрд╕реНрдЯрдЗрдиреНрд╡рд╛рдпрд░рд╡реЗрдВрдЯреНрд╕ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИрдВ, рди рдХрд┐ рдХреБрдЫ рдкреВрд▓рд╕рд╛рд▓реНрдЯ <рд╕реЙрдХреЗрдЯрдПрд╕реНрдХреНрдпреВрдЗрд╡реЗрдВрдЯрдПрд╡рд╛рд░реНрдЧреНрд╕> ред рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдВрдд рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕реНрд▓реЙрдЯ рдХрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп SocketAsyncEventArgs.UserToken рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕реЗрд╡ рдХрд░рдирд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣реЛрд▓реНрдбрд╕реНрд▓реЙрдЯрдЗрдирдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ protected override void HoldSlotInObject(SocketAsyncEventArgs @object, PoolSlot<SocketAsyncEventArgs> slot) { @object.UserToken = slot; } pool.Release(args.UserToken as PoolSlot<SocketAsyncEventArgs>);
рдмреЗрд╢рдХ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдЕрднреА рднреА рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ IPoolSlotHolder рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рддреА рд╣реИред рдФрд░ рдЕрдЧрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рд╕реНрд▓реЙрдЯ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рддреЛ рдЯреЗрдХрдСрдмреНрдЬреЗрдХреНрдЯ / рд░рд┐рд▓реАрдЬ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд / рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдЙрдирдХреЗ рд╕реНрд▓реЙрдЯ рдХреЛ рдЕрдВрджрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ), рдЬреЛ рдкреВрд▓ рдХреЗ рд╡рдВрд╢рдЬ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдмреЗрд╣рддрд░ рдкреВрд▓ рдХреЗ рд╕рд░рд▓реАрдХреГрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (IPoolSlotHolder рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП) public abstract class PoolEx<T> : Pool<T> where T : IPoolSlotHolder { public T TakeObject() { ... } public void Release(T @object) { ... } protected sealed void HoldSlotInObject(T @object, PoolSlot<T> slot) { ... }
рдЕрдЧрд▓рд╛, рдореИрдВ рдЖрдВрддрд░рд┐рдХ "рд░рд╕реЛрдИ" рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдХреЛрд╖
рд╕рдорд╡рд░реНрддреА рд╕реНрдЯреИрдХ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ "рдкреВрд▓ рдореЗрдВ" рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреВрд▓ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреВрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ "рд░рдЬрд┐рд╕реНрдЯреНрд░реА" рдХреЛ рд╕рдорд╡рд░реНрддреА рдЫрд╛рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдХрднреА-рдХрднреА рдкреВрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕реНрд▓реЙрдЯреНрд╕ рдХреА рдЖрдИрдбреА рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЙрдкрд▓рдмреНрдзрддрд╛ рдзреНрд╡рдЬ (рд╕рд╣реА - "рдкреВрд▓ рдореЗрдВ", рдЧрд▓рдд - "рдкреВрд▓ рдореЗрдВ рдирд╣реАрдВ") рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдиреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдПрдХ рдкрддреНрдерд░ рд╕реЗ 2 рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреЛ рдорд╛рд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА: рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреЗ рдЧрд▓рдд рдХрдИ рд░рд┐рдЯрд░реНрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП (рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реНрдЯреИрдХ рдЗрд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рджреВрд╕рд░реЗ рдкреВрд▓ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдерд╛, рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛ред
рдмрд╣реБ рд╕реВрддреНрд░рдг
рдкреВрд▓ рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ (.NET рдореЗрдВ рдпрд╣ рд╕реЗрдореАрдлреЛрд░ рдФрд░ рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓реАрдо рд╣реИ) рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдЕрдиреНрдп рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдореЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдорд╡рд░реНрддреАрд╕реНрдЯреИрдХ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдорд╕рд╛рдордпрд┐рдХреА, рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ред рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрдирдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯрд╕реНрдЯреИрдХ.рдХрд╛рдЙрдВрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдкреВрд░реА рдЧрдгрдирд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдЦреБрдж рдХрд╛ рддрддреНрд╡ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдирддреАрдЬрддрди, рдкреВрд▓ рдкрд░ рджреЛ "рдкрд░рдорд╛рдгреБ" рд╕рдВрдЪрд╛рд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗ - рдкреБрд╢ рдФрд░ рдЯреНрд░рд┐рдкрдкреЙрдк, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреНрдп рд╕рднреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рд░рд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди private void Push(PoolSlot<T> item) { _registry[token.Id] = true;
рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдКрдкрд░реА рд╕реАрдорд╛ рддрдХ рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдФрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдпрд╣рд╛рдВ рд╣рдо рдкреВрд▓ (рдКрдкрд░реА рд╕реАрдорд╛) рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕реЗрдореАрдлреЛрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░рд╕реНрд▓реАрдо.рд╡рд┐рдЯ (0) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реЗрдореАрдлреЛрд░ рдХреЗ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп "0" рдХреЗ рд╕рд╛рде, рдмрд┐рдирд╛ рдХрд┐рд╕реА рджреЗрд░реА рдХреЗ рдЭреВрдареЗ рддрд░реАрдХреЗ рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рд╣рд▓реНрдХрд╛ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╣реИ рдХрд┐ LockFreeSemaphore рд╡рд░реНрдЧ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬреЛ, рдЬрдм рдпрд╣ рдмрд┐рдирд╛ рджреЗрд░реА рдХреЗ рд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдЭреВрдареЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рддреЗрдЬ CAS рд╕рдВрдЪрд╛рд▓рди
Interlocked.CompareExchange рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдореЗрдВ рдХреИрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреВрд▓ рдСрдкрд░реЗрд╢рди "рдПрдХ рд╡рд╕реНрддреБ рд▓реЗ" рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- рд╣рдо рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ - рдмрд┐рдВрджреБ 2ред
- рд╣рдо рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рдЕрд░реНрдз-рд╢реВрдиреНрдп (рдКрдкрд░реА рд╕реАрдорд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ) - рдмрд┐рдВрджреБ 3ред
- рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╕реНрддреБ рд╡рд┐рдЬрдпреА рдЕрдВрдд рддрдХ рд▓реМрдЯ рдЖрдПрдЧреАред
рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо, рдЕрдиреБрдХреВрд▓рди рдФрд░ рд░реАрдлреИрдХреНрдЯрд░рд┐рдВрдЧ
рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣ рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ "рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереЛрдбрд╝реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, 1024 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдлрд╝рд░ рдХреЗ рд╕рд╛рде рд╕реЙрдХреЗрдЯреНрд╕рд╕рдВрдХреНрдпреВрдЗрдирдПрд╡реЗрдВрдЯрдПрдЧрд░ (рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рдордп, рдкреВрд▓рд┐рдВрдЧ рд╕рдХреНрд╖рдо):
рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз | рдПрдХрд▓ рдзрд╛рдЧрд╛, рдХреЛрдИ рдкреВрд▓ рдирд╣реАрдВ | рдПрдХрд▓ рдзрд╛рдЧрд╛, рдкреВрд▓ рдХреЗ рд╕рд╛рде | 25 рдХрд╛рд░реНрдп *, рдмрд┐рдирд╛ рдкреВрд▓ рдХреЗ | рдПрдХ рдкреВрд▓ рдХреЗ рд╕рд╛рде 25 рдХрд╛рд░реНрдп * |
1000 | 0.002 | 0.003 | 0.027 | 0.009 |
10000 | 0.010 | 0.001 | 0.272 | 0.039 |
25000 | 0.030 | 0.003 | 0.609 | 0.189 |
50000 | 0.048 | 0.006 | 1.285 | 0.287 |
1000000 | 0.959 | 0.125 | 27,965 | 8345 |
* рдХрд╛рд░реНрдп - class System.Threading.Tasks.Task TPL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ, .NET 4.0 рд╕реЗ рд╢реБрд░реВ
рдкреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкрд░реАрдХреНрд╖рдг рдкрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ VS2012 рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ ConcurrentStack.TryPop рдкрджреНрдзрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ (рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ) рдореЗрдВ рддреЗрдЬреА рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ "рд░рдЬрд┐рд╕реНрдЯреНрд░реА" рдХреЗ рд▓рд┐рдП рдЕрдкреАрд▓ рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ 14% рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреВрд▓ рдХреЗ рдЕрдВрджрд░ рджреВрд╕рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рд╕рдорд░реНрдерди рд╡реИрд╕реЗ рднреА рдПрдХ рдмреИрд╕рд╛рдЦреА рд▓рдЧрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП "рдкреВрд▓ рдореЗрдВ / рдкреВрд▓ рдореЗрдВ рдирд╣реАрдВ" рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо (рд╡рд┐рдХрд╛рд╕, рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, 30-40%):
рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз | рдПрдХ рдкреВрд▓ рдХреЗ рд╕рд╛рде 25 рдХрд╛рд░реНрдп |
25000 | 0.098 |
1000000 | 5.751 |
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдП рдЧрдП рдереЗ:
- рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ - рдЬреЗрдиреЗрд░рд┐рдХ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧред
- рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкреВрд▓ рдХрд╛ рдХрд╛рд░реНрдп рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред
- рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг рд╣реИ (рдЖрдИрдбреАрд╕реЙрд░реНрдкреЛрд░реЗрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╢реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди)ред
- рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕реНрд╡рддрдГ-рдЪрдпрди рд╕рд╛рд░ рдкреВрд▓ рд╣реИред рд╡рд┐рд╢реЗрд╖рдг рдЕрд╡рд░реЛрдзрдХ рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрдк рдХреА рддрд░рд╣ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдПрдХ рд╣рд▓реНрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
- рдСрдЯреЛ-рдХреНрд▓реАрдирд┐рдВрдЧ рдПрдХ рд╡рд╕реНрддреБ рдЬрдм рдЗрд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдкреВрд▓ рд╣реИред рдХреНрд▓реЗрдпрдирдЕрдк рд╡рд┐рдзрд┐, рдЬрд┐рд╕реЗ рд░рд┐рдЯрд░реНрди рдХрд░рддреЗ рд╕рдордп рдкреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ - рд╕рдорд╡рд░реНрддреА рд╕реНрдЯреИрдХ рдФрд░ рдХреИрд╕ рд╕рдВрдЪрд╛рд▓рди (рдЗрдВрдЯрд░рд▓рд╛рдХреНрдб рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ) рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
- рдХрдИ рдкреВрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди - рдкреВрд▓ рд╡рд░реНрдЧ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рдВрдЧрд▓рдЯрди рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╡реИрдзрддрд╛ рдЪреЗрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдФрд░ рдЯреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реЛрд░реНрд╕ рдХреЛрдб:
рдЬреАрдердмрдпрджрд┐ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЯреАрд╕реАрдкреА рдФрд░ рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд▓реЗрдЦ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреВрд▓ рдмрд╕ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред