Работа с динамическим таймером
Несмотря на удачную структуру данных, обработка программных таймеров требует очень много времени, и ее нельзя поручать обработчику таймерных прерываний. В Linux этот вид деятельности поручен функции отложенного выполнения, а точнее, softirq-функции timer softirq.
Функция run timer softirqO является функцией отложенного выполнения, ассоциированной с softirq-функцией timer softirq. Она выполняет следующие действия:
1. Сохраняет в локальной переменной base адрес структуры tvec base t, ассоциированной с локальным процессором.
2. Получает спин-блокировку base->iock и отключает локальные прерывания.
3. Запускает цикл while, который закончится, когда значение base-> timer jiffies превысит значение jiffies. На каждом шаге цикла функция выполняет следующие действия:
• вычисляет индекс списка в поле base->tvi, содержащего таймеры, подлежащие обработке в данный момент:
index = base->timer_jiffies & 255;
• если переменная index равна нулю, значит, все списки в поле base->tvi уже проверены и, следовательно, пусты. Тогда функция организует "протекание" динамических таймеров, вызывая функцию cascade ():
if (!index &&
(!cascade(base, &base->tv2, (base->timer_jiffies» 8)&63)) &&
(!cascade (base, &base->tv3, (base->timer_jiffies»14)&63) ) &&
(!cascade (base, &base->tv4, (base->timer_jiff ies»20) &63) ))
cascade (base, &base->tv5, (base->timer_jiffies»26)&63) ;
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница