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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Описание[править | править код]

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

Причины[править | править код]

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

Способы устранения[править | править код]

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

  • Увеличить объём оперативной памяти компьютера.
  • Сократить число одновременно выполняющихся программ.
  • Заменить программы, требовательные к объёму оперативной памяти, эквивалентами, использующими меньшее количество памяти.
  • Изменить приоритеты процессов так, чтобы часть из них завершилась быстрее и освободила часть ресурсов.
  • Улучшить локальность обращений к памяти в программах, например, заменяя циклы вида:
  // В языке C строки двумерного массива (матрицы) указываются первым индексом 
  int m[256][256]; 
  for (column=0; column<256; column++) { 
    for (row=0; row<256; row++) {
      // Адреса, к которым происходит обращение, меняются с шагом 256 * sizeof(int)
      // Для выполнения внутреннего цикла весь массив должен быть в памяти
      m[row][column] = foo(); 
    } 
  }
на циклы вида
  int m[256][256]; 
  for (row=0; row<256; row++) {
    for (column=0; column<256; column++) {
      // При обращении по столбцам, адреса соответствуют последовательно расположенным ячейкам
      // Для выполнения внутреннего цикла в памяти должна присутствовать только текущая строка
      m[row][column] = foo(); 
    } 
  }

Другие применения термина[править | править код]

Термин также используется для обозначения промахов между другими уровнями иерархии памяти: не только при подкачке страниц с диска в память, но и в ситуации, когда быстродействующее запоминающее устройство небольшого объёма, предназначенное для ускорения доступа к большому, но медленному запоминающему устройству, начинает использоваться таким образом, что исчезает вся выгода от его использования. Примером является пробуксовка кэша, когда шаблон доступа к основной памяти приводит к конкуренции нескольких адресов основной памяти за одни и те же кэш-линии, что сопровождается большим числом промахов кэша. Наибольшую проблему это составляет для кэшей с низкой ассоциативностью. Весьма похожа пробуксовка TLB, где буфер ассоциативной трансляции (TLB) может стать неэффективным при неудачном шаблоне доступа к памяти.

См. также[править | править код]

Примечания[править | править код]

  1. 1 2 Peter J. Denning. Thrashing: Its causes and prevention // Proceedings AFIPS, Fall Joint Computer Conference. — 1968. — Т. 33. — С. 915–922.
  2. Э. Танненбаум. Архитектура компьютера = Structured Computer Organization. — 5-е изд. — СПб.: Питер, 2013. — С. 485. — 884 с. — ISBN 978-5-469-01274-0.