网关服务器之内存管理

之前,对网关服务器的内存并没有做特殊处理,是即时的申请和释放。其实真是罪过,开发服务器居然不考虑内存的管理,也是公司太过信任俺了,居然让俺这个刚毕业,没有任何vc,网络编程,服务器编程经验的的毛头小子独自一人开发一个网关服务器,真是......扯远了啊~

后来觉得这样的开销过大,也是为了避免内存溢出的问题,开始管理内存。不过俺用的是初级方法,哪位大虾有更好的方法可以指点一下~~

一方面,我大量的取消struct的使用,改为类。仅仅保留一些必须的struct,如完成key和io句柄。因为类包含析构函数,有生存周期,其资源方面的释放较容易控制。虽然在C++中struct就是类,但自己仍然延续了c中的用法,使用malloc分配资源。

另一方面,系统内存主要在socket频繁登陆注销时生成和注销完成key和io句柄。为此建立一个内存池队列,将用过的内存并不释放,而是存放到内存队列中,需要内存时从队列中取即可。

不过使用时产生过一个异常的问题,折磨了好久。在之前没有内存管理的时候,对一个socket一次投递了n个io请求。这样是没有问题的。但是在有内存管理队列情况下,当该socket退出断开时,其io句柄和完成key都会进入队列。而断开事件发生时,该socket的n个io请求都立即返回,导致完成key(它是在socket与完成端口关联时产生的,只有一个)多次进入队列。当从队列取key时,会导致多个socket共用一个key,而产生无法预测的错误。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值