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

Как примечание стороны: Если у Ваших пользователей интранет также есть доступ к Интернету, можно использовать виджет SlideShare для встраивания презентаций PowerPoint в веб-сайт.

(Не забывают отмечать Ваше представление как частное!)

239
задан flow2k 5 July 2017 в 21:34
поделиться

7 ответов

Вы в значительной степени правы, но потоки совместно используют все сегменты , кроме стека. У потоков есть независимые стеки вызовов, однако память в других стеках потоков по-прежнему доступна, и теоретически вы можете хранить указатель на память в локальном стековом фрейме некоторого другого потока (хотя вам, вероятно, следует найти лучшее место для размещения этой памяти!).

159
ответ дан 23 November 2019 в 03:21
поделиться

Сообщите интервьюеру, что это полностью зависит от реализации ОС.

Возьмем, к примеру, Windows x86. Есть только 2 сегментов [1], код и данные. И оба они отображаются на все адресное пространство размером 2 ГБ (линейное, пользовательское). База = 0, Лимит = 2 ГБ. Они бы сделали один, но x86 не позволяет сегменту одновременно считывать / записывать и выполнять. Итак, они сделали два и установили CS, чтобы они указывали на дескриптор кода, а остальные (DS, ES, SS и т.д.), чтобы указывать на другой [2]. Но оба указывают на одно и то же!

Человек, опрашивающий вас, сделал скрытое предположение, что он / она не заявлял, и это глупый трюк.

Итак, относительно

Q. Так скажите мне, какой сегмент резьбы share?

Сегменты не имеют отношения к вопросу, по крайней мере, в Windows. Потоки разделяют все адресное пространство. Существует только 1 сегмент стека, SS, и он указывает на то же самое, что и DS, ES и CS [2]. Т.е. все кровавое пользовательское пространство . 0–2 ГБ. Конечно, это не означает, что потоки имеют только 1 стек. Естественно, у каждого свой стек, но сегменты x86 для этой цели не используются.

Возможно, * nix делает что-то другое. Кто знает. Предпосылка, на которой был основан вопрос, была нарушена.


  1. По крайней мере, для пользовательского пространства.
  2. Из блокнота ntsd : cs = 001b ss = 0023 ds = 0023 es = 0023
27
ответ дан 23 November 2019 в 03:21
поделиться

Из Википедии (я думаю, что это будет действительно хороший ответ для интервьюера: P)

Темы отличаются от традиционных многозадачная операционная система процессы, в которых:

  • процессы обычно независимы, а потоки существуют как подмножества process
  • процессы несут значительную информацию о состоянии, в то время как несколько потоков в состоянии совместного использования процесса поскольку память и другие ресурсы
  • процессы имеют отдельные адресные пространства, тогда как потоки разделяют свои адресное пространство
  • процессы взаимодействуют только через предоставляемый системой межпроцесс механизмы связи.
  • Переключение контекста между потоками в одном процессе обычно происходит быстрее чем переключение контекста между процессы.
51
ответ дан 23 November 2019 в 03:21
поделиться

Потоки совместно используют сегменты кода, данных и кучу, но не совместно используют стек.

12
ответ дан 23 November 2019 в 03:21
поделиться

Потоки совместно используют данные и код, а процессы - нет. Стек не является общим для обоих.

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

           Process   Thread

   Stack   private   private
   Data    private   shared
   Code    private1  shared2

1 Код является логически частным, но может использоваться совместно по соображениям производительности. 2 Я не уверен на 100%.

5
ответ дан 23 November 2019 в 03:21
поделиться

Поток разделяет кучу (есть исследования о куче, специфичной для потока), но текущая реализация разделяет кучу. (и конечно же код)

0
ответ дан 23 November 2019 в 03:21
поделиться

Темы разделяют все [1]. Для всего процесса существует одно адресное пространство.

Каждый поток имеет свой собственный стек и регистры, но все стеки потоков видны в общем адресном пространстве.

Если один поток выделяет некоторый объект в своем стеке и отправляет адрес другого потока, они оба будут иметь равный доступ к этому объекту.


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

] Формат файла для исполняемого файла (например, ELF) имеет в нем отдельные разделы, которые могут называться сегментами, содержащими скомпилированный код (текст), инициализированные данные, символы компоновщика, информацию отладки и т. Д. Нет кучи или стека. сегменты здесь, так как это конструкции только во время выполнения.

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

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


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

исполняемый файл только для чтения для кода / текста и неисполняемый файл с копированием при записи для инициализированных данных).

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


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

исполняемый файл только для чтения для кода / текста и неисполняемый файл копирования при записи для инициализированных данных).

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


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

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


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

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


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

повторно работает в виртуальном режиме 8086. Стек каждого потока - это фрагмент памяти, выделенный во время создания потока, с текущим верхним адресом стека, хранящимся в регистре указателя стека, и каждый поток хранит свой собственный указатель стека вместе со своими другими регистрами.


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

повторно работает в виртуальном режиме 8086. Стек каждого потока - это фрагмент памяти, выделенный во время создания потока, с текущим верхним адресом стека, хранящимся в регистре указателя стека, и каждый поток хранит свой собственный указатель стека вместе со своими другими регистрами.


[1] Хорошо, я знаю: сигнал маски, TSS / TSD и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.

4
ответ дан 23 November 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: