一直帮老板搬运代码!!!
全部博文(116)
分类: LINUX
2013-01-28 15:49:12
设置epoll wait 这里cst 应该为ngx
6 static cst_int_t输出结果:
42 2013/01/28 15:12:33 [alert] 3158#0: cst_epollprocess_ -1 === 3
43 2013/01/28 15:12:34 [info] 3158#0: epoll_wait *13 linsent 0 fd to 3158 pid
44 2013/01/28 15:12:34 [alert] 3158#0: cst_epollprocess_ -1 === 3
45 2013/01/28 15:12:33 [alert] 3162#0: cst_epollprocess_ 500 === 1
46 2013/01/28 15:12:33 [alert] 3157#0: cst_epollprocess_ 500 === 1
47 2013/01/28 15:12:35 [info] 3157#0: epoll_wait *11 linsent 0 fd to 3157 pid
48 2013/01/28 15:12:35 [alert] 3157#0: cst_epollprocess_ 500 === 1
49 2013/01/28 15:12:33 [alert] 3159#0: cst_epollprocess_ 500 === 1
50 2013/01/28 15:12:35 [info] 3159#0: epoll_wait *15 linsent 0 fd to 3159 pid
51 2013/01/28 15:12:35 [alert] 3159#0: cst_epollprocess_ 500 === 1
52 2013/01/28 15:12:33 [alert] 3161#0: cst_epollprocess_ 500 === 1
53 2013/01/28 15:12:35 [info] 3161#0: epoll_wait *19 linsent 0 fd to 3161 pid
54 2013/01/28 15:12:35 [alert] 3161#0: cst_epollprocess_ 500 === 1
55 2013/01/28 15:12:33 [alert] 3156#0: cst_epollprocess_ 500 === 1
56 2013/01/28 15:12:35 [info] 3156#0: epoll_wait *9 linsent 0 fd to 3156 pid
57 2013/01/28 15:12:35 [alert] 3156#0: cst_epollprocess_ 500 === 1
58 2013/01/28 15:12:33 [alert] 3155#0: cst_epollprocess_ 500 === 1
59 2013/01/28 15:12:35 [info] 3155#0: epoll_wait *7 linsent 0 fd to 3155 pid
60 2013/01/28 15:12:35 [alert] 3155#0: cst_epollprocess_ 500 === 1
61 2013/01/28 15:12:33 [alert] 3160#0: cst_epollprocess_ 500 === 1
62 2013/01/28 15:12:35 [info] 3160#0: epoll_wait *17 linsent 0 fd to 3160 pid
63 2013/01/28 15:12:35 [alert] 3160#0: cst_epollprocess_ 500 === 1
64 2013/01/28 15:12:35 [alert] 3162#0: cst_epollprocess_ 500 === 1
65 2013/01/28 15:12:35 [alert] 3157#0: cst_epollprocess_ 500 === 1
66 2013/01/28 15:12:35 [alert] 3159#0: cst_epollprocess_ 500 === 1
67 2013/01/28 15:12:35 [alert] 3161#0: cst_epollprocess_ 500 === 1
68 2013/01/28 15:12:35 [alert] 3155#0: cst_epollprocess_ 500 === 1
69 2013/01/28 15:12:35 [alert] 3156#0: cst_epollprocess_ 500 === 1
70 2013/01/28 15:12:35 [alert] 3160#0: cst_epollprocess_ 500 === 1
71 2013/01/28 15:12:36 [alert] 3162#0: cst_epollprocess_ 500 === 1
这里的一个问题,希望有人能讲解:为什么启动的时候,会出现一次epoll id的存在:epoll_wait *17 linsent 0 fd to 3160 pid?我忘记是什么原因了,可能所父子通信管道的ID吧。
然后通过:3158#0: cst_epollprocess_ -1 === 3可以看出只有3158 在是永久等待的,就是说,只有一个获得accept的锁。然后,其他epoll进程,以500毫秒的时间,来询问是否可以接收锁。如果可以,那么获取接收,然后才可以accept客户端。
void
cst_process_events_and_timers(cst_cycle_t *cycle)
{
cst_uint_t flags;
cst_msec_t timer, delta;
if (cst_timer_resolution) {
timer = CST_TIMER_INFINITE;
flags = 0;
} else {
timer = cst_event_find_timer();
flags = CST_UPDATE_TIME;
#if (CST_THREADS)
if (timer == CST_TIMER_INFINITE || timer > 500) {
timer = 500;
}
#endif
}
if (cst_use_accept_mutex) {
if (cst_accept_disabled > 0) {
cst_accept_disabled--;
} else {
if (cst_trylock_accept_mutex(cycle) == CST_ERROR) {
return;
}
if (cst_accept_mutex_held) {
flags |= CST_POST_EVENTS;
} else {
if (timer == CST_TIMER_INFINITE
|| timer > cst_accept_mutex_delay)
{
timer = cst_accept_mutex_delay;
}
}
}
}
这里,在不断尝试获取读写锁,有超过1/8的链接,就放弃锁。更重要的是,如果可以accept后,那么将
static cst_int_t也就是把事件加入到对应的进程的epoll里面。
整个接受客户链接的情况就这些:
1、可以接收,添加如事件里面。然后永久等待。
2、其他进程以每500毫秒事件询问,是否可以接收,如果可以,那么添加入事件里面。事件就可以返回接受accept了.
3、如果大于1/8那么递减,直到可以接收位置,才去竞争接收锁。