Используют ли потоки локальные переменные?
Я читаю концепции операционной системы Silberschatz 7th ed, и он говорит, что потоки одного и того же процесса разделяют раздел кода, раздел данных и другие ресурсы O. S., Но имеют отдельные наборы стеков и регистров. Однако я работаю над состояниями, в которых потоки совместно используют локальные переменные, но не хранятся в стеке, поэтому отдельные потоки должны иметь свои собственные копии?
4 ответов
Threads
обычно разделяют следующие.
- сегмент данных(глобальные переменные,статические данные)
- адресного пространства.
- Сегмент Кода.
- I/O, если файл открыт , все потоки могут читать / писать в него.
- идентификатор процесса родителя.
- Кучу
но 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);
}
на стек вызовов то, что отслеживает выполнение управления потоками, не является общим для потоков процесса. Однако этот момент зависит от реализации, поскольку ничего не установлено об этом в вышеупомянутом стандарте.