分析服务端模型

1.首先socket bind listen
2.然后setsockopt(listen_fd, SOL_SOCKET, SO_REUSPORT,…) 可选
3.开始fork()配置的worker进程个数,每个进程的客户连接数置0,创建epoll:epoll_fd = epoll_create(...)
4进程首线程建立客户连接,将客户fd放入客户连接队列
4.1进程首线程进入循环
4.2每个进程设置进程互斥锁,确保同一时刻只能有一个worker进程获得客户连接
4.3获得锁的进程首线程connect_client=accept(...)接受客户连接,释放进程互斥锁
4.4获取线程互斥锁,如果客户连接数达到上限则设置条件变量,否则将connect_client放到客户连接队列,客户连接数+1
4.5释放线程互斥锁
4.6notify waait的工作线程
4.6进程首线程结束本轮循环

5工作线程做业务处理,创建N个worker线程
5.1worker线程进入循环
5.2获取线程互斥锁,如果客户连接数为0则设置条件变量,否则将客户连接队列中的描述符放到epoll_fd中(epoll_ctl(epoll_fd, ...) )
5.3接着epoll_wait(epoll_fd, ...)
5.4epoll_wait返回后,取得第一个就绪的客户fd,将客户fd从客户连接队列中删除掉,客户连接数-1  这样的方式要水平触发才可以
       //或者返回后,取到所有就绪的客户fd,将客户fd从客户连接队列中删除掉,客户连接数-就绪的客户fd  这样感觉不太好,一个线程会处理多个连接会增加客户等待时间

5.5释放线程互斥锁
5.6notiy wait的主线程
5.7对就绪的客户fd做业务处理
5.8worker线程结束本轮循环

最后,父进程变成一个Watcher,只做子进程维护和信号处理等全局性工作

 
喜欢 0
分享