Для ОС почти нет принципиальной разницы между процессом и потоком. При создании процесса происходит выделение нового куска памяти, при создании потока - это не обязательно происходит, поток имеет доступ к памяти родителя, процесс нет. Тоесть, в контексте вопроса можно ограничится разговором о потоках.
Потоков может быть столько, сколько позволяет память, даже на однопроцессорной и одноядерной железке.
Активность потоков может управляться на нескольких уровнях. Во первых, ОС может в любой момент тормазнуть исполнение потока. Даже если этому и можно помешать, врядли это легко, да и врядли нужно это делать. Среды исполнения, иногда, позволяют указать, сколько потоков запустить для исполнения программы. Например среда исполнения erlang или go позволяет программам создавать не дорогие потоки ОС, на создание которых уходит масса времени, а более легкие, жизненным циклом которых сама среда и управляет. Происходит отображение N потоков программы на M потоков ОС, которые запрашиваются один раз, при старте.
Поток может находится в одном из состояний: спит - когда планировщик его остановил, активен - когда поток получил управление, заблокирован - когда поток ждет какое - то событие или окончание какого - то действия, например прихода данных по сети, ошибка - когда происходит обработка ошибки или освобождение ресурсов и смерть потока.
Вопрос оптимальности создания более одного потока/процесса всегда следует рассматривать в контексте конкретной задачи. Даже при неблокирующем обмене данными между потоками, как минимум, переключение потоков, если речь не идет о количестве потоков меньше или равном количеству присутствующих ядер, имеет свою цену по времени. Подозреваю, многопоточная программа начинает выигрывать у однопоточной, когда количество потоков, которым надо исполнятся паралельно не превосходит количество доступных ядер. Как только потоков становится больше, в дело приходится вступать планировщику, и естественно, он работает не мгновенно.
Вопрос оптимальности архитектуры тоже, на мой взгляд, не имеет общего ответа. Для вычислительных задач может оказаться сравнимо, использовать один двухядерный процессор, или материнку с поддержкой 2 процессоров, а, например, для запуска веб сервера и БД к нему вообще лучшим вариантом может оказаться два независимых компютера.