开发者学堂课程【Linux Web服务器Nginx搭建与配置:nginx 介绍及安装】学习笔记,与课程紧密联系,让用户快速学习知识.
课程地址:https://developer.aliyun.com/learning/course/579/detail/7987
nginx 介绍及安装
内容介绍
一、I/O 模型
二、Nginx 介绍
一、I/O 模型
(7) 信号驱动 IO 模型
具有更多的异步特性,就是调用者不需要主动问被调用者,比如当磁盘文件读取到内核当中时,数据还未得到,但进程仍可继续执行,或者响应其他用户的请求,直到磁盘文件读取到内核当中后,将数据从内核拷贝到用户空间中,但这个过程中需要等待,换句话说就是有一部分实现了异步,一部分仍是同步,意味着信号驱动IO模型将数据分成了一半阻塞不阻塞状态,效率提高了不少,因为将磁盘文件拷贝到内核空间上是最费时间的,而信号驱动IO模型可以将这时间自由分配。
信号驱动 IO : signal-driven I/O
用户进程可以通过 sigaction 系统调用注册一个信号处理程序,然后主程序可以继续向下执行,当有IO操作准备就绪时,由内核通知触发一个 SIGIO 信号处理程序执行,然后将用户进程所需要的数据从内核空间拷贝到用户空间
此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知
该模型并不常用
(8)异步 IO 模型
当用户发请求,内核得到请求从磁盘复制到内核,从内核复制到用户空间,用户程序一直在执行,没有堵塞,一直由内核复制数据,递交给应用程序。所以对于进程来讲很轻松,内核做的事更多一点,当然进程做的事越少,他的负担越小,就可以同时做更多的事。
(9)五种 I/O 模型
同步IO模型一直在阻塞,同步非阻塞模型不是完全非阻塞,只是前面的阶段磁盘拷贝到内核不阻塞,但又因为是同步的还是什么都干不了,因为不清楚做没做完,所以一直消耗资源在轮询。IO复用模型都是阻塞的,只不过在前面阶段阻塞在代理select上面,只是换个地方阻塞。而信号驱动模型,前面阶段不阻塞,可以做一些事情。异步IO模型是最理想的,不阻塞。如图越往左越阻塞,越往右越不阻塞。
(10)I/O 模型的具体实现
主要实现方式有以下几种:
- Select : Linux 实现对应, I/O复用模型, BSD4.2 最早实现
- Poll : Linux 实现,对应I/O复用模型, System V unix 最早实现
- Epoll : Linux 实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性
- Kqueue : FreeBSD 实现,对应I/O复用模型,具有信号驱动I/O模型某些特性
- /dev/poll : SUN 的 Solaris 实现,对应I/O复用模型,具有信号驱动I/O模型的某些特性
- Iocp Windows 实现 ,对应第5种(异步I/O )模型
(11)select/poll/epoll 区别
epoll :在Linux 2.6内核中提出的 select 和 poll 的增强版本
- 支持水平触发 LT 和边缘触发 ET ,最大的特点在于边缘触发,它只告诉进程哪些 fd 刚刚变为就需态,并且只会通知一次
- 使用"事件”的就绪通知方式,通过 epoll_ ctl 注册 fd ,一旦该 fd 就绪,内核就会采用类似 callback 的回调机制来激活该 fd , epoll_ wait 便可以收到通知
优点:
- 没有最大并发连接的限制:能打开的 FD 的上限远大于1024(1G的内存能监听约10万个端口)
- 效率提升:非轮询的方式,不会随着 FD 数目的增加而效率下降;只有活跃可用的 FD 才会调用callback函数,即 epoll 最大的优点就在于它只管理“活跃"的连接,而跟连接总数无关
- 内存拷贝,利用 mmap(Memory Mapping)加速与内核空间的消息传递;即 epoll 使用 mmap 减少复制开销
注:mmap 为内存映射
内存映射:
用 nginx 访问磁盘文件,一般情况要发指令给内核,内核跑到磁盘读取数据,数据在磁盘上存放是文件数组方式组织的,要先从磁盘找节点表 inode,通过目录一层层找到文件 data,相对效率不高。
所以可以在磁盘划一块空间就是这个文件,然后把这个文件映射到内存空间,假设磁盘是16M,则内存也是16M,让两块区间一个字节一个字节对应,将来要访问文件时就可以直接访问内存里的这块空间提高了效率,如下图,
二、Nginx 介绍
- Nginx:engineX,2002年,开源,商业版
- NGINX是免费,开源,高性能的 HTTP 和反向代理服务器,邮件代理服务器,通用 TCP/UDP 代理服务器
- 解决 C10K 问题( 10K Connections )
- 官网: http://nginx.org
- 二次开发版:
Tengine, OpenResty (章亦春)