память для нескольких пользовательских потоков - PullRequest
1 голос
/ 12 июля 2010

Я хочу понять, как в памяти хранятся стеки потоков пользовательского уровня. Я думаю, что все стеки начинаются на границе страницы ... Я прав? Как библиотека потоков пользовательского уровня гарантирует, что стек для определенного потока не будет расти и перекрываться со смежным стеком границ страниц другого потока, поскольку все страницы стека будут смежными ...

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Если вы настаиваете на смежных стеках, тогда да, вы можете столкнуться между стеками, выделенными для отдельных потоков. Это более вероятно на машине с небольшим виртуальным пространством, чем на большом, и более вероятно, когда какой-то стек может стать произвольно большим.

В большинстве распространенных ОС (Windows, Linux) предполагается, что стеки потоков не могут быть очень большими (например, 1-10 МБ) и что у вас не может быть много потоков (возможно, сотен) для одного процесса , В этом случае у вас действительно не будет проблем, если вы знаете, сколько потоков вам нужно, и насколько велик каждый стек, до того, как ваши вычисления будут выполнены. В этом случае вы можете предварительно вычислить, куда поместить все стеки потоков так, чтобы они все подходили, с наихудшими требованиями для стека.

И это работает .... довольно хорошо. Однако, если спрос на стек может быть сколь угодно большим или вы заранее не знаете, сколько стеков, то предварительное распределение не работает. И это вызывает проблемы у людей, использующих эти ОС.

См. Почему переполнение стека все еще является проблемой? для обсуждения этой проблемы. Вы также можете прочитать мой ответ о том, как избежать этой проблемы. (Подсказка: нет стеков ограниченного размера!).

0 голосов
/ 12 июля 2010

Все это детали реализации и варьируются от системы к системе.Что вы пытаетесь достичь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...