Жетон защиты от выгрузки
Как вы, вероятно, поняли из этой главы, подсистема виртуальной памяти Linux и, особенно, алгоритм утилизации страничных кадров имеют настолько сложный код, что очень трудно предсказать их поведение при произвольной нагрузке на систему. Более того, возможны ситуации, в которых подсистема виртуальной памяти проявляет патологическое поведение. Примером является так называемый феномен засорения подкачки. Когда в системе ощущается нехватка свободной памяти, алгоритм утилизации страничных кадров энергично пытается освободить память, записывая страницы на диск и отбирая соответствующие страничные кадры у некоторых процессов. В то же время эти процессы стремятся продолжить выполнение и активно пытаются обратиться к своим страницам. В результате ядро выделяет для процессов страничные кадры, только что освобожденные алгоритмом PFRA, и читает их содержимое с диска. Дело кончается тем, что страницы постоянно записываются на диск и считываются с него, значительная часть времени уходит на обращение к диску, и никакой процесс не продвигается заметно к своему завершению.
Чтобы уменьшить вероятность засорения выгрузки, в версии ядра 2.6.9 была реализована методика, предложенная Джянгом (Jiang) и Жэнгом (Zhang) в 2004 г. Так называемый жетон защиты от выгрузки присваивается единственному процессу в системе. Этот жетон освобождает процесс от утилизации страничных кадров, позволяя ему выполняться и, возможно, завершиться даже в условиях дефицита памяти.
Жетон защиты от выгрузки реализован в виде указателя swap token mm на дескриптор памяти. Когда процесс обладает этим жетоном, указатель swap token mm содержит адрес дескриптора памяти, принадлежащего процессу.
Иммунитет от утилизации страничных кадров обеспечивается простым и элегантным способом. Как мы видели в разд. "Списки давно неиспользуемых страниц (LRU)" ранее в этой главе, страница переносится из активного списка в неактивный, только если к ней не было обращений за последнее время. Проверка выполняется функцией page referenced, которая принимает во внимание жетон защиты от выгрузки и возвращает 1 ("к странице были обращения”), если страница принадлежит области памяти процесса, обладающего жетоном. На самом деле, есть пара случаев, в которых жетон защиты от
выгрузки не принимается во внимание: когда алгоритм утилизации страничных кадров работает ради самого обладателя жетона, а также когда алгоритм достиг самого высокого приоритета утилизации страничных кадров (уровня 0).
Функция grab_swap_token определяет, должен ли жетон защиты от выгрузки выдаваться текущему процессу. Она вызывается при каждой серьезной ошибке обращения к странице, а именно в двух ситуациях:
- когда функция fiiemap_nopage обнаруживает, что запрошенной страницы нет в кэше (см. разд. "Выделение страниц по требованию для отображения в память"главы 16);
- когда функция do swap page
- прочитала новую страницу из области
Функция grab_swap_token перед выдачей жетона выполняет ряд проверок. В частности, жетон выдается, если выполнены все перечисленные условия:
- с момента последнего вызова функции grab swap token прошло не менее двух секунд;
- процесс-держатель жетона не возбудил серьезной ошибки обращения к странице с момента последнего вызова функции grab_swap_token, либо ОН владеет жетоном, как минимум, В течение swap_token_default_timeout тиков;
- жетон защиты от выгрузки не выдавался недавно текущему процессу.
Время владения жетоном в идеале должно быть довольно продолжительным, доходя до нескольких минут, потому что цель выдачи жетона в том, чтобы позволить процессу завершиться. В Linux 2.6.11 время владения жетоном по умолчанию крайне мало — один тик. Однако системный администратор может изменить значение переменной swap token default timeout, отредактировав файл /proc/sys/vm/swap_token_default_timeout или сделав соответствующий системный вызов syscti .
Когда процесс уничтожен, ядро проверяет, был ли он держателем жетона защиты от выгрузки, и, если был, освобождает жетон. Это делает функцияmmput
Предыдущая страница | 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 | Следующая страница