Что такое бесперебойный процесс?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

144
задан Anthony G - justice for Monica 18 October 2019 в 12:10
поделиться

4 ответа

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

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

, В то время как процесс спит в системном вызове, он может получить асинхронный сигнал Unix (скажите, SIGTERM), затем следующее происходит:

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

Возврат рано из системного вызова позволяет коду пространства пользователя сразу изменить свое поведение в ответ на сигнал. Например, завершаясь чисто в реакции на SIGINT или SIGTERM.

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

LWN работал хорошая статья , которая коснулась этой темы в июле.

Для ответа на исходный вопрос:

  • , Как предотвратить это: фигура, какой драйвер вызывает Вас проблема, и или использование остановки, или становится хакером ядра и фиксирует его.

  • , Как уничтожить бесперебойный процесс без перезагрузки: так или иначе сделайте системный вызов оконечным. Часто самый эффективный способ, чтобы сделать это, не поражая выключатель питания должно вытянуть шнур питания. Можно также стать хакером ядра и заставить драйвер использовать TASK_KILLABLE, как объяснено в статье LWN.

189
ответ дан 23 November 2019 в 22:54
поделиться

Когда процесс находится на непривилегированном режиме, он может быть прерван в любое время (переключающийся на привилегированный режим). Когда ядро возвращается к непривилегированному режиму, оно проверяет, существует ли какое-либо ожидание сигналов (включая тех, которые используются для уничтожения процесса, такой как SIGTERM и SIGKILL). Это означает, что процесс может быть уничтожен только по возврату к непривилегированному режиму.

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

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

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

  • TASK_INTERRUPTIBLE, прерываемый сон. Если задача отмечена с этим флагом, она спит, но может быть разбужена сигналами. Это означает код, который отметил задачу, поскольку сон ожидает возможный сигнал, и после того, как это проснется, проверит на него и возвратится из системного вызова. После того, как сигнал обрабатывается, системный вызов может потенциально быть автоматически перезапущен (и я не сообщу подробности относительно того, как это работает).
  • TASK_UNINTERRUPTIBLE, бесперебойный сон. Если задача будет отмечена с этим флагом, то она не ожидает быть разбуженной чем-либо кроме того, что она ожидает, или потому что она не может легко быть перезапущена, или потому что программы ожидают, что системный вызов будет атомарным. Это может также использоваться для снов, которые, как известно, были очень коротки.

TASK_KILLABLE (упомянутый в статье LWN, связанной с ответом ddaa), новый вариант.

Это отвечает на Ваш первый вопрос. Относительно Вашего второго вопроса: Вы не можете избежать бесперебойных снов, они - нормальная вещь (это происходит, например, каждый раз, когда процесс читает/пишет из диска); однако, они должны продлиться только часть секунды. Если они длятся намного дольше, это обычно означает аппаратную проблему (или проблема драйвера устройства, которая выглядит одинаково к ядру), где драйвер устройства ожидает аппаратных средств, чтобы сделать что-то, чего никогда не будет происходить. Это может также означать использование NFS, и сервер NFS снижается (это ожидает сервера для восстановления; можно также использовать "intr" опцию избежать проблемы).

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

46
ответ дан 23 November 2019 в 22:54
поделиться

Непрерываемые процессы ОБЫЧНО ожидают ввода-вывода после отсутствия страницы.

Рассматривают это:

  • поток пытается получить доступ к странице, которая не находится в ядре (или исполняемый файл, который загружается спросом, страница анонимной памяти, которая была выгружена, или mmap () 'd файл, который является загруженным спросом, которые являются почти такой же вещью)
  • ядро теперь (пробующий к), загружают его в
  • , процесс не может продолжиться, пока страница не доступна.

процесс/задача не может быть прерван в этом состоянии, потому что это не может обработать сигналы; если бы это сделало, то другое отсутствие страницы произошло бы, и это вернулось бы, где это было.

, Когда я говорю "процесс", я действительно имею в виду "задачу", которая в соответствии с Linux (2.6) примерно переводит для "распараллеливания", который может или не может иметь отдельной "записи" группы потока в/proc

В некоторых случаях, это может ожидать в течение долгого времени. Типичный пример этого был бы то, где исполняемый файл или mmap'd файл находятся в сетевой файловой системе, где сервер перестал работать. Если ввод-вывод в конечном счете успешно выполнится, то задача продолжится. Если это в конечном счете перестанет работать, то задача будет обычно получать SIGBUS или что-то.

23
ответ дан 23 November 2019 в 22:54
поделиться

Если Вы говорите о процессе "зомби" (который определяется как "зомби" в выводе PS), то это - безопасная запись в списке процессов, ожидающем кого-то для сбора его кода возврата, и это могло быть безопасно проигнорировано.

Вы могли описать то, что и "непрерываемый процесс" для Вас? Это выживает, "уничтожают-9", и счастливо двигается с пыхтением вперед? Если это так, затем это застревает на некотором syscall, который застревает в некотором драйвере, и Вы застреваете с этим процессом до перезагрузки (и иногда это скоро лучше к перезагрузке), или разгрузка соответствующего драйвера (который вряд ли произойдет). Вы могли попытаться использовать "strace" для обнаружения, где процесс застревает, и избегайте его в будущем.

-3
ответ дан 23 November 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: