O comando kill é um invólucro muito simples para a chamada de sistema kill , que conhece apenas identificações de processo (PIDs). pkill e killall também são wrappers para a chamada de sistema kill , (na verdade, para a biblioteca libc que chama diretamente a chamada do sistema), mas pode determinar os PIDs para você, com base em coisas como nome do processo, proprietário do processo, id da sessão, etc.
Como pkill e killall work podem ser vistos usando ltrace ou strace neles. No Linux, ambos lêem o sistema de arquivos /proc e, para cada pid (diretório) encontrado, percorre o caminho de maneira a identificar um processo pelo nome ou por outros atributos. Como isso é feito, tecnicamente falando, é específico do kernel e do sistema. Em geral, eles lêem de /proc/<PID>/stat , que contém o nome do comando como o segundo campo. Para pkill -f e pgrep examinar a entrada /cmdline para a entrada proc de cada PID.
pkill e pgrep usam a chamada de sistema readproc , enquanto killall não. Eu não poderia dizer se há uma diferença de desempenho: você terá que testar isso sozinho.