$ ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 19:25 ? 00:00:00 init [4]
...
root 1699 1 1699 0 1 19:25 ? 00:00:00 /usr/bin/kdm
root 1701 1699 1701 8 2 19:25 tty10 00:13:10 /usr/bin/X :1 vt10 ...
root 1701 1699 1703 0 2 19:25 tty10 00:00:00 /usr/bin/X :1 vt10 ...
root 1706 1699 1706 0 1 19:25 ? 00:00:00 -:1
root 1707 1699 1707 0 2 19:25 tty9 00:00:02 /usr/bin/X :0 vt9 ...
root 1707 1699 1710 0 2 19:25 tty9 00:00:00 /usr/bin/X :0 vt9 ...
root 1713 1699 1713 0 1 19:25 ? 00:00:00 -:0
....
responde a sua pergunta, eu acho.
No entanto, a questão parece estar misturando várias coisas - multithreading não é sobre não usar fork()
/ exec()
. Os segmentos compartilham o mesmo espaço de endereço e, se você quiser executar um processo diferente, certamente não deseja que ele tenha acesso ao mesmo espaço de endereço. E se você decidiu não usar programas externos (especialmente no shell que você mencionou), você teria que codificar toda a funcionalidade novamente.
O multithreading não é uma cura para tudo. Na maioria das vezes, pode ser uma cura apenas para problemas bem paralisáveis - verifique a página wiki para obter um breve resumo visão global. Tornar um programa multithreaded não o torna melhor, na maioria dos casos ele piora devido aos bugs no código de sincronização (se estiver presente).