Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Добрый день. Стала задача написать сервер на плюсах (под линукс). Признаться, данный язык только начал осваивать, поэтому могу показаться совсем уж нубом (за что прошу больно не пинать :) ). Итак, задача: 1. Реализация потокового (pre-thread) сервера на С++ под Linux (GNU) 2. В данном случае не оговариваются действия сервера (его логика - это сам осилю), а только грамотное построение модели (принял - передал) 3. Подчеркиваю - код для Linux Начал с того, что гуглил много. В итоге нашел некий "пример" (код ниже), который взял за основу, которую в последствии буду "допиливать". Итак, код был взят отсюда: http://www.unix.com/programming/17611-multi-threaded-server-pthreads-sleep.html Дублирую код в топик: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. Сам автор этого кода, в своем посте пишет: "I am trying to writa a multi-client & multi-threaded TCP server. There is a thread pool. Each thread in the pool will handle requests of multiple clients. But here I have a problem. I find a solution but it is not how it must be... i think. When threads working without sleep(1) I can't get response from server but when I put sleep(1) in thread function as you will see in code, everything works fine and server can make echo nearly for 40000 clients between 1 or 2 seconds. What am I doing wrong here? " И это действительно так. С одной оговоркой, что если заккоментировать sleep(1), то это сервер работает именно так, как нужно, НО вводит систему в ступор (загрузка ЦП 100%, что очевидно, т.к. while(1) ) С другой стороны, из-за этого sleep(1), во-первых, ответ сервера возвращается только через секунду, во-вторых, если передать серверу несколько пакетов (передать быстро), то он "склеит" это пакеты в один, как следствие, пакеты невозможно будет разобрать. Пожалуйста, подскажите: 1. Если приведенный пример (код, взятый за основу) корректный - как можно избежать sleep (1)? 2. Если код в своей основе неверный (или морально устарел, т.к. пост датируется аж 2005 годом) - помогите собрать этот покотовый сервер (хоть пример реально работающего) 3. Обязательно ли объявлять сокет неблокируемым (как в приведенном примере)? Спасибо огромное! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2013, 23:02 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
kiruhin, Посмотрите в сторону, напримре, libev ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2013, 23:08 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
kiruhin, Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Используйте функцию select() для выбора сокетов по которым прибыли данные. Это если просто шоб работало хоть как-то. А если правильно делать, с нормальной производительностью при большом числе клиентов, то выше посоветовали библиотеку которая реализует все как надо. Там доках наверняка готовые примеры есть. Таких библиотек несколько. ЗЫ. А вообще, это конечно никакой не С++, а голый С. Для С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 02:12 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЗЫ. А вообще, это конечно никакой не С++, а голый С. Для С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков. А он как по производительности относительно libev/libevent, не уступает им? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 02:16 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
относительно libev libeventДля С++ есть библиотека Boost.Asio где все что надо есть, включая пул потоков. А он как по производительности относительно libev/libevent, не уступает им? Архитектурно - не уступает. А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 02:27 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyотносительно libev libeventпропущено... А он как по производительности относительно libev/libevent, не уступает им? Архитектурно - не уступает. А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи Вот тут " Неблокируемые и асинхронные приложения " утверждают, что в libevent используются "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows", а для libev "в ОС Windows используется вызов select" и это якобы медленнее, чем IOCP. Правда ли это архитектурно и что используется в ASIO: IOCP или select? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 02:34 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
относительно libev libeventAnatoly Moskovskyпропущено... Архитектурно - не уступает. А абсолютную скорость не мерял. Но думаю что такая же, т.к. и то и то - легковесные обертки непосредственно над АПИ ОСи Вот тут " Неблокируемые и асинхронные приложения " утверждают, что в libevent используются "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows", а для libev "в ОС Windows используется вызов select" и это якобы медленнее, чем IOCP. Правда ли это архитектурно и что используется в ASIO: IOCP или select? Несколько лет назад я работал с libevent - под виндой оно умело только select. Как счас - не знаю, видимо уже сделали, раз говорят об этом :) Boost.Asio с давних пор (возможно изначально) использует "epoll на ОС Linux, kqueue на FreeBSD и порты завершения (IOCP) на Windows". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 03:16 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Так вот, чтобы не наркоманствовать с тем, что делает ТС, и придумали nginx, uWSGI и прочие радости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 09:00 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
NekZТак вот, чтобы не наркоманствовать с тем, что делает ТС, и придумали nginx, uWSGI и прочие радости. ну предположим - диплом. Чего сразу - наркоманствовать? Учиться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 09:22 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskykiruhin, Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Используйте функцию select() для выбора сокетов по которым прибыли данные. Это если просто шоб работало хоть как-то. +getsockopt у него есть параметры , которые возвращают обьем принятого в сетевой стек буфера, которые можно считать если там что то есть или не читать если нет. Что касается kiruhinесли передать серверу несколько пакетов (передать быстро), то он "склеит" это пакеты в один, как следствие, пакеты невозможно будет разобрать. То на уровне сокета, пытаться поделить безидейно, протокол более высокого уровня должен иметь соотвествующие хедеры и (или) трейлеры, якоря для позиционированя парсера в потоке . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 11:03 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Если говорить про select() , он должен быть один на все сокеты программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 11:10 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Такой сервер должен просто висеть на select или poll/epoll и ждать ввода-вывода (сетевого), который будет инициирован клиентом. Как только он возбуждается -- отдавать сокет на обработку рабочему потоку, который должен сделать всё, что нужно, отправить всё клиенту, возможно, и обратно отдать сокет на прослушку select-у или poll/epoll-у. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 11:57 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Ну вот у вас бесконечный цикл, в котором при отсутствии данных от клиентов процессор занят на 100%, но ничего полезного не делает. Я тут хочу сделать одно замечание. Конечно, busy wait не великолепная штука, конечно, это не очень хорошо. А тут не подходит вообще. Но вот почему-то все считают его абсолютным неоспариваемым смертным грехом в программировании. А это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен. Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 12:03 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
MasterZivА это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен. Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе. Это вопрос дизайна архитектуры . Нить всеравно когда то отдаст свой контекст выполнения, количество тактов которые делает нить между синхронизирующими событиями должен приблизительно ( хотя бы до порядка) соотвествовать длине контекста выполнения в планировщие, Я хочу сказать о том, что если управление передается нити , то у нее должно быть достаточно работы, что бы не греть процессоры спинлоком. Если появилась необходимость в спинлоках , нужно (желательно ) об этом горомко заявить в консерватории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 12:45 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаРMasterZivА это совсем не так. Существуют случаи, когда он может быть использован и даже может быть полезен. Например, как вспомогательный механизм ожидания наряду с событиями, семафорами и пр, или для того, чтобы не отдавать лишний раз управление другим, если известно, что оно скоро понадобится тебе. Это вопрос дизайна архитектуры . Нить всеравно когда то отдаст свой контекст выполнения, количество тактов которые делает нить между синхронизирующими событиями должен приблизительно ( хотя бы до порядка) соотвествовать длине контекста выполнения в планировщие, Я хочу сказать о том, что если управление передается нити , то у нее должно быть достаточно работы, что бы не греть процессоры спинлоком. Если появилась необходимость в спинлоках , нужно (желательно ) об этом горомко заявить в консерватории. Есть два варианта: 1. Необходима моментальная реакция на события и некогда ждать пока для нити появиться "достаточно работы". Например брокерская система, где, очевидно, выгодная сделка будет у того, чей сервер первым её вычислит и кинет заявку. 2. Необходима максимальная общая производительность и тут мы действительно можем отдавать контекст в отсутствии задач. Мало того, нить может почти никогда и не отдавать контекст, будучи привязанной к одному из 32 ядер сервера, на котором помимо ОС только одна эта система и работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 12:56 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаРЕсли говорить про select() , он должен быть один на все сокеты программе. Даже если их больше, чем в него влазит?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:05 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
моментальная реакцияЕсть два варианта: 1. Необходима моментальная реакция на события и некогда ждать пока для нити появиться "достаточно работы". Например брокерская система, где, очевидно, выгодная сделка будет у того, чей сервер первым её вычислит и кинет заявку. Для таких случаев рисуется невытесняющая пользовательская многозадачность нутри одной нити ( процесса), на количестве нитей равном количеству процессоров ( ядер) - 1( для ядра ОС). Нити ОС всервно чью брокерскую транзакцию она выполняет. моментальная реакцияМало того, нить может почти никогда и не отдавать контекст, будучи привязанной к одному из 32 ядер сервера, на котором помимо ОС только одна эта система и работает. Да, для того что бы нить никогда не отдавала контексты, из схемы выше , процессор афинити жестко прикручивают шуруповертом к нити ( процессу). А ввод вывод делается полность асинхронным, что бы не спать , когда есть работа для нити, пусть ДМА работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:14 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Работа, которая описана выше , интересная , но сейчас такой нет, быдлокод кругом. Грамотная архитектура никому не интересна , за нее не платят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:17 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДохтаРЕсли говорить про select() , он должен быть один на все сокеты программе. Даже если их больше, чем в него влазит?.. Насколько я помню в него помещается 65535 сокетов. В хайлодае уже на 1024-х на производительности сказывается его псевдоасинхронность. Дальше дорога в АИО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:26 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаРНасколько я помню в него помещается 65535 сокетов. Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:34 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДохтаРНасколько я помню в него помещается 65535 сокетов. Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен". Я сказал помещается ( можно впихнуть), реально если важен перфоманс то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора). Можно нарисовать велосипед на тему select на SIGIO. В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) . Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 13:46 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаРРабота, которая описана выше , интересная , но сейчас такой нет, быдлокод кругом. Грамотная архитектура никому не интересна , за нее не платят. Да ладно, сейчас есть задачи и поинтересней. Не пользовательская многозадачность, а хардварная, на GPU с 40000 виртуальных ядер на один чип, и 80000 - 320000 на сервер. И DMA обмен с периферией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 14:06 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
Лично я бы выбрал Qt фрейморк 4.8. Постороение на нём кроссплатформенного "полноприводного", параллельно-многопоточного(QtConcurent) http сервера есть видеоурок на тытрубке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 15:36 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
ДохтаРDimitry Sibiryakovпропущено... Под линуксами гораздо, гораздо меньше. Но даже при этом меньшем количестве непропорционально много ЦПУ начинает жрать выяснение "какой же бит установлен". Я сказал помещается ( можно впихнуть), реально если важен перфоманс то больше чем 1024 смысла туда запихивать нет, в том числе по причинам вами озвученым( поиск дискриптора). Можно нарисовать велосипед на тему select на SIGIO. В свои времена приходилось рисовать заглушку , что бы долавливать SIGIO прорывающиеся сквозь селект на хайлоаде( не помню , толи на СКО то ли на 2.2 линуксовых ядрах ) . Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов. Текущая имплементация aio для сокетов не является асинхронной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 16:23 |
|
||
|
Потоковый сервер на С++
|
|||
|---|---|---|---|
|
#18+
WesttrdДохтаР Правильная хайлоад архитектура должна быть построена на АИО, не зависимо от количества сокетов. Текущая имплементация aio для сокетов не является асинхронной http://www.ibm.com/developerworks/linux/library/l-async/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2013, 17:18 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=75&tid=2020113]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 32ms |
| total: | 186ms |

| 0 / 0 |
