Здравствуйте!
Помогите, пожалуйста, внести ясность и понять, как именно работает современный многоядерный процессор.
Допустим, есть скрипт, который на сервере работает. Раньше, когда ядро у процессора было одно, все было ясно - процессор обрабатывает скрипт в один поток последовательно.
Затем появились многоядерные процессоры, которые могут распараллеливать и одновременно выполнять несколько скриптов (каждое ядро независимо от других может что-то выполнять).
Тут же появились языки программирования и инструменты, которые умеют работать с многопоточностью. Если представить очень грубо, то работа заключается в умении"раздавать" задачи нескольким ядрам, а затем собирать результат работы каждого ядра и "склеивать" его в конечный результат. Например, если скрипт состоит из четырех сложных вычислений, каждое их которых занимает 1 секунду, то одноядерный процессор выполнял бы эти вычисления по очереди и всего потратил бы 4 секунды. А четырехядерный процессор возьмет по одному вычислению на каждое ядро, параллельно выполнит все 4 расчета за 1 секунду и отдаст результат за 1 секунду. Ну это если очень грубо представить.
С этим все более-менее понятно. Но выше речь шла об умении ЯП задействовать ядра процессора на усмотрение программиста, который пишет программу. А как будет происходить работа в следующем случае:
Я пишу скрипт на nodejs + websocket. Это будет онлайн-чат. Один человек пишет сообщение, другой его получает и тд. Будут ли в этом случае задействованы все ядра процессора? Если да, то как? Nodejs из коробки запускается и задействует все ядра?
Если я проведу аналогию с PHP (а больше я, к сожалению, ни с чем пока не работал), то в PHP скрипт каждый раз "запускается" и "умирает". У него нет состояния. Пришел запрос от пользователья - запустился скрипт, подключился к базе, записал туда что-нибудь и умер. Поэтому каждый новый запрос может брать на себя другое ядро. А в nodejs есть это самое "состояние". То есть программа запущена и данные одни на всех.
let users: [];
let messages: [];
ws.on('connection', socket=> {
users.push(socket);
socket.on('message', message => {
messages.push(message);
users.forEach(user => user.emit('message', message));
});
});
Как в этом случае запросы будут обрабатываться параллельно? Они ведь работают с одними и теми же данными.
Объясните, пожалуйста.