Потоки ядра ksoftirqd
В последних версиях ядра у каждого процессора имеется собственный поток ядра ksoftirqd/n. Каждый поток ядра ksoftirqd/n выполняет функцию ksoftirqd о, которая по сути представляет собой следующий цикл:
for(;;) {set_current_state(TASK_INTERRUPTIBLE ); schedule();
/ сейчас в состоянии TASK_RUNNING /while (local_softirq_pending()) { preempt_disable(); do_softirq(); preempt_enable(); cond_resched();
Будучи разбуженным, поток ядра проверяет битовую маску softirq-функций с помощью макроса locai softirq pendingo и, если необходимо, вызывает функцию do softirqO. Если висящих softirq-функций нет, эта функция переводит текущий процесс в состояние task interruptible и вызывает функцию cond reschedo, которая произведет переключение процессов, если этого потребует текущий процесс (флаг tif need resched текущего процесса установлен).
Поток ядра ksoftirqd/n представляет собой решение весьма важной проблемы, требующей компромисса.
Softirq-функции способны повторно активизировать сами себя
Это могут делать как сетевые softirq-функции, так и тасклеты. Кроме того, внешние события, такие как лавина пакетов на сетевой карте, могут активизировать softirq-функции с высокой частотой.
Возможность непрерывного выполнения большого количества softirq- функций создает проблему, которая решается с помощью потоков ядра. Без них разработчики оказываются лицом к лицу с двумя взаимоисключающими стратегиями.
Первая
Заключается в игнорировании новых softirq-функций, появляющихся во время работы функции do softirqO. Иными словами, при таком подходе функция do softirq определяла бы, какие softirq-функции висят к моменту ее старта, и выполняла их. Затем она завершала бы работу без повторной проверки висящих функций. Это решение неудачно. Предположим, некая softirq-функция повторно активизируется во время выполнения функции do softirqO. В худшем случае, эта softirq-функция не будет выполнена до следующего прерывания по таймеру, даже если машина простаивает. Такое время задержки неприемлемо, с точки зрения сетевых разработчиков.
Вторая
Стратегия заключается в постоянных проверках наличия висящих softirq-функций. При этом подходе функция do softirqO все время проверяла бы висящие softirq-функции и завершала бы работу, только когда их нет. В то время как подобное решение, возможно, устроило бы сетевых разработчиков, оно определенно вызовет недовольство среди обычных пользователей. Если сетевая карта будет получать большой объем пакетов, или softirq-функция будет непрерывно активизировать сама себя, то функция do softirqO не возвратит управление, и работа программы в режиме пользователя будет фактически остановлена.
Потоки ядра ksoftirqd/n пытаются найти компромисс в решении этой трудной проблемы. Функция do softirqO определяет, какие softirq-функции висят, и выполняет их. После нескольких итераций, если новые softirq-функции не перестают появляться, функция будит поток ядра и завершает работу. Поток ядра имеет низкий приоритет, и у пользовательских программ появляется шанс выполниться. Если же машина простаивает, висящие softirq-функции будут быстро выполнены.
Предыдущая страница | 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 | Следующая страница