Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Правильное выделение памяти

31.05.2019, 01:37. Показов 4952. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как лучше всего выделять память для клиентов на сервере? Клиент отправляет серверу строку в асинхронно режиме которую он (сервер) должен обработать(к примеру клиент посылает серверу сообщения чтобы тот вывел их на экран), так вот появился вопрос если клиентов много то выделять для каждого нового свой буфер для приёму сообщений как мне кажется это не лучшая идея если смотреть со стороны ресурсов, т.к. если к примеру я буду выделять 1024 байт буфера для клиента который отправит только 10 байт то получится пустая трата ресурсов, есть идеи?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.05.2019, 01:37
Ответы с готовыми решениями:

Правильное выделение памяти объекта
Здравствуйте. не могу понять как правильно реализовать создание объектов, в зависимости от условия. Вот есть у меня базовый класс ...

ЕГЭ. С4, С2 - обработка массива - правильное выделение памяти
У меня вопрос к людям сдавшим ЕГЭ по информатике. В задании C4 часто приходится обрабатывать массив структур или просто массив. Что делать...

Правильное выделение динамической памяти для структур
Есть кусок кода работы с массивом структур. struct s{ string a; string b; string c; } arr; int N = 0; void...

70
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 16:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, точнее даже не так, это колбек который срабатывает когда событие переходит в сигнальное состояние, вроде так насколько я помню, могу ошибаться
Тут я знаю намного меньше тебя, извини если выше сказал какую-то херню.
Я работал только с обычными сокетам, знаю (вернее думаю, что знаю), как сделать сервер на большое количество коннектов. Но ни с overlapped, ни с boost::asio работать, к сожалению, не умею.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 17:48  [ТС]
oleg-m1973, собственно я и сам не много знаю(относительно конечно),но вот до того как Вы написали о подпрограммах завершения я знал очень мало ,а тема то интересная) Чтобы сервер написать на большое кол-во коннектов есть куча методов)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 17:57
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, собственно я и сам не много знаю(относительно конечно),но вот до того как Вы написали о подпрограммах завершения я знал очень мало ,а тема то интересная) Чтобы сервер написать на большое кол-во коннектов есть куча методов)
В общем, идея там такая - после того, как получишь сигнал, что в сокет пришли данные, надо как можно быстрее вычитать их из буфера сокета, чтоб не было переплнения.
Для этого я получаю размер данных ::ioctlsocket(...FIONREAD...), выделяю буфер (грубо - std::vector<std::byte>), считываю в него данные - recv, и кладу этот буфер в очередь коннекта.
В другом потоке я уже беру эти буферы из очереди, распарсиваю, обрабатываю и посылаю ответ, если нужно.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 18:25  [ТС]
oleg-m1973, да ,но это синхронный режим,с синхронным режимом проблем бы небыло,а в моем случае режим асинхронный ,тоесть я заранее уже должен указать буфер программы в который придут данные,тоесть размер должен быть указан до получения,одним из решений это просто создать буфер в динамической памяти и сначала обработать первые 4 знака сообщения ,а потом изменить размер буфера и в него вчитывать остальную часть

Добавлено через 2 минуты
eva2326, А я вот подумал,если мы будем использовать этот варинат
Цитата Сообщение от Toshkarik Посмотреть сообщение
Клиент отправляет размер посылки, и следом саму посылку.
И всё это - одним сообщением.
Сервер получает данные.
Он знает, что допустим, первые два байта хранят размер посылки.
Сначала выкачивает эти два байта,
и затем, узнав размер посылки,
выкачивает саму посылку.
По-моему, всё просто))
тогда же нету смысла в асинхронном режиме,т.к. мы то данные получим прямо в буфер программы но только те первые 4 байта,а дальше все остальное сообщение мы уже будет синхронно вытягивать с сетевого драйвера ,тогда смысла в асинхронном получении данных нет же,я правильно понимаю?
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
31.05.2019, 18:47
Цитата Сообщение от ReYalp Посмотреть сообщение
тогда же нету смысла в асинхронном режиме,т.к. мы то данные получим прямо в буфер программы но только те первые 4 байта,а дальше все остальное сообщение мы уже будет синхронно вытягивать с сетевого драйвера ,тогда смысла в асинхронном получении данных нет же,я правильно понимаю?
Какой вы вкладываете смысл в понятие "асинхронный режим" ?

Я вкладываю вот такой:

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

2.
Когда приходят данные,
механизм работы с сокетами запускает коллбэк для их обработки.
(для примера, см. boost::asio)

3.
Обработчик данных извлекает всю посылку.

4.
Обработчик данных обрабатывет всю посылку.

5.
PROFIT ???!!!!

Конечно, получив свои первые 4ре байта размера посылки,
вы можете и дальше продолжать асинхронно ждать
все остальные недостающие порции данных.
Размер то вам уже известен.

На мой взгляд это не удобно, и избыточно сложно.
Проще залипнуть на чтении всего послания.
0
 Аватар для Termit779
79 / 60 / 19
Регистрация: 22.11.2015
Сообщений: 193
31.05.2019, 18:47
ReYalp,

Смотри, собрал сервер на коленке

1. Тестируем реальную отправку данных с софтфона

Кликните здесь для просмотра всего текста


2. С помощью эмулятора SIP запросов на соединение отправляем 1 000 запросов с задержкой в 1 мс.

Кликните здесь для просмотра всего текста


3. Смотрим результат. Если сервер в результате потерял бы хоть один пакет, то данные были бы другие.

Кликните здесь для просмотра всего текста
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 19:07  [ТС]
eva2326,
Цитата Сообщение от eva2326 Посмотреть сообщение
Какой вы вкладываете смысл в понятие "асинхронный режим" ?
для меня асинхронный режим в случае приема данных значит то что данные приходят на сервер напрямую , получить сразу всю поссылку я могу конечно но тогда я должен заранее до ее прихода выделить для нее место ,а так как я не знаю сколько она будет весить я должен выделять под нее максимально места.
Termit779, я не работал с boos:asio и не знаю как все там устроено и вообще не понимаю что Вы мне пытаетесь показать ,я не спрашивал о получении данных в сетевой буфер.

Добавлено через 6 минут
Цитата Сообщение от ReYalp Посмотреть сообщение
на сервер напрямую
в том смысле что сразу на сервер ,их не нужно забирать с сетевого буфера
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 20:14
Цитата Сообщение от ReYalp Посмотреть сообщение
в том смысле что сразу на сервер ,их не нужно забирать с сетевого буфера
Принимаются они без тебя, асинхронно. Тут можешь не париться. Проблема в том, как их забрать.

Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, да ,но это синхронный режим,с синхронным режимом проблем бы небыло,а в моем случае режим асинхронный ,тоесть я заранее уже должен указать буфер программы в который придут данные,тоесть размер должен быть указан до получения,одним из решений это просто создать буфер в динамической памяти и сначала обработать первые 4 знака сообщения ,а потом изменить размер буфера и в него вчитывать остальную часть
Я разве писал, что ты что-то должен сделать заранее? Вроде я говорил, что ты должен выделить буфер по-факту, лучше асинхронно.
Второе - я вроде ничего не говорил тебе о содержимом буфера
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 20:30  [ТС]
oleg-m1973, так я говоррю что в асинхрронном режиме буфер создается и указывается в методе WSARecv() заранее ,тот буфер в который придут данные и если выделять буфер по факту получения данных и в него их записывать то это уже синхронный режим,разве не так?

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
тоесть я заранее уже должен указать буфер программы в который придут данные,тоесть размер должен быть указан до получения
А это я описал процесс асинхронного получения данных в программе

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
выделить буфер по-факту, лучше асинхронно.
И что значит выделить буфер асинхронно?)))
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 20:31
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, так я говоррю что в асинхрронном режиме буфер создается и указывается в методе WSARecv() заранее ,тот буфер в который придут данные и если выделять буфер по факту получения данных и в него их записывать то это уже синхронный режим,разве не так?
Нет, не так. Это вообще не о том. С одним коннектом ты работаешь в любом случае синхронно, в одном потоке (получаешь данные). Асинхронно - это когда ты получаешь данные с разных коннектов в разных потоках.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 20:33  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Асинхронно - это когда ты получаешь данные с разных коннектов в разных потоках.
Нет,это не так ,асинхронно данные можно получать в одном потоке,от множества клиентов,Вы путаете многопоточность и асинхронность
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 20:36
Цитата Сообщение от ReYalp Посмотреть сообщение
И что значит выделить буфер асинхронно?)))
Извини, заговорился, наверно имел ввиду - динамически

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
Нет,это не так ,асинхронно данные можно получать в одном потоке,от множества клиентов,Вы путаете многопоточность и асинхронность
Нет, не путаю. В одном потоке - это как раз и есть синхронно.

Добавлено через 1 минуту
Асинхронно - значит одновременно, в одном потоке так не бывает
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 20:42  [ТС]
oleg-m1973, могу пример навести ,у нас есть 1000 сокетов подключенных к серверу и для того чтобы от них принять данные асинхронно мы можем создать 1000 буферов(по 1 для каждого) и вызвать для каждого из сокетов WSARecv() ,в данном случае данные придут сразу в эти буферы и Вам не нужно ждать пока они придут чтобы их вычитать или еще что-то,тоесть вы вызываете WSARecv() и этот метод сразу возвращает управление потоку и пока поток делает что либо данные спокойно придут в буфер,вопрос только в том как узнать что они пришли но это уже совсем другая тема

Добавлено через 2 минуты
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Асинхронно - значит одновременно, в одном потоке так не бывает
нет,тут Вы не совсем правы,асинхронный в программировании значит неблокирующий
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 20:48
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, могу пример навести ,у нас есть 1000 сокетов подключенных к серверу и для того чтобы от них принять данные асинхронно мы можем создать 1000 буферов(по 1 для каждого) и вызвать для каждого из сокетов WSARecv() ,в данном случае данные придут сразу в эти буферы и Вам не нужно ждать пока они придут чтобы их вычитать или еще что-то,тоесть вы вызываете WSARecv() и этот метод сразу возвращает управление потоку и пока поток делает что либо данные спокойно придут в буфер,вопрос только в том как узнать что они пришли но это уже совсем другая тема
Никто никуда сам не придёт. Здесь сценарий примерно такой (ну, для обычных сокетов, прошу прощения)
- Делается select/poll/epoll для 1000 сокетов
- Для 100 сокетов возвращается, что есть данные
- Для каждого из этой сотни запускаем в отдельном потоке чтение данных - recv

Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
нет,тут Вы не совсем правы,асинхронный в программировании значит неблокирующий
Нет, я совсем прав. Асинхронный это код, который выполняется одновременно с другим. Неблокирующий - это зависит от того, что именно он не блокирует.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 20:54  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Никто никуда сам не придёт. Здесь сценарий примерно такой (ну, для обычных сокетов, прошу прощения)
- Делается select/poll/epoll для 1000 сокетов
- Для 100 сокетов возвращается, что есть данные
- Для каждого из этой сотни запускаем в отдельном потоке чтение данных - recv
Это пример синхронного многопоточного сервера

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет, я совсем прав. Асинхронный это код, который выполняется одновременно с другим
А разве неблокирующий код не работает одновременно с основным потоком?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 20:55
Цитата Сообщение от ReYalp Посмотреть сообщение
Это пример синхронного многопоточного сервера
Нет, в точности до наоборот (Откуда ты вообще этого набрался?). Ещё раз повторяю - асинхронный сервер это сервер, который одновременно получает данные, делает recv, от нескольких коннектов.

Добавлено через 51 секунду
Цитата Сообщение от ReYalp Посмотреть сообщение
А разве неблокирующий код не работает одновременно с основным потоком?
Что такое "неблокирующий код"?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 21:01  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Для каждого из этой сотни запускаем в отдельном потоке чтение данных - recv
Вы же понимаете что Вы просто не сможете создать к примеру 100 000 потоков одновременно , данные считваются синхронно (тоесть поток блокируется на время считывания данных),когда в асинхронном режиме поток не блокируется

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет, в точности до наоборот (Откуда ты вообще этого набрался?). Ещё раз повторяю - асинхронный сервер это сервер, который одновременно получает данные, делает recv, от нескольких коннектов.
Возможно в каком-то моменте я начал путаться,но я с самого начал говорил о асинхронном ПОЛУЧЕНИИ данных

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет, в точности до наоборот (Откуда ты вообще этого набрался?). Ещё раз повторяю - асинхронный сервер это сервер, который одновременно получает данные, делает recv, от нескольких коннектов.
получение данных в этом примере осуществляется синхронно в разных потоках
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 21:03
Цитата Сообщение от ReYalp Посмотреть сообщение
Вы же понимаете что Вы просто не сможете создать к примеру 100 000 потоков одновременно , данные считваются синхронно (тоесть поток блокируется на время считывания данных),когда в асинхронном режиме поток не блокируется
Ну ты ж, надеюсь, понимаешь, что чудес не бывает. И то что ты называешь "асинхронным" работает с теми же самыми потоками.
Для новичка, проще сделать один поток на коннект. Да, это плохо, но позволит понять, как всё работает и потом перейти на пул потоков

Добавлено через 44 секунды
Цитата Сообщение от ReYalp Посмотреть сообщение
Возможно в каком-то моменте я начал путаться,но я с самого начал говорил о асинхронном ПОЛУЧЕНИИ данных
Я тебе вроде именно об этом и пишу
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
31.05.2019, 21:03  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что такое "неблокирующий код"?
Грубо говоря это код который сразу возвращает управление вызвавшему потоку ,а сам выполняется асинхронно
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.05.2019, 21:03
Цитата Сообщение от ReYalp Посмотреть сообщение
Нет, в точности до наоборот (Откуда ты вообще этого набрался?). Ещё раз повторяю - асинхронный сервер это сервер, который одновременно получает данные, делает recv, от нескольких коннектов.
получение данных в этом примере осуществляется синхронно в разных потоках
Синхронно с чем?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2019, 21:03

Распределение памяти. Динамическое выделение памяти
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Правильное освобождение памяти
Здрасти. Двумерный динам. массив: int** matr=new int*; for (int i=0; i&lt;rows; ++i) matr=new int; ...

Правильное освобождение памяти
Есть код class Test { public: int **container; int counter = 0; Test(unsigned int size) { container = new int*;

Правильное освобождение памяти при std::vector
vector&lt;Worker*&gt; workers; workers.push_back(new Worker(&quot;Jack&quot;, 1000)) Как теперь правильно освободить память? Как я понял у...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Химера правил, администрации порталов, законы и беззаконие.
Hrethgir 26.06.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11904&stc=1&d=1782459438 У меня сейчас так везде по форуму - не могу создавать сообщений, но запись по случаю этому. . .
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru