Чем стек, принадлежащий потоку, отличается от стека процесса? - PullRequest
0 голосов
/ 14 марта 2012

Может кто-нибудь сказать, в чем разница между двумя типами стеков?

Если я вижу /proc/<pid>/map и proc/pid/task/<tid>, я вижу ту же карту. Есть ли способ, которым мы можем видеть стек, принадлежащий исключительно потоку (я имею в виду не стек потока процесса), или если есть какая-либо команда gdb для определения стека, специфичного для потока.

Спасибо, Капил

Ответы [ 4 ]

2 голосов
/ 15 марта 2012

Есть ли способ увидеть стек, принадлежащий исключительно потоку

Нет такой вещи: все потоки разделяют все адресное пространство, поэтому стек не "принадлежит исключительно" какому-либо конкретному потоку. Фактически, вы можете взять адрес локальной переменной и передать этот адрес другому потоку, который затем может читать или записывать значения в него.

Я полагаю, что вы спрашиваете: «Как определить, какую область памяти в /proc/<pid>/maps использует поток X в качестве своего стека?». Если это вопрос, вы можете print $sp найти текущий указатель стека для интересующего вас потока, а затем найти область в /proc/<pid>/maps, которая перекрывает $sp.

0 голосов
/ 20 марта 2012

Просто ради полноты я расскажу здесь о том, что когда-либо мог понять.

Диаграмма, приведенная выше, неверна и должна быть изменена следующим образом:

    Process address Space:
 +----------------------------------------------------+
 |                                                    |

 :                                                    :
 :                                                    :




 |                                                    |
 |        +--------+ thread2 stack vma start          |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |    | stack grows downwards       |
 |        | :  :   |    |                             |
 |        :        :    V                             |
 |        :        :                                  |
 |        +--------+ thread2 stack vma ends           |
 |                                                    |
 |                                                    |
 |        +--------+ thread1 stack vma start          |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |    | stack grows downwards       |
 |        | :  :   |    |                             |
 |        :        :    V                             |
 |        :        :                                  |
 |        +--------+ thread1 stack vma ends           |
 |                                                    |
 |                                                    |
 |        +--------+ Process stack vma start          |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |                                  |
 |        | +--+   |    | stack grows downwards       |
 |        | :  :   |    |                             |
 |        :        :    V                             |
 :        :        :                                  :
 :        +--------+ Process stack vma ends           :
 :                                                    :
 +----------------------------------------------------+

Тамошники получают свои отдельные стеки из памяти mmap'd. Это я говорю о реализации POSIX в glibc. Для лучшей справки обратитесь к функции allocate_stack () в nptl в glibc.

0 голосов
/ 15 марта 2012

@ Employerrussian

There is no such thing: all the threads share the entire address space, so the stack     
doesn't "belong exclusively" to any given thread. In fact, you can take an address of a 
local variable, and pass that address to a different thread, which can then read or write 
values to it.

What I believe you are asking is "how to tell which memory region in /proc/<pid>/maps is 
thread X currently using as its stack?". If that's the question, you can print $sp to 
find out current stack pointer for the thread you are interested in, and then find a   
region in /proc/<pid>/maps that overlaps $sp.

Правильно, они разделяют все адресное пространство, и также верно, что потоки имеют свой собственный стек, но все же это не объясняет, как стек потока отличается от стека другого потока или потока процесса. Я имею в виду, если это способ, которым мы можем это визуализировать:

 +--------+ stack vma start
 | +--+   | 
 | +--+ <------- stack of process       
 | +--+   |        
 | +--+   |        
 | :  :   |
 |        |
 |        |
 | +--+   |
 | +--+  <------- stack of thread1      
 | +--+   |       
 | +--+   |       
 | :  :   |
 |        | 
 |        |
 | +--+   |
 | +--+   |      
 | +--+  <------ stack of thread2     
 | +--+   |      
 | :  :   |
 :        :
 :        :  

 +--------+ stack vma end

(может быть, я совершенно неправ в этом, но это просто попытка прояснить ситуацию)

Что касается передачи адреса (локальной переменной), когда вы передаете его как адрес, вы можете читать или записывать в эту ячейку памяти, это присущее свойство с указателем.

0 голосов
/ 14 марта 2012

вы можете перечислить все потоки, используя info threads

, и переключиться на конкретный поток, используя thread <id>

, вы можете набрать thread apply all info registers, чтобы напечатать текущие регистры всех потоков.или, например, thread apply all bt, чтобы напечатать следы для всех потоков.

...