Вернуться   CoderX :: Forums > Основные форумы > Курилка
Войти через OpenID

Курилка Флудим и шутим тут!

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 02.04.2017, 11:42   #1
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Цитата:
Сообщение от ScythLab Посмотреть сообщение
ты хочешь сказать, что если у меня одноядерный проц, то я не смогу запустить на нем, скажем, 100 потоков?
сможешь, но зачем?) если внутри потока не используется блокирующих функций кроме ожидания когда все возможные на данный момент действия завершены, то поток будет максимально эффективно использовать ядро, конечно если так сделать не получится то можно и 100 и 1000 потоков сделать, но если прикинуть то на 10000 ботов вряд ли понадобится даже 1000 потоков, потому что это получается по 10 ботов на поток, что за неоптимальное использование там будет происходить?) вообще даже при неоптимальном коде можно использовать формулу типа {количество_ядер * коэффициент_неоптимальности} и запускать скажем по 10 потоков на ядро, чтобы система разобралась кто простаивает, а кто нет. в итоге 40 потоков и в них можно впихнуть теже 10000 ботов по 250 ботов на поток, а дальше уже дело оптимизации, сможешь ли ты написать тело обработки одного бота чтобы 250 ботов успевали обработаться за уделенное им время. но и да, если код оптимален то производить потоки более чем на 90% загружающих ядро в количестве большем, чем имеется ядер, нет смысла, потому как это только ухудшит производительность, плюс кстати у потоков же ещё стек выделяется + куча внутренних поточных штук, так что каждый поток это ещё блок памяти. в общем лучше писать оптимальный код, создавать минимум потоков, создавать один общий буфер для одного потока и отдавать одному потоку как можно больше ботов на обработку. но в реальности как получится так и будет

Цитата:
Сообщение от alexov Посмотреть сообщение
Но как только мы заведем общий буфер для группы клиентов, сразу появляются ограничения на то как мы должны писать код, чтобы этот буфер не запороть
идея в следующем (далее псевдокод):
Код:
переменные на каждый поток:
  общий_сетевой_буфер = массив байт равный максимальному размеру пакета (65535 в нашем случае)
  боты = список ботов для обработки

тело_потока:

для каждого бота в ботах потока делаем:
{
  бот.установить_буфер(общий_сетевой_буфер);
  // в этом моменте бот использует общий буфер потока
  // для приема и отправки данных
  бот.получить_сетевые_данные_используя_буфер();
  бот.послать_данные_используя_буфер();
  бот.аннулировать_буфер();
  // в этом моменте у бота больше нет буфера
  // в следующей итерации общий буфер перейдет к следующему боту
}
при такой архитектуре единственное что нужно держать в памяти экземпляра бота это переменные необходимые для воссоздания пакетов при записи их в буфер для отправки и буферизацию фрагментированных пакетов при приеме фрагметированных данных, но буфер для фрагментов можно сделать равным максимально возможной длине элемента пакета (скажем максимальная длина строки - 64 символа) в итоге буфер для фрагментов пакета - (64 * 2 + 2) байт

в общем что-то такое можно придумать)
__________________
Начало.

Последний раз редактировалось supernewbie, 02.04.2017 в 12:18.
supernewbie вне форума   Ответить с цитированием
Старый 02.04.2017, 19:54   #2
Местный
 
Аватар для ScythLab
 
Регистрация: 24.10.2014
Сообщений: 190
Сказал Спасибо: 4
Имеет 42 спасибок в 40 сообщенях
ScythLab пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
сможешь, но зачем?)
ты путаешь программирование для каких-нибудь расчетов, там где тебе нужно максимально эффективно использовать ресурсы компа и обычные программы, которые, как правило, проектируются с точки зрения удобства разработки, поддержки, и чтобы у пользователя интерфейс по минимуму тормозил, тогда как в фоне идет работа с сетью, диском и прочими данными. Как раз ла2 является представителем второй категории, да и боту никогда не нужно столько расчетов, чтобы задумываться об эффективности использования каждого ядра и ручного распределения своих потоков между ядрами (у меня бот использует менее 1% от моего проца, и может его подгружать только при прорисовке карты, т.к. этот участок крайне не оптимален и медленный)
__________________
Хобби: разработка бота для Lineage.
ScythLab вне форума   Ответить с цитированием
Старый 03.04.2017, 06:09   #3
Местный
 
Регистрация: 22.10.2014
Сообщений: 122
Сказал Спасибо: 1
Имеет 8 спасибок в 7 сообщенях
alexov пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
идея в следующем (далее псевдокод):
Код:
переменные на каждый поток:
  общий_сетевой_буфер = массив байт равный максимальному размеру пакета (65535 в нашем случае)
  боты = список ботов для обработки

тело_потока:

для каждого бота в ботах потока делаем:
{
  бот.установить_буфер(общий_сетевой_буфер);
  // в этом моменте бот использует общий буфер потока
  // для приема и отправки данных
  бот.получить_сетевые_данные_используя_буфер();
  бот.послать_данные_используя_буфер();
  бот.аннулировать_буфер();
  // в этом моменте у бота больше нет буфера
  // в следующей итерации общий буфер перейдет к следующему боту
}
Повторюсь, экономить потоки это хорошая идея. Но делать это надо не так. В том что ты предлагаешь следующие проблемы:
1) ручная балансировка ботов между потоками
2) прием данных бывает либо блокирующий, что в твоем случае не подходит. либо асинхронный. что в твоем случае не подходит. либо активное ожидание - привет дополнительные задержки и излишний расход процессорного времени.

И снова мы приходим к тому что код должен быть полностью асинхронный. А в асинхронном коде ограничение на неразрывность обработки одного пакета является злом. Вот захочу я посреди обработки пакета отправить пакет другому клиенту, в этот момент я должен отпустить поток исполняющий мой код, и прощайте буфера.
alexov вне форума   Ответить с цитированием
Старый 04.04.2017, 01:45   #4
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

Цитата:
Сообщение от alexov Посмотреть сообщение
код должен быть полностью асинхронный.
Тоесть получить доп задержки ожидания месаджей от винды?
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
Yegor вне форума   Ответить с цитированием
Старый 04.04.2017, 02:57   #5
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Yegor, если не вызывать WaitMessage то мессаджей ждать не придется, если ты об этом

Оффтоп
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 05.04.2017, 01:27   #6
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
Yegor, если не вызывать WaitMessage то мессаджей ждать не придется, если ты об этом
Каким образом в асинхронном режиме ваш процесс узнает что пришла очередная порция данных в буфер, новое подключение и т.п.?
Вашему коду ждать не прийдется но месаг будет пойман и обработан в главном потоке ожидания месаджей, а это все задержки.
__________________
Продажа чистых аккаунтов 4G, L2 EU, AARu, AA EU, Aion EU, Tera RU, Tera EU (ICQ 594297609)
Продажа VK авторег аккаунтов (ICQ 594297609)
Yegor вне форума   Ответить с цитированием
Старый 05.04.2017, 01:52   #7
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Yegor, хехе, я об этом подозревал, но не хотел вслух говорить.

но насколько долгие эти задержки? по хорошему надо затестить этот момент и сравнить с WSAPoll и с реализацией на блокирующих функциях (1 сокет = 2 потока). может быть это уже кем-нибудь было сделано?
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 05.04.2017, 07:55   #8
Местный
 
Регистрация: 22.10.2014
Сообщений: 122
Сказал Спасибо: 1
Имеет 8 спасибок в 7 сообщенях
alexov пока неопределено
По умолчанию

Цитата:
Сообщение от Yegor Посмотреть сообщение
Каким образом в асинхронном режиме ваш процесс узнает что пришла очередная порция данных в буфер, новое подключение и т.п.?
Вашему коду ждать не прийдется но месаг будет пойман и обработан в главном потоке ожидания месаджей, а это все задержки.
Скажу честно я не вникал как это работает в ядре Windows, я пишу на C#, внимательно изучил документацию и провел свои тесты.

Пусть это немного наивно, но вот что я сделал:
1) взял в аренду VDS, пропинговал его, получил пинг 59мс (да я знаю что пинг идет по ICMP)
2) написал свой сервер и свой клиент, подключился и дал 50mbps нагрузку по траффику через много копий клиента, сделал замеры времени ответа средствами языка, у меня снова получилось 59мс. 0% загрузка процессора, и ровно 4 потока в серверном приложении.

может быть задержки о которых вы говорите измеряются в наносекундах?) какая тогда разница
alexov вне форума   Ответить с цитированием
Старый 04.04.2017, 06:41   #9
Местный
 
Регистрация: 22.10.2014
Сообщений: 122
Сказал Спасибо: 1
Имеет 8 спасибок в 7 сообщенях
alexov пока неопределено
По умолчанию

Цитата:
Сообщение от Yegor Посмотреть сообщение
Тоесть получить доп задержки ожидания месаджей от винды?
О каких задержках идет речь? можно пруф?
лично у меня никаких задержек нет
alexov вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Курилка



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 07:32.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!