Если процессор одноядерный, и так как несколько потока выполняются у нас одновременно, то нужно создать для пользователя, эту самую одновременность выполнения.
Операционная система, делает это хитро, за счет переключения между выполнением этих потоков (эти переключения мгновенны и время идет в миллисекундах).
То есть, система некоторое время выполняет один поток, затем резко переключается на выполнение другого потока, и так далее по кругу.
Таким образом, создается впечатление одновременного выполнения нескольких задач.
Но при этом теряется производительность.
Если процессор многоядерный, тогда переключения может не потребоваться.
Система будет посылать каждый поток на отдельное ядро.
Несколько потоков могут выполняться одновременно, каждый на своем ядре.
Но тут есть проблема.
Для использования преимуществ многоядерности, код программы должен быть оптимизирован для выполнения на многоядерных процессорах.
Это означает, что программа, или процесс, должна быть максимально распараллелена в коде по отдельным задачам