Как примечание стороны: Если у Ваших пользователей интранет также есть доступ к Интернету, можно использовать виджет SlideShare для встраивания презентаций PowerPoint в веб-сайт.
(Не забывают отмечать Ваше представление как частное!)
Вы в значительной степени правы, но потоки совместно используют все сегменты , кроме стека. У потоков есть независимые стеки вызовов, однако память в других стеках потоков по-прежнему доступна, и теоретически вы можете хранить указатель на память в локальном стековом фрейме некоторого другого потока (хотя вам, вероятно, следует найти лучшее место для размещения этой памяти!).
Сообщите интервьюеру, что это полностью зависит от реализации ОС.
Возьмем, к примеру, 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 делает что-то другое. Кто знает. Предпосылка, на которой был основан вопрос, была нарушена.
блокнота ntsd
: cs = 001b ss = 0023 ds = 0023 es = 0023
Из Википедии (я думаю, что это будет действительно хороший ответ для интервьюера: P)
Темы отличаются от традиционных многозадачная операционная система процессы, в которых:
- процессы обычно независимы, а потоки существуют как подмножества process
- процессы несут значительную информацию о состоянии, в то время как несколько потоков в состоянии совместного использования процесса поскольку память и другие ресурсы
- процессы имеют отдельные адресные пространства, тогда как потоки разделяют свои адресное пространство
- процессы взаимодействуют только через предоставляемый системой межпроцесс механизмы связи.
- Переключение контекста между потоками в одном процессе обычно происходит быстрее чем переключение контекста между процессы.
Потоки совместно используют сегменты кода, данных и кучу, но не совместно используют стек.
Потоки совместно используют данные и код, а процессы - нет. Стек не является общим для обоих.
Процессы также могут совместно использовать память, точнее код, например, после Fork ()
, но это деталь реализации и оптимизация (операционной системы). Код, совместно используемый несколькими процессами, будет (надеюсь) дублироваться при первой записи в код - это известно как копирование при записи . Я не уверен в точной семантике кода потоков, но предполагаю, что общий код.
Process Thread Stack private private Data private shared Code private1 shared2
1 Код является логически частным, но может использоваться совместно по соображениям производительности. 2 Я не уверен на 100%.
Поток разделяет кучу (есть исследования о куче, специфичной для потока), но текущая реализация разделяет кучу. (и конечно же код)
Темы разделяют все [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 и т. д. Адресное пространство, включая все его отображенные программные сегменты, по-прежнему используется совместно.