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

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

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

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

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

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

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

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

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

EPOLLONESHOT

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

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

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

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

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

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

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

《完》