Сервер, який прослуховує порт 80, НЕ МОЖЕ обробляти декілька процесів. Прості демони TCP старших років могли одночасно обробляти лише одне з'єднання. Ви можете наслідувати цю поведінку за допомогою програми, такої як netcat
прослуховування на певному порті, і спробувати підключити до неї дві машини. Один увійде, інший відскочить без зв’язку. Ці демони здебільшого марні, тому їх більше ніколи не бачиш.
Щось на зразок веб-сервера, воно прослуховує безпосередньо на порту. Що потрібно пам’ятати, це те, що він сидить зверху бібліотеки сокетів операційної системи. Коли встановлено нове з'єднання, бібліотека сокет передає абсолютно новий сокет програмному забезпеченню веб-сервера. У цей момент у веб-серверного програмного забезпечення є деякі варіанти.
Однією з можливостей є те, що він передає об'єкт socket новому потоку в тому ж процесі. Щоразу, коли спілкування відбувається через цю розетку, ця нитка буде обробляти її. Батьківський процес опосередковує, які потоки активні в будь-який момент часу, що може бути багато.
Інша можливість полягає в тому, що він запускає новий процес і передає об'єкт socket в процес. Наскільки я розумію, тепер справа в розетці операційної системи опосередковує зв'язок між цими дочірніми процесами та їх цілями. Батьківський процес все ще має певний контроль над процесами, такими як вбивство повішених та інші міжпроцесові комунікації.
Який із цих підходів є більш ефективним, залежить від операційної системи. IIRC, Apache може працювати в будь-якому режимі.
По суті, бібліотека сокет забезпечує рівень паралельної обробки веб-сервера. Він може працювати з декількома одночасними з'єднаннями, активно передаючи дані, все приймаючи нові з'єднання.
Для браузера, який може запускати кілька спроб підключення до веб-сервера, щоб покращити час завантаження, паралелізм застосовується і на кінці браузера, це добре і чудово. Веб-переглядач відслідковує стан сторінки під час її завантаження, і кілька спроб з’єднання, які вона закручує, - це частина процесу.
recv()
в кожному процесі.