一: I/O(输入输出)介绍
系统调用:应用程序通过一些接口访问内核
PIO:程序输入输出模型,CPU会参与
DMA:直接内存访问,磁盘读写过程不需要CPU参与,CPU发送指令给DMA控制器,DMA控制器用来读写磁盘到内存中再返还给应用程序
同步/异步:关注的是消息的通知机制
同步:synchronous,当要去调用一个程序执行某个操作,调用者一直主动询问被调用者是否完成,完成后才会继续执行;
异步:asynchronous,被调用者通过通知机制主动告诉调用者是否完成,在被调用者运行的同时,可以进行其它工作;
阻塞/非阻塞:关注调用者在等待结果返回前所处的状态
阻塞:当IO操作彻底完成后才能做别的事,没有完成就要一直等待
非阻塞:在IO操作过程中,不影响调用者其它操作
同步阻塞:停下所有工作并且不断去询问IO操作是否完成
异步阻塞:在IO操作的同时,一直等待IO操作结果的返回讯息,无需主动不断询问
同步非阻塞:在IO操作的同时做别的操作,但会不断询问IO操作是否完成
异步非阻塞:一边做其他操作,一边等待IO操作的返回讯息,当返回讯息回来的时候,再去处理
二 I/O模型(内核工作模式):
阻塞型、非阻塞型、复用型、信号驱动型、异步
同步阻塞IO模型:
在应用程序未接收到内核已经准备完毕的返回通知时会一直等待内核准备完毕
同步非阻塞IO模型:
应用程序继续工作的同时还不断的去询问内核是否准备完毕,当内核从磁盘中调用出数据的时候则代表内核准备完毕,然后进行处理
IO多路复用模型(多进程的时候会用到):
找select代理去工作进程后续的操作,进程去询问select结果就可以,select可以同时服务多个进程,如果select工作未完成,那么
进程还是阻塞状态,相当于换了一个不断询问的对象,当数据在内核中但没有复制到用户空间的时候,select系统调用就会通知准
备完毕,进程在去发送一个系统调用从内核中调用数据;
信号驱动IO模型:(性能较好,nginx具有此模型的某些特性)
在内核将磁盘文件读取到内核的过程中,进程可继续运行别的工作,比如继续响应其他用户请求,当内核准备完毕后,进程停止工作
等待内核将数据复制到进程空间,时间较短
异步IO模型:
进程将指令发送完毕后继续运行别的工作,等待IO操作的完成结果即可,不会阻塞,可以不断响应用户请求,内核压力会大
Epoll(Nginx使用的模式):
1 对应IO复用模型,并且具有信号驱动IO模型的某些特性
2 没有最大并发连接的限制
3 内存拷贝mmap:对于进程来说,当想访问的内存空间不够的时候,可以映射到磁盘里,磁盘里的映射内存与内存空间是一一对应的
三: Nginx介绍
1 Nginx官方网站:https://www.nginx.org
2 Nginx功能:
1 $$高性能的HTTP,只能处理静态页面,结合fastcgi实现处理动态页面;
2 $$反向代理服务器
1 正向代理服务器:当客户端访问某网站,网页下载到代理服务器,由代理服务器响应给客户端,省了流量和带宽,服务器客户端
2 反向代理服务器:服务于服务器,调度功能,并且工作在应用层,代替客户端去后端服务器抓取数据,那么后端服务器会认为是Nginx来的请求,具备健康性检查;
而LVS工作在网络层传输层,并且只有调度功能,不会去抓取数据,后端服务器记录的也是客户端IP;
3 邮件代理服务器
4 TCP/UDP的代理服务器
5 支持热部署:不停机更新配置文件,启动新版本应用,新的请求就会发送到新的版本的应用上;
6 低内存消耗:10000个keep-alive连接模式下的非活动连接(连着但是不相互传输数据),仅耗费2.5M内存;
7 使用master/worker工作模式,一个master主进程管理多个worker进程,worker进程处理客户端请求,不存在线程;
3 Nginx模块
核心模块:core module(必须存在的)
标准模块:
HTTP模块:ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail 模块 ngx_mail_*
Stream(代理模块) 模块 ngx_stream_*
注意:www.nginx.org --> 选择nginx版本 --> documentation(页面右侧) --> 一系列模块详解以及使用方法
原文地址:http://blog.51cto.com/kaikai0720/2097538