@SergeySerge11

Что происходит во время прерывания в многопоточной среде? Или прерывания посреди прерывания?

Вот как работают асинхронные прерывания?
Чем и как отличаются системные прерывания от программных, (Разные таблицы вообще оп разному классифицируют).
Прерывание в коде int 21h и прочие Это какое? (Логично что программные, но вот прерывание с Диска, к примеру прочитать Гигабайт, что происходит во время ожидание, и когда первый блок данных будет прочитан, Какое будет прерывание, системное или программное??
И откуда прерывания знают адрес, куда им вернуть результат. Точнее, как это в многопоточной среде обстоит?
Вот к примеру, кто подскажет. Опишет по пунктам.
1. 2 программы чтения файлов, запускают чтение в один момент. И еще есть 3 программа(допустим Gogle Chrome) всегда активна.
. Там типа сохраняется инфа в стек, из таблицы векторов идет выполнение( Как именно?? Чтение диска это 100 таков в холостую)
Далее ОС, как-то по среди прерывания, должен передать управление, или процессорное время Другим программам.
А теперь как это прерывание:
- в момент наступления его, наверняка другой контекст, и выполняется вообще другой процесс.
- разбудит программу (Я ни где не нашел, инфу, про то что адрес источника прерывания (программы) куда-то заноситься.
- а что если диск высунут.
Есть таблица векторов прерываний. А есть еще какая-то таблица. Куда можно адрес callback записать Надеюсь я затупил, подтвердите, или эта таблица Векторов и есть та куда адрес возврата запишется,
но там всего 16 бит и 16 бит сегмент: смещение, не запишешь адрес? Таблица Векторов, вообще она какая Константная? Создается только при запуске Ядра и только для чтения?

Везде примерно так написано
1)прекращение выполнения текущей программы;
2) переход к выполнению и выполнение программы обработки прерывания;
3) возврат управления прерванной программе.

Но выполнение прерывания std::cin>>line; Может и сутки длиться.. Вот как по пунктам для этой команды. (С условием что есть еще 1 поток жаждущий ЦП).
  • Вопрос задан
  • 208 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
откуда прерывания знают адрес, куда им вернуть результат.

Прерывания не знают. Это работа ОС -- организовать информацию так, чтобы при получении прерывания разобраться, откуда оно, зачем, и что с ним делать.

Прерывание в коде int 21h и прочие Это какое?

Любое прерывание инициируемое инструкцией int -- программное. В отличие от прерывания, инициируемого уровнем или фронтом сигнала подключённого к контроллеру прерываний.

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

выполнение прерывания std::cin>>line; Может и сутки длиться.

Системного вызова. std::cin >>line в конце концов превращается в системный вызов read.

Вот как по пунктам для этой команды. (С условием что есть еще 1 поток жаждущий ЦП).

Можно запустить такую программу, узнать её PID, выполнить где-нибудь cat /proc/<PID>/stack и увидеть следующую картину:
[<0>] wait_woken+0x67/0x80
[<0>] n_tty_read+0x426/0x5a0
[<0>] tty_read+0x135/0x240
[<0>] new_sync_read+0x115/0x1a0
[<0>] vfs_read+0xf4/0x180
[<0>] ksys_read+0x5f/0xe0
[<0>] do_syscall_64+0x33/0x80
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

Т.е. поток выполнил системный вызов (ksys_read), зашёл в VFS, добрался до функции чтения в драйвере терминала (tty_read) и перешёл в состояние ожидания в глубине этой функции (wait_woken). Когда драйвер терминала получит данные для программы, он разбудит её поток и системный вызов завершится. До тех пор этот поток будет не готов к выполнению и скедулер ОС просто не будет выделять ему время.

Мне кажется, что тебе было бы полезно прочитать вторую и третью книжки (Understanding the Linux Kernel и Linux Kernel Developmen) из моего списка.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@VitalyChaikin
Многопоточная среда - это операционная система, при этом каждое приложение выполняющееся в этой среде - однопоточное ! (как правило в 99.99%)
Есть такое понятие STA - single thread apartment model; Так вот приложения компилируются в такой модели. Это означает - что внутри выполняющегося приложения есть только один поток* и пока выполняется код в этом потоке, все события операционной системы добавляются в стек, до тех пор пока приложение само не считает эти события
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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