高性能服务器为什么需要内存池,池的概念和EPOLLONESHOT事件(读Linux高性能服务器)...

池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,者称为静态资源分配。

当服务器进入正式运行阶段,即开始处理客户请求的时候,如果需要相关资源,就可以直接从池中获取,无需动态分配

池就是服务器管理系统资源的应用层设施,它避免了服务器对内核的频繁访问

池:进程池、线程池、内存池、连接池

进程池是由服务器预先创建的一组子进程,进程池中的线程数量应该和CPU数量差不多

进程池中的所有子进程都运行着相同的代码,并具有相同的属性(优先级等)

进程池在服务器启动之初就创建好了,所以每个子进程都相对“干净”,即它们没有打开不必要的文件描述符(从父进程继承而来)

当有新的任务到来时,主进程通过某种方式选择一个已经存在的子进程(通过某种算法选择或者通过一个共享的工作队列来同步),

选择好子进程后,主进程还需要告诉目标子进程有新任务需要处理,并传递必要数据(管道)

EPOLLONESHOT

EPOLL的EPOLLONESHOT事件,使一个socket连接任何时刻都只被一个线程所处理

对于注册了EPOLLONESHOT事件的socket,操作系统最多触发其上注册的一个可读、可写、或者异常事件,且只触发一次,

这样,当一个线程在处理某个socket时,其他线程是不可能有机会操作该socket的,但反过来,注册了EPOLLONESHOT事件

的socket一旦被某个线程处理完毕,该线程就应该立即重置这个socket上的EPOLLONESHOT事件,以确保这个socket下一次可读,

其EPOLLIN事件能被触发,其他工作线程有机会继续处理这个socket

由此看来,尽管一个socket在不同时刻可能被不同的线程处理,但同一时刻肯定只有一个线程再为它服务,这就保证了连接的完整性,

从而避免了很多可能的竞态条件

《完》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值