多并发
10K 1000K 10M
select poll epoll
同步和异步的区别
#任何一个服务器都在一个大的循环里面 //#为了标注明显
//同步
while(){
epoll_wait(epfd,evbuffer,length,-1)
receve()
send()
}
//异步
//线程池
thread_pool(){
Receve(){
poll()
receve()
}
Send(){
poll()
send()
}
}
while(){ #调度器
epoll_wait(epfd,evbuffer,length,-1)
push_to_thread_pool(sockfd)
}
异步的速度快,为什么还要同步
异步写代码很复杂
线程的安全问题
两个线程公用一个sockfd?
一个线程在读IO(read())时,另一个线程把IO关闭(close())了
- 一个线程read()
- close()
lock()
poll(sockfd,)
read()
unlock()
#或者
if{
poll(sockfd,)
read()
}
协程
为什要有协程
因为同步的性能不太好,异步的编程比较复杂(异步每一次都要去poll()检查fd)。协程就是同步的编程方式,异步的性能。
每一个fd对应一个协程
- switch --> goto, longjmp , jmp 切换
- yield --> 让出
- resume --> 重新拿到运行权
linux
mysql
事务
redis
nginx