Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
-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`у таймаут ? Или в каких случаях он нужен ?
Нам же нужно постоянно проверять сокеты на предмет готовности к операции, зачем может пригодится таймаут?

C++
1
2
3
4
5
6
7
int select(
  [in]      int           nfds,
  [in, out] fd_set        *readfds,
  [in, out] fd_set        *writefds,
  [in, out] fd_set        *exceptfds,
  [in]      const timeval *timeout
);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2021, 11:37
Ответы с готовыми решениями:

Блокирующие функции
В хелпе qt часто написано - функция блокирующая и неблокирующая... я так понимаю, что неблокирующие порождают отдельный процесс,...

блокирующие сокеты
блокируют ли сокеты нити (thread)?

Indy - блокирующие сокеты
вообщем пытался подключиться к серверу с помощью TCPclient ,но там нет события где должно выдавать данные,в стандартных сокетах они...

7
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,851
Записей в блоге: 15
29.12.2021, 11:39
С poll кошерней. Не придется по потоку на каждого клиента заводить (а то ведь не ровен час, количество PID'ов выйдет за пределы uint16_t).
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
29.12.2021, 13:17
Цитата Сообщение от Optimus11 Посмотреть сообщение
он не блокирует поток и может в одном потоке обрабатывать те же 100 соединений
это неверно.
и из этого следуют дальнейшие ошибочные выводы, что select не лучше.
Цитата Сообщение от Optimus11 Посмотреть сообщение
Ведь - это все равно нужно в цикле постоянно вызывать Select(), а Select() уже будет вызвать свой цикл прохода о сокетам - и получится - та же самая трата времени CPU ? Разве нет ?
нет, select блокирует выполнение до того, как один или несколько сокетов из read_fds, write_fds или except_fds не станут "активны", то есть получат событие.
либо, второй вариант выхода из функции select - по таймауту, указанному в последнем параметре.
функция select является системным вызовом, поэтому нет, она не крутит внутри никаких циклов, а срабатывает по событию в ядре ОС и не ест CPU, пока ждёт событий.

хотя select не лишён недостатков.
проблема select заключается в том, что после выхода из неё нужно пройти по всем переданным сокетам и проверить, какой из них выставлен.
это даёт O(N) сложность обработки результатов.
poll, к слову, в этом плане ничем не лучше. ЕМНИП, он работает чуть быстрее, но проверять придётся также перебором и проверкой событий.

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

P.S. на винде лучше всего использовать IOCP, на линуксе epoll, на FreeBSD kqueue, но для начального понимания сойдёт и select или poll.
1
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,851
Записей в блоге: 15
29.12.2021, 14:03
Цитата Сообщение от GbaLog- Посмотреть сообщение
poll, к слову, в этом плане ничем не лучше.
Зато poll не требует, чтобы все файловые дескрипторы строго подряд были! А select требует. В общем, если есть два набора файловых дескрипторов, и надо лишь один опрашивать, то select будет постоянно ложные срабатывания давать, когда fd из другого набора окажется в диапазоне 0..fdmax.
Для низконагруженного сервера действительно лучше будет по одному потоку выделять на каждого клиента - там можно и select'ом проверять активность (а если не нужно асинхронно клиенту что-то отправлять, то даже блокирующий read использовать). А вот при высокой нагрузке удобней всего poll (именно poll, а не epoll; хотя, это, наверное, на любителя). Как только закрылся какой-то сокет, вместо него в массив дескрипторов помещаем дескриптор последнего и уменьшаем количество.
Конечно, если бы poll принимал не массив, а связный список, было бы легче: не нужно было бы лишних манипуляций с дескрипторами проводить, когда один закрылся.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
29.12.2021, 14:03  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
функция select является системным вызовом, поэтому нет, она не крутит внутри никаких циклов, а срабатывает по событию в ядре ОС и не ест CPU, пока ждёт событий.
То есть ОС оповещает -->Select, что на каком то сокете из массива произошло событие, но не оповещает на каком и после этого сообщение Select как раз уже проходится циклом по массиву сокетом - ища на каком сокете/сокетах произошло событие и после нахождение возвращает - данные об этом сокете ?

Цитата Сообщение от GbaLog- Посмотреть сообщение
либо, второй вариант выхода из функции select - по таймауту, указанному в последнем параметре.
Если я более менее правильно выше понял работу Select - то назначение таймаута не понятно. Зачем выходит из Select по таймауту, если грубо говоря моя цель с которой я вызывал Select - это узнать произошли ли события на сокетах и если да, то на каких. Если я выйду по таймауту, то это значит, что Select`у не пришло сообщение от ОС о событиях на сокете и Select завершился просто так и мне его же опять нужно вызвать. Как то этот момент не понятен совсем.
0
Windows must die
828 / 834 / 102
Регистрация: 23.11.2021
Сообщений: 4,851
Записей в блоге: 15
29.12.2021, 14:13
Если работать без поллинга тем же select'ом, то как писать клиенту?
select и нужен для того, чтобы проверять, нет ли сведений от клиента, не блокируя основной поток. Если что-то клиенту нужно отправить - отправляем, а потом опять поллинг вызываем.
0
2732 / 887 / 330
Регистрация: 10.02.2018
Сообщений: 2,095
29.12.2021, 14:29
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Select`у не пришло сообщение от ОС о событиях на сокете и Select завершился просто так и мне его же опять нужно вызвать
Допустим вы хотите отключить клиента, если от него долго нет запросов. Как сделаете подобное без тайм-аута? А так довольно удобно, вышли по тайм-ауту, проверили время и опять поставили ожидание.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
29.12.2021, 14:56
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
То есть ОС оповещает -->Select, что на каком то сокете из массива произошло событие, но не оповещает на каком и после этого сообщение Select как раз уже проходится циклом по массиву сокетом - ища на каком сокете/сокетах произошло событие и после нахождение возвращает - данные об этом сокете ?
нет.
select лишь показывает, что на каком-то из переданных сокетов произошло событие.
select возвращает кол-во сокетов, на которых сработало какое-то событие.
проверить на каком - это уже ваша задача. проверяется с помощью FD_ISSET.
про таймаут вам ответили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2021, 14:56
Помогаю со студенческими работами здесь

Как создать блокирующие сокеты?
Какую библитеку нужно подключить для того чтобы использовать болкирующие сокеты для Windows библиотека Winsock подойдет?? И как обьявить...

В IE появляются окна блокирующие работу
Возможно проблема была в антивирусе AVAST, сейчас установил NOD32, но не уверен, что система "чистая". Интернет работает...

Обновление Flash Player'a, блокирующие сайты
Поймал сей недуг... (Как и где понятия не имею.) Антивирусы игнорят... Блокирует два компа и два ведроида из домашней сети... Блокирует...

Как обойти сервера блокирующие сайты?
Как обойти сервера блокирующие сайты? Вот путь: tracert www.ru-admin.net Трассировка маршрута к blocksex.com с максимальным числом...

3 способа подключения javascript, не блокирующие построение DOM
Ребят, подскажите пожалуйста 3 способа подключения javascript, при скачивании не блокирующие построение DOM дерева


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru