Используют ли потоки локальные переменные?

Я читаю концепции операционной системы Silberschatz 7th ed, и он говорит, что потоки одного и того же процесса разделяют раздел кода, раздел данных и другие ресурсы O. S., Но имеют отдельные наборы стеков и регистров. Однако я работаю над состояниями, в которых потоки совместно используют локальные переменные, но не хранятся в стеке, поэтому отдельные потоки должны иметь свои собственные копии?

4 ответов


Threads обычно разделяют следующие.

  1. сегмент данных(глобальные переменные,статические данные)
  2. адресного пространства.
  3. Сегмент Кода.
  4. I/O, если файл открыт , все потоки могут читать / писать в него.
  5. идентификатор процесса родителя.
  6. Кучу

но threads сохранить собственную копию stack,и локальные переменные хранятся в стеке, так что да, вы правы, что каждый поток должен иметь свой собственная копия локальных переменных.

может быть это неудачная терминология, или может быть что-то конкретное задач.


Я читал, что один процесс может иметь несколько потоков. несколько потоков одного и того же процесса обмениваются вещами между ними. Если вы хотите знать, что они делятся, а что нет. Рассматривая процесс состоит из адресного пространства, стека, кучи, глобальных переменных, кода, данных, ресурсов ОС, что среди них разделяется потоками? У меня есть следующие догадки:

глобальные переменные - Я прочитал глобальную переменную thread shares. Также при программировании в Java и C# я сделал потоки для совместного использования класса переменные уровня. Поэтому я считаю, что темы разделяют global переменные (хотя не уверен, что понятия на высоком уровне языки программирования переводится как низкий уровень операционной системы факты.)

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

стек - поскольку каждый поток может иметь собственную последовательность выполнения код, он должен имейте свой собственный стек, на который он может нажать/pop его содержимое счетчика программы (когда функция say вызывает и возвращает происходить.) Таким образом, потоки одного и того же процесса не разделяют стек. теперь быть не уверены в обмене следующими вещами

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

ресурсов ОС - Я думаю, это может быть очень определенной реализацией. Например, родительский процесс может выборочно дать дескриптор того же файла некоторые его нити и не ко всем. Или я ошибаюсь и ресурсы ОС означает что-то кроме файлов?

код - потоки могут иметь различное код, так что код-шеринг-это не всегда так.

данные - Не уверен в том, что следует учитывать в данных. Но уверен, что глобальные переменные разделяются между потоками. И уверен, что местный переменные не являются общими. В целом я сильно запутался. из-за расплывчатых терминов, супер-обобщения, сделанные в операционной Системные книги и дополнительные сведения о реализации онлайн. Поэтому я пытаюсь найти какой-то ответ, который может удовлетворить мне.

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


потоки внутри процесса разделяют адресное пространство.

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

потоки могут делиться абсолютно всей памятью. Один поток может получить доступ к любой ячейке памяти другого.

легкость, с которой это делается, зависит от языка программирования и базовая поддержка линкер. Их очень мало. языки программирования с поддержкой реальных потоков (например, ADA-called text). Ada имеет явные механизмы, позволяющие потокам обмениваться данными с использованием переменных.

Итак:

Я читаю концепции операционной системы от Silberschatz 7th ed,

Это начало вашей проблемы.

Он говорит, что потоки одного и того же процесса разделяют раздел кода, раздел данных и другие O. S. ресурсы,

есть все системные специфические понятия. Во многих системах существует не" раздел кода", а "раздел данных"."Существует просто память с определенными атрибутами (например, только чтение, Чтение/запись, чтение/выполнение).

но есть отдельные наборы стеков и регистров.

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

стеки-это просто блоки памяти чтения/записи.

однако, набор проблем я работаю над состояниями, в которых потоки совместно используют локальные переменные, но не локальные переменные хранятся в стеке, поэтому отдельные потоки должны иметь свои собственные копии?

опять же, потоки разделяют память. Они разделяют" локальные " переменные, только если Программирование используемый язык поддерживает такой обмен или такой обмен происходит "случайно"."

сопоставление переменных с использованием типа выделения памяти является функцией компилятора. FORTRAN 66/77 и COBOL обычно не выделяли никаких переменных в стеке


потоки POSIX-совместимых OSs должны совместно использовать локальные переменные (a.к. a. автоматические переменные). Из Тома XBD, базовые определения, Глава 3, определения, запись 3.404, поток Открыть Группу Базовых Спецификаций Выпуск 7 (на момент ответа):

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

следующий код, с выхода 10, должно быть достаточно для примера моего утверждения, если предположить, что статические переменные действительно разделяются между потоками:

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>

static int* shared_pointer = NULL;

void* alter_thread_entry(void* arg) {
    // The following variable will be reachable,
    // while it exists, by both the main and the alter thread.
    int local_variable = 10;
    shared_pointer = &local_variable;
    sleep(2);
    return 0;
}

int main() {
    pthread_t alter_thread;
    pthread_create(&alter_thread, NULL, alter_thread_entry, NULL);
    sleep(1);
    printf("%i", *shared_pointer);
    fflush(stdout);
    pthread_join(alter_thread, NULL);
}

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