Назад | Перейти на главную страницу

Как отличить потоки от процессов в top и ps в Linux?

Мне довольно сложно различать потоки и процессы, когда я запускаю верхнюю часть, а затем нажимаю H или запускаю ps -Hef.

Я знаю, что у них одни и те же атрибуты, что делает их похожими, но мне было интересно, есть ли в выводе что-нибудь, что можно использовать для определения того, что такое процесс, а что поток?

Для меня все они выглядят как обычные процессы, поэтому их трудно отличить друг от друга.

Я думаю, что вам следует сосредоточиться на «контексте исполнения». У каждого процесса (или задачи) есть собственное адресное пространство. Подумайте о потоках как о подмножестве процессов, использующих одно и то же адресное пространство. ps и top не покажут это, но ткните вокруг /proc/<pid>status и /proc/<pid>map. Также можно попробовать strace и gdb, чтобы увидеть, что делает программа. Вот вывод gdb для простой программы на c, которая используетpthread_create`.

# gdb mythread
;...]

Reading symbols from /root/mythread...(no debugging symbols found)...done.
(gdb) break main
Breakpoint 1 at 0x40080f
(gdb) break hello_world
Breakpoint 2 at 0x400761
(gdb) r
Starting program: /root/mythread 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, 0x000000000040080f in main ()
(gdb) c
Continuing.
The main process id is 12887
[New Thread 0x7ffff77f1700 (LWP 12891)]
[Switching to Thread 0x7ffff77f1700 (LWP 12891)]

Breakpoint 2, 0x0000000000400761 in hello_world ()
(gdb) c
Continuing.
[New Thread 0x7ffff6ff0700 (LWP 12892)]
[Switching to Thread 0x7ffff6ff0700 (LWP 12892)]

Breakpoint 2, 0x0000000000400761 in hello_world ()

Сопоставления информации о пользователях

(gdb) info proc mappings
process 12896
Mapped address spaces:

          Start Addr           End Addr       Size     Offset objfile
            0x400000           0x401000     0x1000        0x0 /root/mythread
            0x600000           0x601000     0x1000        0x0 /root/mythread
            0x601000           0x602000     0x1000     0x1000 /root/mythread
      0x7ffff77f2000     0x7ffff79b5000   0x1c3000        0x0 /usr/lib64/libc-2.17.so
      0x7ffff79b5000     0x7ffff7bb4000   0x1ff000   0x1c3000 /usr/lib64/libc-2.17.so
      0x7ffff7bb4000     0x7ffff7bb8000     0x4000   0x1c2000 /usr/lib64/libc-2.17.so
      0x7ffff7bb8000     0x7ffff7bba000     0x2000   0x1c6000 /usr/lib64/libc-2.17.so
      0x7ffff7bba000     0x7ffff7bbf000     0x5000        0x0 
      0x7ffff7bbf000     0x7ffff7bd6000    0x17000        0x0 /usr/lib64/libpthread-2.17.so
      0x7ffff7bd6000     0x7ffff7dd5000   0x1ff000    0x17000 /usr/lib64/libpthread-2.17.so
      0x7ffff7dd5000     0x7ffff7dd6000     0x1000    0x16000 /usr/lib64/libpthread-2.17.so
      0x7ffff7dd6000     0x7ffff7dd7000     0x1000    0x17000 /usr/lib64/libpthread-2.17.so
      0x7ffff7dd7000     0x7ffff7ddb000     0x4000        0x0 
      0x7ffff7ddb000     0x7ffff7dfd000    0x22000        0x0 /usr/lib64/ld-2.17.so
      0x7ffff7fed000     0x7ffff7ff0000     0x3000        0x0 
      0x7ffff7ff9000     0x7ffff7ffa000     0x1000        0x0 
      0x7ffff7ffa000     0x7ffff7ffc000     0x2000        0x0 [vdso]
      0x7ffff7ffc000     0x7ffff7ffd000     0x1000    0x21000 /usr/lib64/ld-2.17.so
      0x7ffff7ffd000     0x7ffff7ffe000     0x1000    0x22000 /usr/lib64/ld-2.17.so
      0x7ffff7ffe000     0x7ffff7fff000     0x1000        0x0 
      0x7ffffffde000     0x7ffffffff000    0x21000        0x0 [stack]
  0xffffffffff600000 0xffffffffff601000     0x1000        0x0 [vsyscall]