Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если например были выделенны области памяти для DMA трансферов с сетевой картой, и контроллер уже настроен и сыпет прерывания, то можно просто рестартнуть контроллер и он забудет обо всех DMA дескрипторах, о которых знал :)Он может много о чём забыть. Даже если всего лишь 10GBit контроллер. А если это WiFi или ADSL-модем, то он может вообще отказаться работать после ресета просто потому что противоположная сторона откажется с вами общаться — по крайней мере на протяжении некоторого времени. Нужна длительная и сложная процедура реинициализации… А если вы используете iSCSI…
под виндоус никада драйверов не писал, но осмеюсь предположить что там тоже можно выключить прерывания, создав таким образом критическую секциюЕсли займётесь подобным в обработчике прерываний то с большой вероятностью получите не критическую секцию, а Deadlock.
и еще, я так понял, что у вас несколько потоков и у каждого в стеке массив? если они не зависимы ничто не помешает так же выделить память при инициализации каждого потока, т.е каждому например по 4кОтличная идея! Гениальная! А если у вас 10'000 потоков? Тяжёлые Java-программы и больше могут породить. Угробить 40MB оперативки только на то, чтобы один массив в пару килобайт там завести?
не надо мне приводить ссылки, я прекрасно знаю что такое deadlock. а критическая секция (сritical section) — это один из способов его избежать, думаю следуя вашей же ссылке все найдется.Дьявол, как всегда, в деталях. В обработчике прерываний прирывания уже запрещены — но в этом-то и беда. Если вы возжелаете обратиться к странице памяти, которая, скажем, живёт на диске, а прерывания запрещены — получите классический deadlock и никто вам не поможет. То, что вы называете critical section в обычных, не ядерных программах прерываний не запрещает, так что там такие финты невозможны.
…
и объясните, если не сложно, почему выключение _фсех_ прерывание в обработчике приведет к деадлоку
речь идет о ядре, откуда там у вас тяжелые ява программы?Тяжёлые ява-программы будут исполняться на компьютере, а не в ядре, конечно. Но для каждого потока в тяжёлой ява-программе будет создан отдельный поток ядра (отсюда, собственно, эти драконовские ограничения на размер стека). Есть ещё отдельные потоки для обслуживания прерываний но создаются и убиваются системой, с ними всё ещё сложнее. Собственно «нормальным» программистам очень тяжело писать «ядрёные вещи» (в частности драйвера) ибо они привыкли контролировать ситуацию — а ядро ситуацию нифига не контролирует. Контролирует всё программы, запущенные на компе, я ядро — это Фигаго: им командуют два господина. Программы, запущенные на компьютере и железо — а оно пытается им всем угодить. Иногда не получается и тогда «тарелки сыплются на пол».
Дьявол, как всегда, в деталях. В обработчике прерываний прирывания уже запрещены — но в этом-то и беда. Если вы возжелаете обратиться к странице памяти, которая, скажем, живёт на диске, а прерывания запрещены — получите классический deadlock и никто вам не поможет.Это все детали реализации. Можно выделить память в NonPagedPool и легко с ней работать.
Маленькая, но очень коварная засада с программированием в kernelspace-е в ОС MS Windows