Я читаю концепцию операционной системы Silberschatz 7th ed, и он говорит, что потоки одного и того же процесса разделяют раздел кода, раздел данных и другие O.S. ресурсов, но имеют отдельные наборы стеков и регистров. Однако проблема в том, что я работаю над тем, что потоки совместно используют локальные переменные, но не являются локальными переменными, хранящимися в стеке, поэтому отдельные потоки должны иметь свои собственные копии?Связаны ли потоки с локальными переменными?
ответ
Threads
обычно делиться следующим.
- сегмента данных (глобальные переменные, статические данные)
- адресное пространство.
- Код сегмента.
- I/O, если файл открыт, все потоки могут читать/писать на него.
- Идентификатор процесса родителя.
- Куча
Но threads
сохранить свою собственную копию stack
, и локальные переменные хранятся в стеке, так что да, вы правы, что каждый поток должен иметь свою собственную копию локальных переменных.
Может быть, это плохая терминология, используемая или может быть ее чем-то специфичным для набора проблем.
Конечно терминология, используемая Silberschatz, пересматривается профессионалами в этом районе. Вряд ли плохо. –
Я прочитал, что один процесс может иметь несколько потоков. Несколько потоков одного и того же процесса действительно разделяют между собой вещи. Если вы хотите знать, что они разделяют, а что нет. Рассмотрение процесса состоит из адресного пространства, стека, кучи, глобальных переменных, кода, данных, ресурсов ОС, что среди них разделяется потоками? У меня есть следующие:
гаданияГлобальные переменные - Я прочитал нить акции глобальной переменной. Кроме того, при программировании на Java и C# я создал потоки для обмена переменными уровня класса . Поэтому я верю, что потоки разделяют глобальные переменные (хотя не уверены, переводится ли на языки программирования высокого уровня , что соответствует низким уровням операционной системы ).
Куча - Поскольку глобальная переменная хранится в куче, куча разделяется между потоками.
Stack - Поскольку каждый поток может иметь свою собственную последовательность выполнения/код, он должен иметь свой собственный стек, на котором он мог бы подтолкнуть/поп его счетчик программы содержимое (когда говорят, вызовы и возвраты функция бывает). Таким образом, потоки одного процесса не разделяют стек. Теперь я не уверены в обмене следующими вещами
Адресное пространство - Не уверен, что именно учитывается при адресном пространстве. Но я думаю, что адресное пространство обычно используется в контексте процессов, а не потоков. И так как все потоки одного процесса находятся в в том же адресном пространстве, что и родительский процесс, говорят, что Blockquote темы разделяют адресное пространство. (Но тогда они поддерживают разные стеки внутри того же адресного пространства?)
Ресурсы ОС - Я думаю, это может быть очень специфичным для реализации. Например, родительский процесс может выборочно выдавать дескриптор того же файла некоторым из его потоков, а не ко всем. Или я ошибаюсь, а ресурсы ОС означает нечто иное, чем файлы?
Код - Темы могут иметь разный код, поэтому код обмена не всегда так.
Данные - Не уверен, что учитывать данные. Но убедитесь, что глобальные переменные разделяются между потоками. И убедитесь, что локальные переменные не разделены аналогичным образом. В целом я довольно смущен из-за неопределенных терминов, супер-обобщений, сделанных в операционных Системные книги и подробные сведения об их внедрении онлайн. Поэтому я пытаюсь найти ответ, который может удовлетворить меня.
так я пришел к выводу, что нити поддерживать свои собственные стеки и локальные переменные хранятся в стеке, так что может невозможные совместное использование локальных переменных в потоках.
В потоках процесса есть одно и то же адресное пространство.
«Переменная» - это концепция языка программирования. Переменные исчезают, когда исходный код проходит через компилятор (некоторые могут быть сведены к символам).
Темы могут делиться абсолютно всей памятью. Один поток может получить доступ к любому местоположению памяти другого.
Легкость в том, что это делается, зависит от языка программирования и базовой поддержки компоновщика. Существует очень мало языков программирования, которые поддерживают реальную потоковую поддержку (например, Ada-called text). Ada имеет явные механизмы, позволяющие потокам обмениваться данными с помощью переменных.
Итак:
Читаю операционной системы Основные понятия по Silberschatz 7-е изд,
Это начало вашей проблемы.
В нем говорится, что потоки одного и того же процесса разделяют раздел кода, раздел данных и другие O.S. ресурсы,
Существуют все концепции системы. Во многих системах нет раздела «Секция кода» и «данных». Существует просто память с определенными атрибутами (например, только чтение, чтение/запись, чтение/выполнение).
но имеют отдельные наборы стеков и регистров.
Регистры представляют собой системный ресурс, который выделяется при планировании потока. Нить не имеет собственного набора регистров. Каждый поток имеет свой собственный набор значений регистров, которые загружаются, когда поток активен и сохраняется, когда он становится неактивным.
Стеки - это всего лишь блоки памяти чтения/записи.
Однако проблема связана с тем, что потоки совместно используют локальные переменные, но не являются локальными переменными, хранящимися в стеке, поэтому отдельные потоки должны иметь свои собственные копии?
Опять же, потоки обмениваются памятью. Они используют «локальные» переменные только в том случае, если используемый язык программирования поддерживает такой обмен или такое разделение происходит путем «аварии».
Отображение переменных для использования типа распределения памяти является функцией компилятора. FORTRAN 66/77 и COBOL обычно не выделяли никаких переменных в стеке
Потоки ОС, совместимые с 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);
}
стека вызовов, который отслеживает выполнение управления потоки - это то, что не разделяется между потоками процесса. Однако этот момент зависит от реализации, поскольку об этом не говорится в вышеупомянутом стандарте.
- 1. AOP с локальными переменными Аннотации
- 2. forward_call с локальными переменными
- 3. Mockito с локальными переменными
- 4. Связаны ли потоки стандартных C++?
- 5. Связаны ли потоки с полями классов?
- 6. Связаны ли потоки в Ruby с параллелизмом?
- 7. Динамический MySQL с локальными переменными
- 8. Путаница рекурсии с локальными переменными
- 9. LINQ над локальными переменными
- 10. Связаны ли потоки между веб-модулями?
- 11. Динамические библиотеки с локальными и статическими переменными
- 12. Управление указателем C++ с локальными переменными
- 13. Проблема с локальными переменными в C#
- 14. Сохраненная процедура с локальными и входными переменными
- 15. Lambda компиляция поведения с локальными переменными
- 16. Не поддерживает ли поддержка JavaScript с локальными переменными?
- 17. Какие потоки точно связаны с процессором
- 18. Рекомендации по рефакторингу с локальными переменными
- 19. Использование String.Format с локальными переменными C#
- 20. рекурсивная proc с локальными переменными в сборке
- 21. Проблема с контекстным локальными переменными и условными
- 22. threading with python: проблемы с локальными переменными
- 23. Делегаты создают проблемы безопасности потоков с локальными переменными?
- 24. Выполнить функцию C в отдельных потоках с локальными глобальными переменными
- 25. Являются ли python «глобальными» (модульными) переменными нитями локальными?
- 26. Безопасно вернуть вектор, заполненный локальными переменными?
- 27. Разница между локальными переменными и аргументами
- 28. Путаница между локальными переменными, переменными экземпляра и символами
- 29. Переменные сеанса PHP заменяются локальными переменными?
- 30. C++ лямбда лексического замыкание над локальными переменными
«Проблемный набор» может быть неправильным или с использованием плохой терминологии, трудно сказать. Можете ли вы опубликовать значимую цитату? –
Но: Нет, потоки не используют реальные локальные переменные. Но, например, в C#, локальная переменная может быть захвачена или «закрыта», а затем становится другой. –