|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
Select() vs блокирующие сокеты29.12.2021, 11:37. Показов 6097. Ответов 7
Метки нет (Все метки)
Здравствуйте,
Подскажите пожалуйста, в чем принципиальное отличие работы с сокетами с помощью Select() и в обычном блокирующем режиме с потоками ? -Ну то есть известно, что чтобы блокирующие сокеты не блокировали поток и выполнение дальнейшего кода, каждое новое соединение и новый сокет запускают в отдельном потоке, пусть это условно будет 100 сокетов/соединений/потоков, соответвенно процессор постоянно приключается между этими потоками - в условно в 90% случаях просто тратя своей процессорное время, так как в 90% времени сокеты в потоках ждут ответа от сервера, ну или как то так. -Select() - якобы предоставляет более "лучший" метод, он не блокирует поток и может в одном потоке обрабатывать те же 100 соединений, как я понял, достаточно грубо и условно, но эти 100 сокетов помещаются в массив и при вызове Select() - они тупо перебором опрашиваются на предмет завершения операций - или Send() или то, что сокет получил данные и можно вызвать Recv(). Но в чем принципиальное отличие то ?? Ведь - это все равно нужно в цикле постоянно вызывать Select(), а Select() уже будет вызвать свой цикл прохода о сокетам - и получится - та же самая трата времени CPU ? Разве нет ? И кстати само "кручение" Select в цикле и сам вызов Select в итоге не является ли блокирующим ? Или его нужно держать запущенным в отдельном от основного - потоке ? И если не сложно можете пожалуйста подсказать, какой сакральный смысл структуры timeval ? То в Select передается некий таймаут, но зачем и на что он влияет ?? Зачем Select`у таймаут ? Или в каких случаях он нужен ? Нам же нужно постоянно проверять сокеты на предмет готовности к операции, зачем может пригодится таймаут?
0
|
||||||
| 29.12.2021, 11:37 | |
|
Ответы с готовыми решениями:
7
Блокирующие функции блокирующие сокеты Indy - блокирующие сокеты |
|
Любитель чаепитий
|
|||
| 29.12.2021, 13:17 | |||
|
и из этого следуют дальнейшие ошибочные выводы, что select не лучше. либо, второй вариант выхода из функции select - по таймауту, указанному в последнем параметре. функция select является системным вызовом, поэтому нет, она не крутит внутри никаких циклов, а срабатывает по событию в ядре ОС и не ест CPU, пока ждёт событий. хотя select не лишён недостатков. проблема select заключается в том, что после выхода из неё нужно пройти по всем переданным сокетам и проверить, какой из них выставлен. это даёт O(N) сложность обработки результатов. poll, к слову, в этом плане ничем не лучше. ЕМНИП, он работает чуть быстрее, но проверять придётся также перебором и проверкой событий. но это во много раз лучше модели "поток на клиента", т.к. при большой нагрузке и большом кол-ве клиентов время ожидания процессорного времени для каждого потока увеличивается в разы. особенно на слабеньких серверах. P.S. на винде лучше всего использовать IOCP, на линуксе epoll, на FreeBSD kqueue, но для начального понимания сойдёт и select или poll.
1
|
|||
|
Windows must die
|
||
| 29.12.2021, 14:03 | ||
|
Для низконагруженного сервера действительно лучше будет по одному потоку выделять на каждого клиента - там можно и select'ом проверять активность (а если не нужно асинхронно клиенту что-то отправлять, то даже блокирующий read использовать). А вот при высокой нагрузке удобней всего poll (именно poll, а не epoll; хотя, это, наверное, на любителя). Как только закрылся какой-то сокет, вместо него в массив дескрипторов помещаем дескриптор последнего и уменьшаем количество. Конечно, если бы poll принимал не массив, а связный список, было бы легче: не нужно было бы лишних манипуляций с дескрипторами проводить, когда один закрылся.
0
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||
| 29.12.2021, 14:03 [ТС] | |||
|
0
|
|||
|
Windows must die
|
|
| 29.12.2021, 14:13 | |
|
Если работать без поллинга тем же select'ом, то как писать клиенту?
select и нужен для того, чтобы проверять, нет ли сведений от клиента, не блокируя основной поток. Если что-то клиенту нужно отправить - отправляем, а потом опять поллинг вызываем.
0
|
|
|
2732 / 887 / 330
Регистрация: 10.02.2018
Сообщений: 2,095
|
||
| 29.12.2021, 14:29 | ||
Сообщение было отмечено Optimus11 как решение
Решение
0
|
||
|
Любитель чаепитий
|
||
| 29.12.2021, 14:56 | ||
Сообщение было отмечено Optimus11 как решение
Решениеselect лишь показывает, что на каком-то из переданных сокетов произошло событие. select возвращает кол-во сокетов, на которых сработало какое-то событие. проверить на каком - это уже ваша задача. проверяется с помощью FD_ISSET. про таймаут вам ответили.
0
|
||
| 29.12.2021, 14:56 | |
|
Помогаю со студенческими работами здесь
8
Как создать блокирующие сокеты? В IE появляются окна блокирующие работу
Как обойти сервера блокирующие сайты? 3 способа подключения javascript, не блокирующие построение DOM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|