2017-01-13 3 views
5

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

+0

«Проблемный набор» может быть неправильным или с использованием плохой терминологии, трудно сказать. Можете ли вы опубликовать значимую цитату? –

+0

Но: Нет, потоки не используют реальные локальные переменные. Но, например, в C#, локальная переменная может быть захвачена или «закрыта», а затем становится другой. –

ответ

7

Threads обычно делиться следующим.

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

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

Может быть, это плохая терминология, используемая или может быть ее чем-то специфичным для набора проблем.

+0

Конечно терминология, используемая Silberschatz, пересматривается профессионалами в этом районе. Вряд ли плохо. –

1

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

гадания

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

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

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

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

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

Код - Темы могут иметь разный код, поэтому код обмена не всегда так.

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

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

0

В потоках процесса есть одно и то же адресное пространство.

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

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

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

Итак:

Читаю операционной системы Основные понятия по Silberschatz 7-е изд,

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

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

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

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

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

Стеки - это всего лишь блоки памяти чтения/записи.

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

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

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

0

Потоки ОС, совместимые с POSIX, должны совместно использовать локальные переменные (автоматические переменные a.k.a.). Из тома XBD, базовых определений, глава 3, Определения, Входа 3,404, резьбе Open Group Base Specifications Issue 7 (во время ответа на):

Anything, адрес которого может быть определено с помощью нити, в том числе, но не ограничиваясь статических переменных , хранилище, полученное через 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); 
} 

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

Смежные вопросы