4

Какова основная цель процесса подкачки в Unix?

Процесс подкачки имеет PID 0, и я думаю, что это первый процесс, который загружается. Кто-нибудь может пролить больше света на эту тему?

3 ответа3

11

Это не был процесс подкачки с 1990-х годов, и подмена не использовалась с 1970-х годов.

Unices перестали использовать подкачку давным-давно. В течение нескольких десятилетий они были операционными системами с разметкой спроса - начиная с System V R2V5 и 4.0BSD. Процесс обмена , как и раньше, используется для выполнения операций обмена . Раньше он обменивался целыми процессами - включая все структуры данных пространства ядра для процесса - на диск и снова заменял их. Оно будет регулярно вызываться ядром и сканировать таблицу процессов, чтобы определить, какие процессы, которые были заменены и готовы к запуску, могут быть заменены, а какие процессы - в режим ожидания можно поменять местами. Любой учебник по Unix 1980-х годов расскажет об этом более подробно, включая алгоритм подкачки. Но это в значительной степени не имеет значения для ориентированных на спрос Unices, хотя они сохранили старый механизм обмена в течение нескольких лет. (BSD старались изо всех сил избегать обмена, например, на пейджинг.)

Процесс № 0 - это первый процесс в системе, созданный вручную ядром. Это fork() s процесс 1, первый пользовательский процесс. То, что он делает, зависит от того, какая Unix операционная система на самом деле. Как уже упоминалось, BSD до FreeBSD 5.0 сохраняли старый механизм подкачки, и процесс # 0 просто сбрасывался в код подкачки в ядре, функцию scheduler() , после завершения инициализации системы. Система V была почти такой же, за исключением того, что процесс № 0 условно назывался sched а не swapper . (Имена в значительной степени произвольные.) Фактически, большинство - возможно, все - Unices имели (в основном неиспользованный) старый механизм подкачки, который использовался как процесс # 0.

Linux, традиционно, несколько отличается от Unices, в этом процессе # 0 является бездействующим процессом, выполняющим cpu_idle() . Он просто ничего не делает в бесконечном цикле. Он существует так, что всегда есть задача, готовая к планированию.

Даже это устаревшее описание. В конце 1980-х и начале 1990-х годов появились многопоточные операционные системы, в результате чего процесс № 0 стал просто системным процессом. В мире старых однопоточных Unices можно было получить отдельный поток выполнения только для выполнения непрерывной задачи ядра с помощью fork() процесса. Таким образом, все задачи ядра ( например , vmdaemon , pagedaemon , pagezero , bufdaemon , syncer , ktrace и т.д. В системах FreeBSD) были процессами с низким номером, fork() , обработанными процессом # 0 после его fork() ed ìnit , В многопоточных Unices нет смысла создавать совершенно новый контекст процесса для чего-то, что полностью выполняется в пространстве ядра и не нуждается в адресном пространстве, таблице дескрипторов файлов и всем остальном. Таким образом, все эти задачи стали (по сути) потоками, разделяющими адресное пространство одного системного процесса.

Попутно несколько Unices по-настоящему потеряли старый механизм подкачки, который они старались изо всех сил избегать когда-либо использовать. Код инициализации OpenBSD теперь просто падает в while(1) tsleep(…); Цикл, например, без механизма обмена в любом месте.

Таким образом, в настоящее время процесс № 0 в Unix является системным процессом, который эффективно удерживает ряд потоков ядра, выполняющих множество задач, начиная от операций выгрузки страниц, до очистки кэша файловой системы и обнуления буфера, до простоя, когда больше нечего запускать ,

5

Процесс 0 - это специальный процесс (называемый процесс подкачки или простой), который выполняется, когда система находится в режиме ожидания, то есть никакой другой процесс не запланирован. Это единственный процесс, который может вызвать системный вызов idle() .

Это первый процесс, который создается, который затем создает init (PID 1), который запускает другие процессы.

root         1     0 /sbin/init

Вы также можете проверить man idle .

Смотрите также: Понимание ядра Linux - планирование процессов

1

Причина историческая и программная. Бесполезная задача - это запущенная задача, если ни одна другая задача не выполняется, как вы сказали. Он имеет наименьший возможный приоритет, поэтому он не запускается ни одной другой задачи.

Программная причина: это сильно упрощает планирование процессов, потому что вам не нужно заботиться об особом случае: «Что произойдет, если ни одна задача не будет запущена?msgstr ", потому что всегда есть хотя бы одна работоспособная задача, задача простоя. Также вы можете подсчитать количество процессорного времени, использованного для выполнения одной задачи. Без задачи простоя, какая задача учитывает время процессора, которое никому не нужно?

Историческая причина: до того, как у нас был процессор, способный понижать или переходить в режим энергосбережения, он ДОЛЖЕН работать на полной скорости в любое время. Он запускал серию NOP-инструкций, если не выполнялись никакие задачи. Сегодня планирование незанятых задач обычно приводит к снижению производительности процессора с помощью HLT-инструкций (останов), что позволяет экономить электроэнергию. Так что в наши дни есть какая-то функциональность в бездействующей задаче.

В Windows вы можете увидеть незанятую задачу в списке процессов, это простаивающий процесс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .