2013-06-20 5 views
-1

Мы знаем, что у thread есть свой собственный стек, который реализован в процессе. Но мой вопрос заключается в том, что когда thread реализован в его собственном стеке, это тот же самый стек, который используется процессом или любой другой функцией?где поток реализован в памяти?

Еще одно сомнение в том, что thread делит его глобальную переменную, дескриптор файла, обработчик сигналов и т. Д. Но как он делится всеми этими параметрами на одном и том же адресе, где выполняются все потоки?

Краткое описание будет оценено.

+2

Можете ли вы сформулировать этот вопрос. Сейчас трудно разобрать. – Gray

ответ

1

Когда поток реализован в его собственной стеке, это время, когда он является тем же самым стеклом, который используется процессом или любым другим?

Не могу разобрать это, но я получаю суть, я думаю.

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

Но как он делится всеми этими параметрами в пределах одного адреса?

Это также относится к глобальным переменным, дескрипторам файлов и т. Д. Все они являются общими.

Большинство потоковых реализаций, работающих под Linux, используют клон (2) для создания новых потоков. Цитировать с clone man page:

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

В отличие от fork (2), эти вызовы позволяют дочернему процессу совместно использовать части контекста выполнения с вызывающим процессом, таким как пространство памяти, таблицу файловых дескрипторов и таблицу обработчиков сигналов.

Вы можете увидеть клонированные процессы, используя ps -eLf под Linux.