Потоки ядра pdflush
В ранних версиях Linux существовал поток ядра, называемый bdflush, который систематически сканировал кэш страниц в поисках грязных страниц. Существовал и второй поток ядра, kupdate, для гарантии того, что никакая страница не останется грязной слишком долго. В Linux 2.6 оба потока заменены группой потоков общего назначения, названных pdflush.
Эти потоки ядра имеют гибкую структуру. Они принимают два параметра: указатель на функцию, которую нужно выполнить, и параметр для этой функции. Количество потоков ядра pdflush в системе регулируется динамически. Когда потоков слишком мало, создаются новые, а когда их слишком много, они уничтожаются. Поскольку функции, выполняемые этими потоками ядра, могут быть блокирующими, создание нескольких потоков pdflush вместо одного увеличивает производительность системы.
Рождение и гибель потоков регулируются следующими правилами:
- в системе должно работать минимум два и максимум восемь потоков pdflush;
- если в течение последней секунды не было ни одного простаивающего потока pdflush, должен быть создан новый поток;
- если последний поток pdflush простаивает более одной секунды, он должен быть уничтожен.
Каждый поток ядра pdflush имеет дескриптор pdfiush work. Дескрипторы простаивающих потоков заносятся в список pdfiush iist, а спин- блокировка pdfiush iock защищает этот список от одновременного обращения в многопроцессорных системах. Переменная nr pdfiush threads4 содержит общее количество потоков pdflush (как свободных, так и занятых), а переменная 1 ast_empty_jifs содержит время (в тиках) последнего опустошения списка pdfiush iist потоков ядра pdflush.
Каждый поток ядра pdflush выполняет функцию pdflush , которая содержит бесконечный цикл, работающий, пока поток ядра не будет уничтожен. Предположим, что поток pdflush простаивает. Тогда процесс приостановлен и находится в состоянии task interruptible. Как только поток ядра
"пробуждается”, функция pdflush о обращается к своему дескриптору pdflush work и выполняет функцию обратного вызова, хранящуюся в поле fn,передав ей аргумент, который хранится в поле argo. Когда функция обратного вызова завершает работу, функция pdf lush проверяет значение переменной last empty jifs. Если в течение более одной секунды не было простаивающих потоков pdfiush, и общее количество потоков меньше восьми,
функция pdf lush о запускает еще один поток. В противном случае, если последний элемент в списке pdf lush iist простаивает более одной секунды, и существует более двух потоков ядра pdfiush, функция pdfiush завершает работу. соответствующий поток ядра делает системный вызов exit и тем самым уничтожается. В противном случае функция pdfiush заново вставляет дескриптор pdfiush work потока ядра в список pdfiush iist и переводит поток ядра в состояние сна”.
Функция pdf lush operation используется для активизации простаивающего потока ядра pdfiush. Она принимает два параметра: указатель fn на функцию, которая должна быть выполнена, и аргумент argo. Функция pdfiush_ operation делает следующее:
1. Извлекает из списка pdfiush iist указатель pdf на дескриптор pdfiush work простаивающего потока pdfiush. Если список пуст, она возвращает-1. Если список состоял только из одного элемента, функция записывает в переменную last empty jifs значение jiffies.
2. Сохраняет в pdf->fn и pdf->argO значения параметров fn и argo.
3. Вызывает функцию wake up process , чтобы разбудить” простаивающий поток ядра pdfiush (то есть pdf->who).
Какие задания поручаются потокам ядра pdfiush? Их не очень много, и все они имеют отношение к принудительной записи грязных” данных на диск. В частности, поток pdfiush обычно выполняет одну из следующих функций обратного вызова:
- background writeout — систематически просматривает кэш страниц в поисках грязных страниц, которые можно сбросить на диск;
- wb kupdate — следит за тем, чтобы никакая страница в кэше не оставалась грязной” слишком долго
Предыдущая страница | 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 108 109 110 111 | Следующая страница