Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игровой сервер. Linux. Помогите реализовать. 
:(
    Опции темы
MAKCim
Дата 6.10.2009, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(niXman @  6.10.2009,  14:33 Найти цитируемый пост)
Я правильно делаю?

нет ;)
linux/list.h - это часть ядра со всеми вытекающими

вот адаптированная для userspace имплементация


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  list.rar 2,87 Kb


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
niXman
Дата 7.10.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



MAKCim, Скажите, можно ли как-то определить кол-во процессоров/ядер?

Я думаю что нужно определить их кол-во ядер, и создать кол-во потоков обслуживающих клиентские подключения, столько же.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
MAKCim
Дата 7.10.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

sysconf(_SC_NPROCESSORS_ONLN);

но это не сецифицировано в posix


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
sdukshis
Дата 18.10.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Могу высказать свое скромное мнение по этому поводу.

Возможно подойдет архитектура nginx.
1 главный процесс и несколько рабочих процессов (или потоков).

Главный процесс принимает новое соединение и передают его одному из рабочих (в случае использования потоков это логично делать через глобальные структуры данных, например списки списков, при использовании дочерних процессов скорее подойдет дублирование дескрипторов и именованные каналы).

Каждый из рабочих процессов работает с несколькими клиентами. В этом случае наиболее удачным по производительности решением будет использование мультиплексирования на основе poll или pselect (если разработка ведется под конкретных платформу, то лучше применять специализированные методы Linux - epoll, FreeBSD - kqueue).

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

PM MAIL   Вверх
MAKCim
Дата 18.10.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



тогда уж лучше юзать libevent и забыть о select/poll/epoll/kqueue/... ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
niXman
Дата 19.10.2009, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



Дык..
Я пишу, используя epoll, а выясняется что лучше libevent. Так что мне использовать?
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
MAKCim
Дата 19.10.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



niXman
libevent кроссплатформенная библиотека
если нужна кроссплатформенность, лучше использовать ее, т. к. select и poll не столь эффективны
это не более чем комментарий к посту sdukshis


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
niXman
Дата 19.10.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



MAKCim, Да, я уже посмотрел. Это просто обертка над API функциями.
Продолжаю кодить...

Добавлено через 2 минуты и 38 секунд
Да, кстати. Провел эксперимент по распределению потоков на ядра. Все правильно, если создать 4 потока, то ОС правильно распределит, по одному на ядро.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
alx49
Дата 20.10.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.10.2009

Репутация: нет
Всего: нет



А есть ли резон писать свою сетевую часть? Советую обратить взор на boost::asio (и на boost::thread к слову о потоках и количестве ядер, там есть специальня функция, говорящая сколько потоков можно эффективно заюзать)

В доках boost'а есть хороший мануал, что с этой библиотекой делать, и как это делать эффективно.
PM MAIL   Вверх
niXman
Дата 20.10.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



Цитата(alx49 @  20.10.2009,  16:00 Найти цитируемый пост)
А есть ли резон писать свою сетевую часть?

Я не пишу подсистему ввода-вывода. Прочитайте второй пост.
Цитата(alx49 @  20.10.2009,  16:00 Найти цитируемый пост)
Советую обратить взор на boost::asio

Не хочу использовать по некоторым причинам.
Цитата(alx49 @  20.10.2009,  16:00 Найти цитируемый пост)
boost::thread к слову о потоках и количестве ядер, там есть специальня функция, говорящая сколько потоков можно эффективно заюзать

Можно по подробнее? Интересно взглянуть на реализацию.

Это сообщение отредактировал(а) niXman - 20.10.2009, 19:05
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
nerezus
Дата 20.10.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

1. количество потоков в ОС ограниченно. Наверное будет правильней, чтоб одни поток обслуживал не одного клиента. В этом случае меньше расходов на синхронизацию.
 Сомневаюсь, что у него будет количество пользователей ) В разы меньше будет.
Тем более что если пользователем будет запрошено ресурсоемкое действие, это заморозит всех пользователей на этом же потоке.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MAKCim
Дата 20.10.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(nerezus @  20.10.2009,  19:08 Найти цитируемый пост)
Тем более что если пользователем будет запрошено ресурсоемкое действие, это заморозит всех пользователей на этом же потоке. 

это смотря какие руки и голова ;)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nerezus
Дата 20.10.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



MAKCim, и как можно этого избежать?


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
niXman
Дата 20.10.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



Цитата(nerezus @  20.10.2009,  19:02 Найти цитируемый пост)
MAKCim, и как можно этого избежать? 

Присоединяюсь.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
MAKCim
Дата 20.10.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



niXman, 
nerezus, 
есть такая штука как неблокируемый режим работы
любой запрос любого ресурса можно разбить на ряд мелких, для выполнения которых не нужно блокировать процесс/поток
ожидание ответа реализуется посредством опроса через определенные интервалы времени
если ресурс не удаленный, то используя асинхронный обработчик, передаваемый вместе с запросом, мы можем изменить состояние дескриптора без опроса
естественно, такое решение более сложое, чем тупо создание потоков в неограниченном количестве


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.