epoll多路复用:
java bio模型,阻塞进程式
linux select模型,变更触发轮训查找,有1024数量上限
epoll模型,变更触发回调直接读取,理论上无上限
master-worker进程模型
nginx会启动一个master进行,会根据配置文件中的masterworker的数量,启动相应数量的worker进行,属于父子关系,通过linux c的系统调用fork方式,产生的主子进程的关系。
root 1835 1 0 10:51 ? 00:00:00 nginx: master process sbin/nginx -c conf/nginx.conf
nobody 6310 1835 0 15:21 ? 00:00:00 nginx: worker process
master进行可以管理worker进程的内存空间,measter内存有所有worker进程内存空间的内存变量,函数堆栈,socket的文件句柄。master进程管理worker进程,worker进程真正用于处理客户端链接。但启动master进程,会创建socket文件句柄,用于listen在80端口上,master会启动spoll多路复用进程。但客户端向80端口发送socket connect操作,epoll多路复用模型,发生回调,master进程不会处理请求的accept的操作,让对应的worker去处理accept操作(至于哪一个worker进程处理accept操作,nginx在内存中有一个互斥mutex,多个worker进程,回去抢占这个内存锁,谁先抢占到,就由谁处理)。一旦某一个worker进程接受accept的操作,所有receive send操作都有这个worker进程处理。
sbin/nginx -s reload 平滑处理,重新加载配置文件
worker进程的进程号会变,但是所有的socket都不i受到影响。因为,master进程要求worker的所有socket句柄交给master管理。master会重新加载配置文件,从新分配内存worker进程,并将soceter句柄交给他完成。
协程机制
依附于线程的内存模型,切换开销小
遇阻塞及归还执行权,代码同步
无需加锁
总结:首先基于spoll多路复用机制,解决了io阻塞的回调通知问题。依靠master-worker的进程模型,可以实现平滑的过度,平滑的重启,并且基于worker的单线程模型和epoll多路复用机制,完成高效的操作。协程机制,将每一个用户的请求对应到线程中的某一个协程,在协程中利用spoll多路复用机制,完成同步调用的开发。