Размер стека используется в разработке ядра

Начните с create-react-app и имейте это как совершенно отдельную вещь. Таким образом, ваше приложение реагирования не знает и не заботится о том, что такое API - все, что его волнует, это конечные точки API.

https://github.com/facebook/create-react-app

9
задан GWX 4 May 2016 в 23:44
поделиться

4 ответа

Размер стека зависит от того, что делают Ваши потоки. Мой совет:

  • заставьте стек измерить параметр во время создания потока (различные потоки сделают разные вещи и следовательно будут нуждаться в различных размерах стека),
  • предоставьте разумное значение по умолчанию тем, кто не хочет быть побеспокоенным определением размера стека (4K, обращается к любителю командовать во мне, поскольку оно вызовет расточителя стека к, er, получит сигнал довольно быстро),
  • рассмотрите, как Вы будете обнаруживать и иметь дело с переполнением стека. Обнаружение может быть хитрым. Можно поместить защитные страницы - пустой - в концах стека, и это будет обычно работать. Но Вы полагаетесь на поведение Плохого Потока, чтобы не прыгнуть по той канавке и начать загрязнять то, что кладет вне. Обычно этого не будет происходить..., но затем, это - то, что делает действительно жесткие ошибки жесткими. Воздухонепроницаемый механизм включает взламывание Вашего компилятора, чтобы сгенерировать код проверки стека. Что касается контакта с переполнением стека, Вам будет нужен специализированный стек где-то в другом месте, который незаконный поток (или его ангел-хранитель, кто бы ни Вы решаете, что это - Вы - разработчик ОС, в конце концов) будет работать.
  • Я настоятельно рекомендовал бы отметить концы Вашего стека с отличительным шаблоном, так, чтобы, когда Ваши потоки работают на основе концов (и они всегда делают), можно было, по крайней мере, войти во вскрытие и видеть, что что-то действительно на самом деле убегало его стек. Страница 0xDEADBEEF или что-то как этот удобно.

Между прочим, x86 размеры страницы обычно 4k, но они не должны быть. Можно пойти с 64k размером или еще больше. Обычная причина больших страниц состоит в том, чтобы избежать TLB промахи. Снова, я сделал бы это параметром конфигурации ядра или параметром периода выполнения.

10
ответ дан 4 December 2019 в 14:32
поделиться

Я добавлю свои два цента, чтобы сдвинуться с мертвой точки:

  • Я не уверен, каков "типичный" размер стека был бы. Я предположил бы, возможно, 8 КБ за поток, и если поток превышает эту сумму, просто выдайте исключение. Однако согласно этому, Windows имеет значение по умолчанию зарезервированный размер стека 1 МБ за поток, но это не фиксируется внезапно (страницы фиксируются, поскольку они необходимы). Кроме того, можно запросить другой размер стека на данный EXE во время компиляции с директивой компилятора. Не уверенный, что Linux делает, но я видел ссылки на стеки на 4 КБ (хотя я думаю, что это может быть изменено, когда Вы компилируете ядро, и я не уверен, что размер стека по умолчанию...),

  • Это соединяется с первой точкой. Вы, вероятно, хотите фиксированный предел на то, сколько стека каждый поток может добраться. Таким образом Вы, вероятно, не хотите автоматически выделять больше стекового пространства каждый раз, когда поток превышает свое текущее стековое пространство, потому что ошибочная программа, которая застревает в бесконечной рекурсии, собирается съесть всю доступную память.

1
ответ дан 4 December 2019 в 14:32
поделиться

Почему бы не заставить стек измерить настраиваемый объект, или снабженный программой или указанный, когда процесс создает другой процесс?

Существует любое количество способов, которыми можно сделать это настраивающимся.

Существует инструкция, которая указывает "0, 1 или n", означая, что необходимо позволить нуль, один или любое число (ограниченный другими ограничениями, такими как память) объекта - это относится к размерам объектов также.

0
ответ дан 4 December 2019 в 14:32
поделиться

При использовании виртуальной памяти Вы действительно хотите сделать стек growable. Принуждение статического выделения измеренного стека, как распространено в уровне пользователя, распараллеливающем как Qthreads, и Windows Fibers является путаницей. Трудно использовать, легкий отказать. Все современные Ose действительно выращивают стек динамично, я обычно думаю при наличии защитной страницы защищенной от записи или два ниже текущего указателя вершины стека. Записи там затем говорят ОС, что стек ступил ниже своего выделенного места, и Вы выделяете новую защитную страницу ниже этого и делаете страницу, которая была поражена перезаписываемая. Пока никакая единственная функция не выделяет больше чем страницу данных, это хорошо работает. Или можно использовать две или четыре защитных страницы для разрешения больших стековых фреймов.

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

1
ответ дан 4 December 2019 в 14:32
поделиться