Почему система может перестать отвечать на запросы?

12

Я только что выполнил dot(программу для рисования ориентированных графов) с входным файлом, который был настолько большим, что его нельзя было воспроизвести за разумное время.

Вся моя система замерзла. Я едва мог дойти до текстовой консоли с Ctrl+ Alt+, F1чтобы убить dot, но это заняло несколько минут.

Почему система позволяет что-то подобное? Почему он дает некритическую программу, такую ​​как dot99% системы, и использует оставшиеся 1% для обеспечения отзывчивости?

Кристоф Вурм
источник
Возможный дубликат тяжелого дискового ввода-вывода unix.stackexchange.com/questions/5565/… и unix.stackexchange.com/questions/11/…
Джордж М.

Ответы:

15

Именно так работают GNU / Linux и другие многозадачные системы, они разделяют процессор между запущенными процессами, dotне будут иметь 99%, но 100% в течение 99% времени. Каждый процесс доминирует над процессором в течение определенного периода времени.

Это выполняется планировщиками (в linux есть несколько планировщиков, некоторые просто используют обычную стратегию, некоторые стараются уделять больше времени пользовательским интерфейсам и т. Д.).

Теперь, в вашем случае, проблема заключалась в том, что, вероятно, dotпотребовалось не много процессорного времени, а много памяти. И когда программа использует слишком много памяти, происходит перебивание , которое является именно процессом, который заставляет систему зависать не потому, что dotделает много, а потому, что ядру приходится перемещать страницы памяти назад и вперед между дисками (раздел подкачки) и системная память.

Даже если бы dotпросто потребовалось 99% процессорного времени, шансы на то, что переход на текстовый терминал был бы почти мгновенным, происходит из-за того, что ядро ​​должно перемещать данные dotиз памяти, чтобы оно могло Xвернуться в память, чтобы Xвидеть ключи вы просто нажимаете и переходите к текстовому терминалу, затем ядро ​​должно Xвыйти из памяти, для dotкоторой все еще выполняется, а затем также выйти dot, чтобы переместить процессы текстового терминала (возможно, просто login?) обратно в память. (Если это выглядит грязно, это не только потому, что пример грязный - реальность такая грязная.)

Например, если вы войдете в текстовый терминал, вы сможете просто нажимать клавиши, нажимать клавишу Backspace, и это с радостью произойдет в режиме реального времени, но если вы сделаете что-то столь же простое, как запуск небольшого инструмента, такого как ps, он «зависнет» «на какое-то время, потому что он должен освободить память для загрузки ps(и он также должен ждать в очереди дискового ввода-вывода, которая активно используется для перемещения данных в память и из нее, пока он не сможет запросить psу файловой системы) ,

njsg
источник
Хм, поэтому путь к лучшему пользовательскому опыту мог бы определить определенные программы как « липкие » и, таким образом, предотвратить их замену.
Кристоф Вурм
Липкость не работала так с 70-х годов и оригинальной семантики «липкого» бита. Однако вы можете заблокировать (части) программ в памяти, чтобы их нельзя было выгружать. Основное воспоминание - дорогая роскошь, так что это не может быть сделано для всего.
Алексиос
@njsg, спасибо за хорошее объяснение. Последующий вопрос: нет ли способа предотвратить побои? Я понимаю, что подкачка делает использование памяти в целом более эффективным, но должны быть ограничения. ИМХО такой важный процесс, как X, никогда не должен быть удален из памяти. Есть ли способ настроить Unix-подобную систему так, чтобы важные процессы были защищены от перемещения? На сервере это другое дело, но на рабочем столе я бы предпочел аварийно завершить процесс, требующий памяти, чем перестать говорить со мной на рабочем столе.
А.Донда