为什么需要内存池?
对于服务器,如果不断有客户端连接,并且客户端不断发送消息,对于每个连接的每个消息,服务器都需要去malloc/free内存。如果服务器需要7*24运行,时间久了,就会产生很多内存碎片,没有整块,最后就有可能malloc比较大的内存的时候失败。最后进程就会coredump。
这种问题,出现了很难解,因为程序要运行很长时间才会出现。解决方案就是使用内存池。
频繁的malloc/free, 会造成哪些问题?
1.不利于内存管理
2.内存碎片
3.出现内存泄漏,不容易查出具体位置。
典型的场景,服务器处理网络io。message较大的时候,recv、parse后,需要push到另一个thread进行处理。使用栈内存不合适,需要申请堆内存。recv的时候申请buffer,send后,释放buffer。每来一个消息,都需要申请、释放内存。操作系统在进行malloc内存的时候之后找一块符合要求的内存给你,并不会考虑到内存碎片这些问题,所以如果反复多次进行malloc的动作难免产生内存碎片,所以有了内存池。内存池可以看作是一个避免内存碎片的方法,人们为了避免内存碎片而想出来的一种办法。
为什么需要线程池?
线程池主要解决两个问题:线程创建与销毁的开销以及线程竞争造成的性能瓶颈。通过预先创建一组线程并复用它们,线程池有效地降低了线程创建和销毁的时间和资源消耗。同时,通过管理线程并发数量,线程池有助于减少线程之间的竞争,增加资源利用率,并提高程序运行的性能。