В чем смысл запускать на Х-ядерном процессоре более Х потоков?
================================================================

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

Понятие потоков же не недавно появилось, а очень давно, я думаю, что еще в 20 веке, но в середине 2000-х еще продавались компы с одноядерными процами. И я думаю, что уже в середине 2000-х было написано много программ, которые запускали кучу потоков, а выполняли эти проги на одноядерных процах. Вопрос - в чем в этом смысл??  

Даже сейчас я, как прогер, вижу в исходниках, да и просто на девелоперских ресурсах куски кода, где запускается куча потоков (бывает что и больше 10 потоков). Но сейчас компы с 2, 4, 8, ядрами (может, и 16 есть, но их точно меньше 1%). Опять таки вопрос - в чем смысл запускать на двухъядерном проце прогу, которая создает больше 2-х потоков?  

Единственная ситуация, которую я еще понимаю - это когда второй поток (тяжелый) создается для того, чтобы не подвешивать UI-поток (при этом постоянные переключения на UI-поток будут подтормаживать выполнение тяжелого потока, но по-крайней мере UI хотя бы будет реагировать на действия юзера). Но почему кучу потоков создают даже тогда, когда нет никакого UI? 

 Самый простой пример в котором используется несколько потоков, это работа с сетью.  
  

Если есть всего один поток, и он запрашивает данные из сети, то он остановит свое выполнения до момента, когда эти данные придут. Если же будет несколько потоков, то пока один ждет данные из сети, другой может спокойно продолжать работу. Помимо работы с сетью, есть еще операции чтения и записи, которые в некоторых случаях могут быть медленными. 

 да эффективность падает при переключении потоков, НО для нас важно исполнение задач именно параллельно, например ты ведешь мышкой по экрану - это отдельный процесс, который работает и должен работать параллельно.   

опятьже нужно понимать что один поток не может выполняться эффективно изза задержек -> как уже упомянули одни из самых длительных задержек при обращении к сети или жесткому диску, пока данные оттуда придут, можно переключить задачу, без потери производительности.  

при этом следует помнить что например поступление данных из оперативной памяти тоже имеет свои задержки, и если и пока очередная порция данных из оперативной памяти поступает, тоже можно переключиться на процесс в котором данные уже поступили и тд. 

 Смысл многопоточности в многозадачности. Именно многопоточность позволяла запускать несколько приложений одновременно на одноядерном процессоре.   

Не забывайте, что каждое приложение, каждая служба имеет минимум один поток. Но тем не менее даже на одноядерных процессорах можно запускать многозадачные ОС со времен 386 процессоров