0

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

Если приведенные выше утверждения верны, у меня есть этот вопрос: что происходит, когда ОС видит такой адрес из потока? Что делать, если потоки пишут что-то в стеке другого и коррумпируют их? почему ОС не генерирует какое-либо разрешение, отклоняющее ошибку?

Если ответ на этот вопрос зависит от операционной системы, рассмотрите Linux.

+0

«Почему ОС не генерирует какое-либо разрешение, отклоняющее ошибку?» - почему * бы это? и кто говорит, что это обязательно * недействительно * - пока адрес, к которому обращаются, не находится в мусорной части пространства стека, я вижу нецелесообразные, но технически законные способы совместного использования адреса стека (передача этого адреса в какое-то общее состояние, которое затем доступ из других потоков). Снова * не рекомендуется *, если вы не очень хорошо знаете модель потока и модель памяти, но ... это не то же самое, что и недействительно. –

+0

У OS уже есть абстракция для этого, один процесс не может испортить память другого. Но программисты, такие как потоки, намного эффективнее. Вы не можете иметь это в обоих направлениях. –

ответ

0

Как вы заявляете, потоки разделяют одно и то же адресное пространство. Таким образом, каждый поток имеет тот же доступ к адресному пространству, что и любой другой поток.

OS видит такой адрес из потока?

Я не могу сказать, что вы здесь задаете.

Что делать, если потоки пишут что-то в стеке другого и повреждают их?

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

Почему ОС не генерирует какое-либо разрешение отклонения ошибки?

Доступ к памяти контролируется режимом процессора (например, пользователем, ядром и некоторыми дополнительными режимами системы). Обычно защита уровня режима предназначена для предотвращения доступа пользователей к общему системному диапазону логического адресного пространства. Процессы защищены друг от друга, имея разные диапазоны адресного пространства пользователя.

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

Стек - это просто блок чтения/записи. В стек нет ничего святого. Любой блок памяти может быть стеком, просто используя его как стек.