Что происходит, если другое прерывание повышено, прежде чем первое действие прерывания завершается?

Просто используйте метод "insertOne", а не сохраняйте.

    MongoCollection collection;
    String collectionName = "somename";
    String jsonObject = "{}";

    if (!mongoTemplate.collectionExists(collectionName)) {
        collection = mongoTemplate.createCollection(collectionName);
        logger.info("Collection %s was successfully created", collectionName);
    } else {
        collection = mongoTemplate.getCollection(collectionName);
    }

    collection.insertOne(Document.parse(jsonObject));
8
задан Jonathan Leffler 31 May 2009 в 02:01
поделиться

3 ответа

Следующее применимо только к архитектуре x86, но другие архитектуры вполне могут следовать тому же шаблону:

Имеется флаг процессора под названием IF (Флаг прерывания), который определяет, могут ли аппаратные прерывания обрабатываться или должны быть приостановлены. Когда IF = 0, прерывания будут отложены до тех пор, пока флаг не будет снова включен (за исключением NMI, немаскируемого прерывания, которое предназначено как «только аварийное» прерывание, которое не может быть заблокировано).

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

Итак, отвечая на ваш прямой вопрос: обычно, когда происходит второе аппаратное прерывание во время обслуживания первого, это прерывание будет приостановлено, пока не закончится первое.

Как обычно, полная история немного сложнее. Руководство разработчика программного обеспечения архитектуры Intel на веб-сайте Intel дает более полное описание, начиная со страниц 10-4.

прерываний немедленно приведет (в первую очередь) к переполнению стека.

Итак, отвечая на ваш прямой вопрос: обычно, когда происходит второе аппаратное прерывание во время обслуживания первого, это прерывание будет приостановлено пока не закончится первый.

Как обычно, полная история немного сложнее. Руководство разработчика программного обеспечения архитектуры Intel на веб-сайте Intel дает более полное описание, начиная со страниц 10-4.

прерываний немедленно приведет (в первую очередь) к переполнению стека.

Итак, отвечая на ваш прямой вопрос: обычно, когда происходит второе аппаратное прерывание во время обслуживания первого, это прерывание будет приостановлено пока не закончится первый.

Как обычно, полная история немного сложнее. Руководство разработчика программного обеспечения архитектуры Intel на веб-сайте Intel дает более полное описание, начиная со страниц 10-4.

4
ответ дан 5 December 2019 в 22:20
поделиться

It depends on the system. Normally, if the new interrupt is a higher priority than the first, then it is responded to, suspending the handler for the first interrupt. When its handler finishes, then the original interrupt handler resumes. Finally, assuming no more interrupts, the original handler finishes and normal service resumes. Sometimes, the resumed process will be the process that was interrupted; sometimes, it will no longer be the most eligible process and some other one will resume.

Similarly, if a second or subsequent instance of the original interrupt occurs before the first handler completes, or if a lower or equal priority interrupt occurs, it will be held up until the first handler completes. Before normal processing is resumed, the kernel checks for outstanding interrupts that should have been handled but were blocked.

An interrupt handler may block other interrupts.

2
ответ дан 5 December 2019 в 22:20
поделиться

Что ж, если прерывания не были отключены после первого прерывания, второе вызовет вашу подпрограмму обслуживания прерывания снова. Вы должны убедиться, что прерывания отключены, чтобы избежать этого явно нежелательного поведения.

Итак, если ваша подпрограмма обслуживания прерывания выполняет свою задачу, а затем возникает другое прерывание, это будет так же, как если бы вы делали что-то еще: соответствующее прерывание будет вызвана подпрограмма.

В архитектуре Intel инструкция «cli» отключит прерывания, а «sti» снова включит их.

0
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

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