epoll + 스 레 드 풀 을 말씀 드 리 겠 습 니 다.

최근 에 epoll 학습 을 하면 서 많은 자 료 를 보 았 습 니 다. epoll 의 원리 에 대해 서 는 더 이상 말 하지 않 겠 습 니 다. 간단 합 니 다. 주의해 야 할 것 은 epoll 로 만 네트워크 서버 를 처리 하면 성능 이 크게 향상 되 지 않 을 것 같 습 니 다. 왜냐하면 io 의 처 리 는 epoll 이나 poll 의 검 측 에 비해 시간 소모 가 많 기 때 문 입 니 다.이 말 은 비교적 어 긋 날 수 있 습 니 다. 쉽게 말 하면 당신 의 매번 epoll 입 니 다.wait 에 걸 린 시간 은 당신 이 사건 을 얻 은 후에 한 read, write = = 걸 린 시간 보다 훨씬 적 고 적어도 나 는 이렇게 느낀다.그래서 성능 을 향상 시 키 려 면 epoll + 스 레 드 탱크 가 필요 합 니 다. 그런데 문 제 는 이 스 레 드 탱크 를 어떻게 하 느 냐 는 것 입 니 다.많은 친구 들 의 스 레 드 탱크 는 스스로 조정 할 수 있 고 없 으 면 자동 으로 분배 된다.제 생각 은 이 렇 습 니 다. 필요 없 겠 죠?iocp 를 모방 하면 좋 을 것 같 습 니 다. 물론 모방 은 불가능 합 니 다. iocp 는 복잡 합 니 다.우 리 는 그의 절차 와 체 제 를 모방 하여 적당 한 성능 손실 (사건 통지 체제 라면) 을 받 아들 일 수 있다.또 하나의 가장 큰 문 제 는 우리 가 아래층 에서 줄 을 서 는 것 을 도와 야 한 다 는 것 이다. 자신 이 위층 에서 줄 을 서 는 것 이 아니 라 운영 체제 로 하여 금 epol 이 없 기 때문이다.wait 가 발생 하 는 속도 가 빨 라 서 중간 버퍼 대기 열 이 계속 커 집 니 다.그 러 니까 운영 체제 에 남 겨 두 고 줄 을 서 주세요.적어도 지금 나의 cobraLiux 는 이렇게 이 루어 졌 다.
잠시 만 요. 제 코브라 를 보 여 드릴 게 요.Liux 죠? 아직 완벽 하 지 는 않 지만.
 

#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  : [email protected]
* 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

좋은 웹페이지 즐겨찾기