Π―Π΄ΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Π½ΡΡ ΠΈ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΡΠ°ΠΉΠ»Π΅ <linux/delay.h> ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ jiffies.
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
ΠΠ΅ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΊΠ»Π°. ΠΡΠΎΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄. Π‘Π»Π΅Π΄ΡΠ΅Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΎΠ΄Π½Π° ΡΠ΅ΠΊΡΠ½Π΄Π° ΡΠ°Π²Π½Π° 1000 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°ΠΌ, ΡΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ 1000000 ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎ.
udelay(150); /* Π·Π°Π΄Π΅ΡΠΆΠΊΠ° Π½Π° 150 ΞΌs */
Π€ΡΠ½ΠΊΡΠΈΡ udelay() Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΈΠΊΠ»Π°, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ mdelay() Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ udelay(). Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠ΄ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΠΊΠ»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π² ΠΎΠ΄Π½Ρ ΡΠ΅ΠΊΡΠ½Π΄Ρ (ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½ΠΈΠΆΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ BogoMlPS), ΡΡΠ½ΠΊΡΠΈΡ udelay() ΠΏΡΠΎΡΡΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅Ρ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΈΠΊΠ»Π° Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
ΠΠΎΠΉ BogoMIPS Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Ρ ΠΠ°Ρ!Π₯Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° BogoMlPS Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ»Π° ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π½Π΅Π΄ΠΎΡΠ°Π·ΡΠΌΠ΅Π½ΠΈΠΉ ΠΈ ΡΡΡΠΎΠΊ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ BogoMlPS Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ udelay() ΠΈ mdelay(). ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ bogus (ΡΠΈΠΊΡΠΈΠ²Π½ΡΠΉ) ΠΈ MIPS (million of instructions per second, ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ). ΠΡΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΄Π°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ (Π΄Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ Pentium III Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ 1 ΠΠΡ).
Detected 1004.932 MHz processor.
Calibrating delay loop... 1990.65 BogoMlPS
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° BogoMIPS - ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠΊΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π° ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ! ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ loops_per_jiffy, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° /proc/cpuinfo.
Π€ΡΠ½ΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΠΈΠΊΠ»Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ (ΠΈ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΎΡΠ½ΠΎ), ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ.
Π―Π΄ΡΠΎ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ loops_per_jiffy ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ calibrate_delay(), ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΡΠ°ΠΉΠ»Π΅ init/main.c.
Π€ΡΠ½ΠΊΡΠΈΡ udelay() Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π½Π° Π±ΡΡΡΡΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΈΠΊΠ»Π°. ΠΠ±ΡΠ΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ: ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ udelay() Π΄Π»Ρ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ Ρ ΠΎΡΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ mdelay(). Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π° ΡΠΈΠΊΠ»Π°Ρ , ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΡ mdelay(), ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π΄Π°Π΅Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ) Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠ»ΠΎΡ ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΊΠ»Ρ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, ΠΊΠΎΠ³Π΄Π° ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠΈΠ»ΡΠ½ΠΎ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ, ΡΠΎ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ β Π½Π°ΠΈΠ»ΡΡΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ±ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ β ΡΡΠΎ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π½Π° Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π»Π΅ΠΆΠΈΡ Π² ΠΌΠΈΠΊΡΠΎΡΠ΅ΠΊΡΠ½Π΄Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅.
Π€ΡΠ½ΠΊΡΠΈΡ schedule_timeout()
ΠΠΎΠ»Π΅Π΅ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ schedule_timeouit(). ΠΡΠΎΡ Π²ΡΠ·ΠΎΠ² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (sleep) ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠ½ΠΎ ΡΠ°Π²Π½ΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° Π±ΡΠ΄Π΅Ρ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΄ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (wake up) ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΡΡΠΎ.
/* ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΡ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ */
set_current_state(TASK_INTERRUPTIBLE);
/* ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π² ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° s ΡΠ΅ΠΊΡΠ½Π΄ */
schedule_timeout(s * HZ);
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ β ΡΡΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, Π²ΡΡΠ°ΠΆΠ΅Π½Π½ΠΎΠ΅ Π² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ°. Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ Π΄Π»ΠΈΡΡΡΡ s ΡΠ΅ΠΊΡΠ½Π΄. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΊΠ°ΠΊ TASK_INTERRUPTIBLE, ΡΠΎ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π½ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠΈΠ³Π½Π°Π». ΠΡΠ»ΠΈ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π» ΡΠΈΠ³Π½Π°Π»Ρ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ TASK_UNINTERRUPTIBLE. ΠΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ schedule_timeout() Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΡΠΈΡ Π΄Π²ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ, ΠΈΠ½Π°ΡΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
Π‘Π»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ schedule_timeout() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ, ΡΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π΅Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² Π³Π»Π°Π²Π°Ρ 8 ΠΈ 9. ΠΡΠ»ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΎ, ΡΠΎ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Π½Π΅ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ.
Π€ΡΠ½ΠΊΡΠΈΡ schedule_timeout() Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°. ΠΠ½Π° ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΠΉΠΌΠ΅ΡΡ ΡΠ΄ΡΠ°. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
signed long schedule_timeout(signed long timeout) {
timer_t timer;
unsigned long expire;
switch (timeout) {
case MAX_SCHEDULE_TIMEOUT:
schedule();
goto out;
default:
if (timeout < 0) {
printk(KERN_ERR "schedule_timeout: wrong timeout "
"value %lx from %p\n", timeout, builtin_return_address(0));
current->state = TASK_RUNNING;
goto out;
}
}
expire = timeout + jiffies;
init_timer(&timer);
timer.expires = expire;
timer.data = (unsigned long) current;
timer.function = process_timeout;
add_timer(&timer);
schedule();
del_timer_sync(&timer);
timeout = expire - jiffies;
out:
return timeout < 0 ? 0 : timeout;
}
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ timer ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ timeout ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ° Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ process_timeout(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ°. ΠΠ°Π»Π΅Π΅ ΡΠ°ΠΉΠΌΠ΅Ρ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ, ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ schedule(). Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ TASK_INTERRUPTIBLE ΠΈΠ»ΠΈ TASK_UNINTERRUPTIBLE, ΡΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅, Π° Π²ΡΠ±Π΅ΡΠ΅Ρ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ.
ΠΠΎΠ³Π΄Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ, ΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ process_timeout(), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄.
void process_timeout(unsigned long data) {
wake_up_process((task_t*)data);
}
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ TASK_RUNNING ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ Π΅Π³ΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
ΠΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½ΠΈΠ΅ ΡΠ½ΠΎΠ²Π° ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠΎ ΠΎΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ schedule_timeout() (ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ schedule()). ΠΡΠ»ΠΈ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΆΠ΄Π΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΡΠΎ ΡΠ°ΠΉΠΌΠ΅Ρ Π»ΠΈΠΊΠ²ΠΈΠ΄ΠΈΡΡΠ΅ΡΡΡ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ.
ΠΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° switch() ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°Π΅Π² ΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ MAX_SCHEDULE_TIMEOUT ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π°Π½ΠΈΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΉΠΌΠ΅Ρ Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ), ΠΈ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ. ΠΡΠ»ΠΈ Π²Ρ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅, ΡΠΎ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Ρ Π²Π°Ρ Π΅ΡΡΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Π²Π΅ΡΠ½ΡΡΡ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ!
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ wait queue Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈΠ Π³Π»Π°Π²Π΅ 4 ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π»ΠΎΡΡ, ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΡΠ΄ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅Π±Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΆΠ΄Π°ΡΡ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·Π²Π°ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ±Π΅ΡΠ΅Ρ Π½ΠΎΠ²ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π³Π΄Π΅-ΡΠΎ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅, ΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ wake_up() Π΄Π»Ρ Π²ΡΠ΅Ρ Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΡΠΈ Π·Π°Π΄Π°Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ.
ΠΠ½ΠΎΠ³Π΄Π° ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π½Π°ΡΡΡΠΏΠΈΡ ΡΠ°Π½ΡΡΠ΅, Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ schedule_timeout() Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ schedule() ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ» ΡΠ΅Π±Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΠ°Π΄Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΎ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΉΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎΠ΄ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΠ»ΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ β ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅, ΠΏΡΠΎΡΠ΅Π» ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» β ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.