Threads e processos são contextos de execução. Eles diferem principalmente apenas pela quantidade de estado compartilhado (memória, manipuladores de sinal, descritores de arquivo, ...) com os outros contextos de execução (processos compartilham pouco com outros processos; threads compartilham muito com os outros threads no mesmo processo).
A maioria dos sistemas operacionais mantém as duas coisas separadas e, portanto, conhece vários tipos de contexto de execução.
O kernel do Linux, por outro lado, possui apenas um tipo de contexto de execução, capaz de compartilhar ou não as coisas com os outros. Se você deseja um processo, configure-o para que ele compartilhe pouco, ou para threads, configure-os para que eles compartilhem o que precisam. Você pode configurar as coisas para que elas se comportem de maneira inadequada para a terminologia do processo / encadeamento.
A API POSIX normalmente usada quando a programação para Linux conhece apenas processos e threads e, portanto, a maioria dos programas realmente não se importa com o que é um detalhe de implementação para eles na maneira como as responsabilidades são divididas entre o kernel e o espaço do usuário. Implementações mais antigas de threads vazaram alguns detalhes da implementação (ps mostrando threads, identificação de thread e identificação de processo se misturando, ...) e não forneceram a semântica exata do POSIX em alguns casos (a entrega do sinal era problemática IIRC).