Я реализовал PARLANSE , язык под MS Windows, который использует стеки кактусов для реализации параллельных программ. Чанки стека распределяются по функциям
основа и просто правильный размер для обработки локальных переменных,
Выражение / задвижение выражения, вызовы в библиотеки (включая
пространство стека для работы библиотечных подпрограмм). Такой стек
кадры на практике могут составлять всего 32 байта и часто имеют размер.
Это все прекрасно работает, если код не делает глупости и
вызывает аппаратную ловушку ... в этот момент Windows кажется
настаивайте на том, чтобы поместить весь контекст машины x86 «в стек».
Это более 500 байт, если вы включите FP / MMX / и т. Д. регистры,
что это делает. Естественно, 500-байтовое нажатие на 32-байтовый стек
разбивает вещи это не должно. (Аппаратное обеспечение выдвигает несколько слов
в ловушку, но не весь контекст).
[EDIT 11/27/2012: см. это для измерено подробности о смешных
количество стеков Windows на самом деле толкает ]
Можно ли заставить Windows хранить блок контекста исключения
где-то еще (например, в месте, определенном для потока)?
Тогда программное обеспечение может принять исключение
нажмите на поток и обработать его, не переполняя мой
небольшие кадры стека.
Я не думаю, что это возможно, но я подумал, что я бы попросил гораздо больше
аудитория. Есть ли в ОС стандартный вызов / интерфейс
что может вызвать это?
Было бы тривиально сделать в ОС, если бы я мог заставить MS позволить
процесс, необязательно, определяет место хранения контекста "contextp", которое
инициализируется, чтобы включить текущее устаревшее поведение по умолчанию.
Затем заменив коде вектора прерывания / прерывания:
hardwareint: push context
mov contextp, esp
... с ...
hardwareint: mov <somereg> contextp
test <somereg>
jnz $2
push context
mov contextp, esp
jmp $1
$2: store context @ somereg
$1: equ *
с очевидными изменениями, необходимыми для сохранения somereg и т. Д.
[То, что я делаю сейчас: проверяю сгенерированный код для каждой функции.
Если у него есть шанс создать ловушку (например, разделить на ноль),
или мы отлаживаем (возможен неправильный указатель и т. д.), добавляем
достаточно места в кадре стека для контекста FP. Стек кадров
теперь размер ~ 500-1000 байт, программы не могут
дойти до конца, что иногда является реальной проблемой для
приложения мы пишем. Итак, у нас есть работоспособное решение,
но это усложняет отладку]
РЕДАКТИРОВАТЬ 25 августа: мне удалось донести эту историю до внутреннего инженера Microsoft
кто имеет право выяснить, кто в РС может на самом деле
уход. Там может быть слабая надежда на решение.
РЕДАКТИРОВАТЬ 14 сентября: Архитектор MS Kernal Group услышал историю и сочувствует. Он сказал, что MS рассмотрит решение (как предложенное), но вряд ли будет в пакете обновления. Возможно, придется ждать следующей версии Windows. (Вздох ... я могу состариться ...)
РЕДАКТИРОВАТЬ: 13 сентября 2010 г. (1 год спустя). Никаких действий со стороны Microsoft. Мой последний кошмар: захватывает ли 32-битный процесс в Windows X64 ловушку, помещает весь контекст X64 в стек до того, как обработчик прерываний фальсифицирует 32-битный контекст? Это было бы еще больше (в два раза больше целочисленных регистров в два раза шире, в два раза больше регистров SSE (?))?
РЕДАКТИРОВАТЬ: 25 февраля 2012 г .: (прошло 1,5 года ...) Никакой реакции со стороны Microsoft. Я думаю, им просто наплевать на мой вид параллелизма. Я думаю, что это плохая услуга для сообщества; «Модель большого стека», используемая MS в обычных условиях, ограничивает количество параллельных вычислений, которые можно получить в любой момент, съев огромное количество ВМ. Модель PARLANSE позволяет использовать приложение с миллионом живых «зерен» в различных состояниях работы / ожидания; это действительно происходит в некоторых наших приложениях, где граф на 100 миллионов узлов обрабатывается «параллельно». Схема PARLANSE может сделать это с 1 ГБ ОЗУ, что довольно легко управляемо. Если вы попробуете это с «большими стеками» MS 1Mb, вам потребуется 10 ^ 12 байт виртуальной машины только для стекового пространства, и я уверен, что Windows не позволит вам управлять миллионами потоков.
РЕДАКТИРОВАТЬ: 29 апреля 2014 г .: (прошло 4 года). Полагаю, MS просто не читает SO. Я достаточно разработал PARLANSE, поэтому мы платим только за большие кадры стека во время отладки или при выполнении операций FP, поэтому нам удалось чтобы найти очень практичные способы жить с этим. MS продолжал разочаровывать; количество вещей, помещаемых в стек различными версиями Windows, кажется, значительно и вопиющим образом превышает потребность в аппаратном контексте. Есть некоторый намек на то, что некоторая часть этой изменчивости вызвана зависанием продуктов других производителей (например, антивируса), которые застревают в цепочке обработки исключений; почему они не могут сделать это вне моего адресного пространства? В любом случае, мы обрабатываем все это, просто добавляя большой коэффициент наклона для ловушек FP / отладки и ожидая неизбежной системы MS в поле, которое превышает это количество.