Почему мы не можем убить процесс непрерывного D-процесса?

У меня часто возникают проблемы с процессами, застрявшими в состоянии D, из-за NFS-акций за брандмауэрами. Если я теряю связи, процессы застревают в состоянии D, и я не могу их убить. Единственное решение – жесткая перезагрузка. Мне было интересно, есть ли другие способы, но все решения и информация, которые я могу найти, это «вы просто не можете убить». Кажется, все в порядке и принимают то, что есть. Я немного критически отношусь к этому. Я думал, что должен быть способ очистить процесс от памяти, чтобы не было необходимости перезагрузки. Это очень раздражает, если это происходит часто. И если ресурс будет возвращать IO, его можно просто проигнорировать в этом случае. Почему это невозможно? Ядро Linux очень ИМХО, и вы должны иметь возможность делать такие вещи. Особенно, на серверах …

Я не мог найти удовлетворительного ответа, почему это / не может быть реализовано?

  • Почему CONFIG_NO_HZ не установлен по умолчанию
  • Как понять вывод modinfo?
  • Как запретить ядро ​​или любые широковещательные сообщения наводнения TTY?
  • Трассировка пакета в сетевом стеке Linux
  • Как установить php5-curl на Ubuntu 12.04 LTS (GNU / Linux 3.2.0-24-generic x86_64)
  • Почему вы не должны редактировать файл конфигурации ядра .config?
  • Меня также интересовали бы ответы на вопросы программирования и алгоритмического характера, которые могли бы объяснить эту проблему.

  • Удаление новых ядер / загрузка
  • В котором поток блокирует команды выдачи драйверов для блокировки устройства?
  • Использует ли noatime в современной Linux смысл?
  • Как я могу подтвердить, что `nice` работает?
  • Что такое «подрезы»?
  • Существуют ли технические ограничения, предотвращающие поддержку root = UUID = <filesystem-uuid>?
  • One Solution collect form web for “Почему мы не можем убить процесс непрерывного D-процесса?”

    Убивать процесс, когда он находится в системном вызове, возможно, и он работает в основном. Трудно заставить его работать все время. Трудная часть – от 99,99% до 100%.

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

    Бесперебойный сон происходит явно, когда «код уведомляется и выходит» берет неминуемое количество времени. Это означает, что код не работает должным образом. Это ошибка. Да, теоретически можно писать код без ошибок, но это практически невозможно.

    Вы говорите: «Если ресурс возвращает IO, его можно просто игнорировать». Вот и славно. Но предположим, например, что периферийное устройство было запрограммировано на запись в память, принадлежащую процессу. Чтобы убить процесс, не отменяя запрос на периферию, память должна как-то использоваться. Вы не можете просто избавиться от этого ресурса. Есть ресурсы, которые должны оставаться вокруг. И освобождение других ресурсов может быть выполнено только в том случае, если ядро ​​знает, какие ресурсы безопасны для освобождения, что требует, чтобы код был написан таким образом, что это всегда можно сказать. Случаи, когда непрерывный сон длится в течение видимого промежутка времени, – это случаи, когда невозможно сказать, и единственная безопасная вещь – путь.

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

    Получение всех покрываемых путей кода чрезвычайно сложно, особенно когда для этого не было строгой основы для этого с 1-го дня. В великой схеме вещей неудобные процессы крайне редки (вы не замечаете, когда их не бывает ). Это признак багги-драйверов. При написании драйверов Linux были предприняты определенные усилия. Чтобы устранить больше случаев длительного непрерывного сна, потребуется либо большее количество людей в задаче, либо привести к меньшему количеству поддерживаемых аппаратных средств и снижению производительности.

    Linux и Unix - лучшая ОС в мире.