一次http事务的完成过程:(web服务器端)

   1、建立TCP连接

   2、接受请求(linux内核从网卡接受请求后,检验端口号和主机名后,发给对应web进程)

   3、处理请求(web服务进程)

   4、获取资源(web进程通过内核将硬盘中的数据读入linux内核的内存空间,然后再复制到web进程的内存空间中)

   5、构建响应(web软件构建响应报文)

   6、回送响应(报文+资源)

   7、记录日志

当用户请求一个网页内容时,其数据需要从网卡进入,经过tcp拆封装后,发现是送给监听在80端口的web进程时,然后给它。

web进程接受请求,发现是请求网站首页内容,于是向内核发起系统调用,要求进行I/O调取首页文件。

内核进行I/O后,将文件先放到内核内存,再复制到web进程内存,web进程再进行封装,然后再发送到内核的网络模块,最后才从网卡走掉。

这样响应数据从 “硬盘I/O”→“内核空间”→“web进程”→“内核空间网络模块”


多进程:

   每个进程的内存地址空间都是独立的,这样从内核空间复制数据时I/O量比较大

   由于进程切换的时候,需要保留进程的现场,再切换回去的时候需要回复现场。

   所以不能启动过多进程

多线程:

   线程共享进程的内存地址空间的资源,所以I/O量比较小。

   如果对应的工作进程崩溃,那么其下所有的线程都会崩溃。


nginx的工作模式是有一个master主进程,和N个worker工作线程。

master主进程只复制读取配置、按需生成、回收worker工作线程。而worker线程只负责响应用户请求。

当nginx升级时只需要将二进制执行文件替换即可,当有新连接进来时,就会使用新的worker线程。而旧的连接依然会使用旧的worker线程,直到断开为止才会被回收。