높 은 병발 서비스 구조
2680 단어 높 은 병발
주 프로 세 스:
int main()
{
//initializations
//...
//init socket
listenfd = socket(...);
bind(listenfd, ...);
listen(listenfd, ...);
//fork worker processes
for(...)
{
pid_t pid = fork();
//child
if(pid == 0)
{
//worker main cycle
work_process_cycle();
}
//parent
else
{
//...
}
}
//...
}
하위 프로 세 스 (worker)
void work_process_cycle()
{
//init epoll
int epfd = epoll_create(...);
//...
//add listenfd to epoll
struct epoll_event ep_ev;
ep_ev.data.fd = listenfd;
ep_ev.events = EPOLLIN | EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ep_ev);
while(1)
{
//epoll events
struct epoll_event events[EPOLL_MAX_EVENTS];
int nfds = epoll_wait(epfd, events, EPOLL_MAX_EVENTS, EPOLL_TIMEOUT);
for(i = 0; i < nfds; i++)
{
//accept connection
if(events[i].data.fd == listenfd)
{
int connfd = accept(listenfd, ...);
//add read event
struct epoll_event ep_ev;
ep_ev.data.fd = connfd;
ep_ev.events = EPOLLIN | EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, connfd, &ep_ev);
}
else if(events[i].events & EPOLLIN)
{
//deal with read events
//recv, read, ...
}
else if(events[i].events & EPOLLOUT)
{
//deal with write events
//send, write, ...
}
}
//other events
//process events, timed events, etc.
}
}
epoll 의 IO 트리거 메커니즘 을 사 용 했 고 libevent 와 같은 라 이브 러 리 로 IO 이벤트 감청 을 할 수 있 습 니 다.높 은 병행 서비스 라면 하나의 프로 세 스 가 N 개의 서로 다른 연결 을 동시에 처리 해 야 합 니 다. 그러면 프로 세 스 안의 사건 체제 에 비교적 좋 은 디자인 이 필요 합 니 다.예 를 들 어 서비스 중의 특정한 기능 에 대해 일련의 반전 함수 (callback) 와 하나의 구조 체 를 설계 하여 구체 적 인 문맥 정 보 를 저장 할 수 있다.기능 에 있 는 리 셋 함수 가 완 료 될 때마다 이벤트 의 다음 리 셋 함 수 를 업데이트 하고 이벤트 대기 열 (event quue) 에 넣 은 다음 iteration 에서 FIFO 이벤트 처 리 를 하고 리 셋 함 수 를 호출 합 니 다.이렇게 하면 모든 프로 세 스 의 시간 을 나 누 면 비교적 공평 할 수 있다.사실 Nginx 는 바로 상술 한 구조의 좋 은 예 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
재 미 있 는 Ngin x 선 에 오 류 를 적어 주세요.두 서버 에 nginx 한 대 를 부하 균형 이 높 은 데 사용 할 수 있 도록 설정 하 였 으 나, nginx 를 통 해 데 이 터 를 요청 할 때, 매번 첫 번 째 서버 에 전 화 를 걸 때마다 오 류 를 보고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.