最近在作学习epoll,也看了很多的资料,关于epoll的原理就不多说了,很简单,需要注意的是,如果仅仅的采用epoll来处理网络服务器的话,感觉性能不会提高太大,毕竟io的处理相对于epoll或者poll的检测来说,时间消耗是比较多的。这个话说得可能比较的绕口,简单说就是你每次的epoll_wait所花费的时间,相对于你得到事件后所作的read,write==花费的时间要少狠多,至少我感觉是这样子的。所以如果真的需要提升性能的话,就需要epoll+线程池,但是问题就是,这个线程池怎么做呢?很多朋友的线程池是可以自我调整的,当没有了就自动地分配。我的看法是这样子没有什么必要吧(自己对linux系统本身没有什么深的理解)。感觉仿照iocp就不错了,当然,仿照是不可能的,iocp实现很复杂的。我们模仿他的流程和机制,适当的损失些性能(只要就是事件通知机制)还是可以接受的。另外一个最大的问题就是我们还是要让操作系统来帮助我们在底层来排队,而不是自己在上层来实现排队,主要是因为处理肯定没有epol_wait产生的速度快,这样子会造成中间的缓冲队列一直增大的。所以还是留给操作系统来帮助我们排队吧。至少目前我的cobra_linux就是这样子实现的。
等有机会展示一下我的cobra_linux吧,虽然它现在还不是很完美。
#ifndef _LC_COBRA_EPOLLER_H
#define _LC_COBRA_EPOLLER_H
/*
* Copyright(c)2008
*
* 文件名称: Epoller
* 文件标识:
* 摘 要: Epoller是我自己封装的epoll,仿照
Windows平台的IOCP(完成端口)来实现类似
的一套高性能的网络底层io策略。
Epoller实现的原理是:
但个线程来循环我们的epoll来等待底层的网络事件
当有事件的时候,我们就把这些事件对应的数据放入
到我们的上层Epoller缓冲队列中,并且发出信号,通知
阻塞在这个上面的线程可以取数据去处理。
*
* 当前版本: cobra 1.05
* 作 者: 关中刀客
* E-Mail : guanzhongdaoke@gmail.com
* Blog : http://guan-zhong-dao-ke.blog.163.com/
* 完成时间: 2008年04月28日
*/
#include "../common/Header.h"
#include <sys/epoll.h>
#include <sys/socket.h>
#include <pthread.h>
#include <semaphore.h>
class EpollerEvent;
class Epoller
{
public:
/*
需要监听的套接字Epoller消息
*/
enum EPOLLERMESSAGE
{
EPOLLERREAD,
EPOLLERWRITE
};
private:
int m_epoller; // epoller句柄
pthread_mutex_t m_lock; // 中间队列的锁
pthread_cond_t m_cond; // 条件变量锁
sem_t m_sem; // 主轮循等待线程处理的信号量
Queue<EpollerEvent, EmptyLock> m_queue; // 中间的数据结构缓冲队列
public:
Epoller();
~Epoller();
public:
/*
初始化epoller
queuesize : 初始化的时候我们的缓冲队列默认的大小
number : 处理的数目
*/
bool init_epoller(size_t queuesize, size_t number);
/*
向epoller注册套接字需要监听事件
sock : 指定的套接字
iMsg : 注册到Epoller上的消息
pEvent : 指定的事件数据体
*/
bool register_epoller_socket_event(SOCKET sock, int iMsg, EpollerEvent* pEvent);
/*
改变Epoller中套接字监听的事件
sock : 指定的套接字
iMsg : 注册到Epoller上的消息
pEvent : 指定的事件数据体
*/
bool change_epoller_socket_event(SOCKET sock, int iMsg, EpollerEvent* pEvent);
/*
删除Epoller中套接字的所有事件
*/
void delete_epoller_socket_event(SOCKET sock, int iMsg);
/*
向Epoller发送指定的事件
pEvent : 指定的事件结构体
通常情况下,我们使用这个函数控制各Epoller线程的退出
类似于windows下的PostQueuedCompletionStatus
*/
void post_event_to_epoller(EpollerEvent* pEvent);
/*
得到Epoller中的事件结构体数据
pEvent : 表示得到的数据体
一般情况下,这个函数由各Epoller线程函数调用,然后回得到指定的事件,
然后根据事件的信息去处理
类似于windows下的GetQueuedCompletionStatus
*/
bool get_event_from_epoller(EpollerEvent* pEvent, size_t timeout);
/*
单独线程来循环Epoller主循环,检测套接字的事件
timeout : 超时的时间
*/
int listen_epoller_event(int timeout);
/*
销毁epoller
*/
void destroy_epoller();
};
extern Epoller g_Epoller;
#endif
分享到:
相关推荐
一个非常好的epoll+线程池服务器Demo
内容摘要:使用“epoll+线程池”技术,通过makefile管理的简单项目——“服务器与客户端完成通信并处理小型业务” 技术涉及:网络初始化、epoll模型、线程池、线程同步、互斥锁 适用人群:在校大学生,并对网络通信...
C语言+epoll+线程池实现的聊天室.zip
这是一个简单的web服务器利用Linux下的线程池技术和Epoll机制 简单粗略有不足的欢迎指导
linux下服务器的搭建,socket+epoll模型+线程池+心跳检测+工厂模式;内含客户端的测试
Linux + C + Epoll实现高并发服务器,运用线程池技术。
服务器端,使用epoll加线程池实现并发服务器,接收客户端指令。客户端使用TCP连接到服务器,实现查询单词及历史记录的功能。服务器端查询单词使用标准IO读取词典文件实现。
最近做工程用到了这些知识,因此总结一些这方面的资料,我认为还是比较有用的,通过这些资料,大概一天就可以学会噢~
Linux下基于epoll_线程池高并发服务器实现研究,研究Linux的人可以看看。
Linux网络编程(四)——epoll+多线程实现简单的聊天(linux 服务器端 windows客户端)
该源代码使用linux的网络IO多路复用模型epoll在建立tcpserver,对用队列来缓存请求,使用线程池来处理请求。
在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927
HTTP服务器,时间轮,epoll, 线程池
epoll+多线程的例子,本例子还有压力测试。
大并发服务器编程模型 windows iocp完成端口模型可支持1万大并发,但是linux能作到5万大并发
使用epoll 和线程池实现简单的图片浏览服务器.zip 大学生课程设计 的课程设计 自己大二写的课程设计
基于 网络编程 数据库操作 IO操作 数据结构 epoll 线程池写的网络聊天室 功能齐全
http_serverlinux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+reactor模式的http文件下载服务器linux下c语言版基于epoll+...
基于C++使用 epoll + threadpool 实现的 webServer,支持GET、POST.zip