至于楼上扯的那些内存池等等,楼主不需要担心,使用tmalloc直接hook掉标准库的malloc/free即可,不需要自己实现,你只需要关注设计上的合理性。
ulimit -s可以看到堆栈大小,一般栈上存一些简单的数字,小型字符串数组等吧;查询返回的数据量有可能比较大; 按你说的场景,也只能想到你那种方法了: epoll处理描述符,多线程接收语句、执行、发送结果; 这里好像也就只有查询麻烦一些,需要返回查询结果的数据量较大,这根据情况可以使用内存池,也可以考虑静态内存,同步机制是难免的;
按你说的,我理解是客户端发送类似增删改查的语句到服务器端,服务器端执行操作后将结果返回给客户端; 可以来一个客户端数据,启一个线程,返回数据时使用内存池,加上同步机制。但如果客户端很多、来的很快,线程启的太多会导致各种效率、同步等问题,这种方式就不太好了; 这种情况下可以使用生产者消费者模型,一个生产者:通过epoll将客户端的数据放到内存池中(这里把处理数据看成是一个任务,把任务放入任务队列中,当然得使用同步机制,多线程);多个消费者:启动n个线程,n个线程完成任务队列里的所有任务(一个线程完成一个任务后继续处理下一个任务,直到任务队列为空,这个又可以使用线程池了。。);返回数据这里有点麻烦了,要是数据量不大,直接栈上的内存就可以搞定,要大,那再用一个内存池。。。 呃,说多了,也不知道理解对不。。。。
1 处理接受到的数据,要创建一个线程来做任务的分流吗? 一般高并发的情况用线程池+epoll,看你的客户端并发程度高不高了; 2 还有关于返回数据占用的内存,这个有什么好的建议吗?可能会频繁的开辟,用内存池..... 这个最好使用内存池,可以提高分配和释放的效率,减少内存碎片,减少频繁malloc而提高效率,而且在释放的时候不用像链表那样循环遍历、判断、释放,直接free申请那块内存就行了;
用现成的select或者epoll来处理网络连接的问题。。 关于返回的数据的内存你知道频繁使用那当然是内存池好啊,然后怎么联系起来、你可以用epoll的事件回调来实现、或者通过select吧数据写入到一个队列中去、然后多线程去读这个队列进行操作异步通信
1、你这里涉及到IO的操作,比较耗时,如果不开辟线程去处理的话,后续的业务会阻塞。建议采用线程池,recv完数据后,从线程池中获取空闲线程处理业务。 2、频繁地开辟,释放内存,建议使用内存池,一次开辟,多次使用,并且防止内存碎片。
23,121
社区成员
74,508
社区内容
加载中
试试用AI创作助手写篇文章吧