Пробуксовка (информатика)


Пробуксовка (англ. thrashing) в информатике — состояние, когда подсистема виртуальной памяти компьютера находится в состоянии постоянного свопинга, часто обменивая данные в памяти и данные на диске, в ущерб выполнению приложений[1][2]. Это вызывает замедление или практическую остановку работы компьютера. Такое состояние может продолжаться неограниченно долго, пока вызвавшие его причины не будут устранены.

В системах со страничной виртуальной памятью адресное пространство каждого процесса разбито на страницы. Когда объём предоставленной процессам памяти превышает объём имеющейся оперативной памяти, часть страниц может быть выгружена на внешний носитель (барабан или жесткий диск). Поскольку за заданный интервал времени процесс обычно не использует всю доступную ему память, а только её часть, называемую рабочим множеством, это не сказывается на производительности. Однако если сумма рабочих множеств всех процессов превышает объём оперативной памяти, резко возрастает вероятность отказа страницы, то есть отсутствия требуемой страницы в оперативной памяти. Происходит постоянная загрузка страниц рабочих множеств активных процессов и выгрузка страниц неактивных процессов. Поскольку загрузка страницы с внешнего носителя на несколько порядков медленнее обращения к оперативной памяти, производительность компьютера резко падает[1]. Загрузка процессора при этом невысока. Такое состояние и называется пробуксовкой. Термин был впервые использован во времена ленточных операционных систем чтобы описать звук, издаваемый ленточными накопителями при быстрой записи и считывании данных.

Вероятность пробуксовки возрастает, когда сумма рабочих множеств всех процессов превышает объём оперативной памяти. Причинами этого могут быть слишком большое число запущенных процессов, слишком большой объём рабочих множеств процессов из-за нарушения в программах принципа локальности и недостаточный объём оперативной памяти. Пример нарушения принципа локальности проявлялся на мейнфреймах серии IBM System/370, на которых отдельная инструкция могла состоять из инструкции execute, пересекающей границу страницы памяти и указывающей на инструкцию move, также пересекающую границу страницы и предназначенную для перемещения блока данных из диапазона адресов источника, пересекающего границу страницы, в диапазон адресов получателя, пересекающего границу страницы. Таким образом, общее число страниц, адресуемых при выполнении одной такой инструкции — восемь, причем все они должны присутствовать в оперативной памяти одновременно. Если операционная система не сможет этого обеспечить, попытка выполнить инструкцию будет постоянно приводить к отказу страницы и инструкция не выполнится никогда.

Для исключения пробуксовки, вызванной интенсивным свопингом, пользователь может предпринять следующие действия: