关于网络通信的疑问

仙境之桥2046 2013-05-07 05:04:47
大家好

我现在正在做一个网络通信的服务端.

客户端发送数据到服务端,服务端通过不同的数据来甄别所需要做的处理数据库的操作,返回处理后的数据库的数据

现在本人很头疼的是:

1 处理接受到的数据,要创建一个线程来做任务的分流吗?

2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池.....

能说下,大概要用到什么样的技术吗,或者给个链接,此类的也好.

先谢谢大家了
...全文
237 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙境之桥2046 2013-05-09
  • 打赏
  • 举报
回复
引用 13 楼 qq120848369 的回复:
至于楼上扯的那些内存池等等,楼主不需要担心,使用tmalloc直接hook掉标准库的malloc/free即可,不需要自己实现,你只需要关注设计上的合理性。
你说的2,3设计模式我还能理解,不过使用tmalloc直接hook掉标准库的malloc/free即可,不需要自己实现不懂了.
仙境之桥2046 2013-05-09
  • 打赏
  • 举报
回复
引用 9 楼 prohibit 的回复:
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大; 按你说的场景,也只能想到你那种方法了: epoll处理描述符,多线程接收语句、执行、发送结果; 这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
有一个问题还要请教下,我在看线程池实现的时候.工作线程想做成动态的,可已根据任务队列的大小动态来实现,工作线程个数的调整,而且想把创建的工作线程在初始化的时候做成睡眠或挂起状态,当任务队列有任务到达时,在对工作线程行唤醒,当任务结束后对该工作线程进行挂起,节省系统资源.不知道这个具体要怎么实现. 能大体说下吗?
qq120848369 2013-05-09
  • 打赏
  • 举报
回复
至于楼上扯的那些内存池等等,楼主不需要担心,使用tmalloc直接hook掉标准库的malloc/free即可,不需要自己实现,你只需要关注设计上的合理性。
qq120848369 2013-05-09
  • 打赏
  • 举报
回复
1,做基于coroutine的插件架构。 2,做half-sync-half-async。 3,做leader-follower。 任何一种都可以解决你的问题,参考EPOLLONESHOT。
仙境之桥2046 2013-05-09
  • 打赏
  • 举报
回复
引用 9 楼 prohibit 的回复:
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大; 按你说的场景,也只能想到你那种方法了: epoll处理描述符,多线程接收语句、执行、发送结果; 这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
我这个在实现多线程的时候同步机制使用的应该是信号量吗?
仙境之桥2046 2013-05-09
  • 打赏
  • 举报
回复
引用 9 楼 prohibit 的回复:
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大; 按你说的场景,也只能想到你那种方法了: epoll处理描述符,多线程接收语句、执行、发送结果; 这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
定下来用这种了,剩下的就是学习和写了
prohibit 2013-05-08
  • 打赏
  • 举报
回复
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大; 按你说的场景,也只能想到你那种方法了: epoll处理描述符,多线程接收语句、执行、发送结果; 这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
仙境之桥2046 2013-05-08
  • 打赏
  • 举报
回复
引用 7 楼 prohibit 的回复:
按你说的,我理解是客户端发送类似增删改查的语句到服务器端,服务器端执行操作后将结果返回给客户端; 可以来一个客户端数据,启一个线程,返回数据时使用内存池,加上同步机制。但如果客户端很多、来的很快,线程启的太多会导致各种效率、同步等问题,这种方式就不太好了; 这种情况下可以使用生产者消费者模型,一个生产者:通过epoll将客户端的数据放到内存池中(这里把处理数据看成是一个任务,把任务放入任务队列中,当然得使用同步机制,多线程);多个消费者:启动n个线程,n个线程完成任务队列里的所有任务(一个线程完成一个任务后继续处理下一个任务,直到任务队列为空,这个又可以使用线程池了。。);返回数据这里有点麻烦了,要是数据量不大,直接栈上的内存就可以搞定,要大,那再用一个内存池。。。 呃,说多了,也不知道理解对不。。。。
我要做的和你说的一样,就是客户端发送类似增删改查的语句到服务器端,服务器端执行操作后将结果返回给客户端; 一直在想,效率和实现的问题,epoll多线程,epoll负责管理描述符,多线程负责处理任务. 返回数据量多少,用栈上的内存比较合适,多少用内存池比较合适呢?
prohibit 2013-05-08
  • 打赏
  • 举报
回复
按你说的,我理解是客户端发送类似增删改查的语句到服务器端,服务器端执行操作后将结果返回给客户端; 可以来一个客户端数据,启一个线程,返回数据时使用内存池,加上同步机制。但如果客户端很多、来的很快,线程启的太多会导致各种效率、同步等问题,这种方式就不太好了; 这种情况下可以使用生产者消费者模型,一个生产者:通过epoll将客户端的数据放到内存池中(这里把处理数据看成是一个任务,把任务放入任务队列中,当然得使用同步机制,多线程);多个消费者:启动n个线程,n个线程完成任务队列里的所有任务(一个线程完成一个任务后继续处理下一个任务,直到任务队列为空,这个又可以使用线程池了。。);返回数据这里有点麻烦了,要是数据量不大,直接栈上的内存就可以搞定,要大,那再用一个内存池。。。 呃,说多了,也不知道理解对不。。。。
仙境之桥2046 2013-05-07
  • 打赏
  • 举报
回复
引用 5 楼 prohibit 的回复:
1 处理接受到的数据,要创建一个线程来做任务的分流吗? 一般高并发的情况用线程池+epoll,看你的客户端并发程度高不高了; 2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池..... 这个最好使用内存池,可以提高分配和释放的效率,减少内存碎片,减少频繁malloc而提高效率,而且在释放的时候不用像链表那样循环遍历、判断、释放,直接free申请那块内存就行了;
是要创建线程来做分流. 有个问题是用线程处理发过来的数据,内存池要怎么引入...
prohibit 2013-05-07
  • 打赏
  • 举报
回复
1 处理接受到的数据,要创建一个线程来做任务的分流吗? 一般高并发的情况用线程池+epoll,看你的客户端并发程度高不高了; 2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池..... 这个最好使用内存池,可以提高分配和释放的效率,减少内存碎片,减少频繁malloc而提高效率,而且在释放的时候不用像链表那样循环遍历、判断、释放,直接free申请那块内存就行了;
仙境之桥2046 2013-05-07
  • 打赏
  • 举报
回复
引用 2 楼 KuaiPengFei_ 的回复:
用现成的select或者epoll来处理网络连接的问题。。 关于返回的数据的内存你知道频繁使用那当然是内存池好啊,然后怎么联系起来、你可以用epoll的事件回调来实现、或者通过select吧数据写入到一个队列中去、然后多线程去读这个队列进行操作异步通信
确实是用到了epoll来处理的网络连接问题. 我使用C++包起来的. 而且也用到了回调实现通信,现在是需要将数据处理后(与数据库交互)发送给客户端.本身还没有引入多线程,看了一楼的觉得确实是在数据库交互式如果不引入多线程会阻塞到处理处. 现在问题是引入多线程,还有就是多线程在一个进程内的数量是有限制的啊. 和头疼啊
仙境之桥2046 2013-05-07
  • 打赏
  • 举报
回复
引用 1 楼 icechenbing 的回复:
1、你这里涉及到IO的操作,比较耗时,如果不开辟线程去处理的话,后续的业务会阻塞。建议采用线程池,recv完数据后,从线程池中获取空闲线程处理业务。 2、频繁地开辟,释放内存,建议使用内存池,一次开辟,多次使用,并且防止内存碎片。
你好. 我现在正用的是二楼所说的epoll回调来实现接收和发送,而且我注册的事件是根据发送和接收区别的. 如果按你所说的,就是说在发送的时候用到线程池,通过线程去处理后续的操作.包括对epoll事件的管理,还有数据的发送,对么? 我是在一个类内实现的,所以在处理的时候,确实是需要多线程,才能确保程序跑下去. 还要顺带着在问下,关于epoll和多线程并发服务器的优劣.这个始终搞不大明白.
Joseph_ 2013-05-07
  • 打赏
  • 举报
回复
用现成的select或者epoll来处理网络连接的问题。。 关于返回的数据的内存你知道频繁使用那当然是内存池好啊,然后怎么联系起来、你可以用epoll的事件回调来实现、或者通过select吧数据写入到一个队列中去、然后多线程去读这个队列进行操作异步通信
恨天低 2013-05-07
  • 打赏
  • 举报
回复
1、你这里涉及到IO的操作,比较耗时,如果不开辟线程去处理的话,后续的业务会阻塞。建议采用线程池,recv完数据后,从线程池中获取空闲线程处理业务。 2、频繁地开辟,释放内存,建议使用内存池,一次开辟,多次使用,并且防止内存碎片。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧