Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ядра LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 67

Автор Π ΠΎΠ±Π΅Ρ€Ρ‚ Π›Π°Π²

Π―Π΄Ρ€ΠΎ прСдоставляСт Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для обСспСчСния микросСкундных ΠΈ миллисСкундных Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅ <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() послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ помСстил сСбя Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ оТидания. Π—Π°Π΄Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ событиС ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Код ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ возвратился ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ β€” это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС, ΠΏΡ€ΠΎΡˆΠ΅Π» ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал β€” послС этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ соотвСтствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.