Именно так работают GNU / Linux и другие многозадачные системы, они разделяют процессор между запущенными процессами, dotне будут иметь 99%, но 100% в течение 99% времени. Каждый процесс доминирует над процессором в течение определенного периода времени.
Это выполняется планировщиками (в linux есть несколько планировщиков, некоторые просто используют обычную стратегию, некоторые стараются уделять больше времени пользовательским интерфейсам и т. Д.).
Теперь, в вашем случае, проблема заключалась в том, что, вероятно, dotпотребовалось не много процессорного времени, а много памяти. И когда программа использует слишком много памяти, происходит перебивание , которое является именно процессом, который заставляет систему зависать не потому, что dotделает много, а потому, что ядру приходится перемещать страницы памяти назад и вперед между дисками (раздел подкачки) и системная память.
Даже если бы dotпросто потребовалось 99% процессорного времени, шансы на то, что переход на текстовый терминал был бы почти мгновенным, происходит из-за того, что ядро должно перемещать данные dotиз памяти, чтобы оно могло Xвернуться в память, чтобы Xвидеть ключи вы просто нажимаете и переходите к текстовому терминалу, затем ядро должно Xвыйти из памяти, для dotкоторой все еще выполняется, а затем также выйти dot, чтобы переместить процессы текстового терминала (возможно, просто login?) обратно в память. (Если это выглядит грязно, это не только потому, что пример грязный - реальность такая грязная.)
Например, если вы войдете в текстовый терминал, вы сможете просто нажимать клавиши, нажимать клавишу Backspace, и это с радостью произойдет в режиме реального времени, но если вы сделаете что-то столь же простое, как запуск небольшого инструмента, такого как ps, он «зависнет» «на какое-то время, потому что он должен освободить память для загрузки ps(и он также должен ждать в очереди дискового ввода-вывода, которая активно используется для перемещения данных в память и из нее, пока он не сможет запросить psу файловой системы) ,