标签:处理程序 加载 内核空间 机制 准备就绪 模式 epoll ack centos
httpd MPM(多路处理模块):
prefork:进程模型,两级结构,主进程master负责生成 子进程,每个子进程负责响应一个请求
worker:线程模型,三级结构,主进程master负责生成子 进程,每个子进程负责生成多个线程,每个线程响应一个 请求
event:主进程master负责生成子进程,每个子进程响应 多个请求
I/O: 网络IO:本质是socket读取 磁盘IO: 磁盘的读写
每次IO,都要经由两个阶段: 第一步:将数据从文件先加载至内核内存空间(缓冲区) ,等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内 存中,时间较短
同步/异步:关注的是消息通信机制
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
I/O模型: 阻塞型、非阻塞型、复用型、信号驱动型、异步
同步阻塞IO模型
同步阻塞IO模型是最简单的IO模型,用户线程在内核进行 IO操作时被阻塞。
用户线程通过系统调用read发起IO读操作,由用户空间转到 内核空间。内核等到数据包到达后,然后将接收的数据拷贝 到用户空间,完成read操作。
用户需要等待read将数据读取到buffer后,才继续处理接收 的数据。整个IO请求的过程中,用户线程是被阻塞的,这导 致用户在发起IO请求时,不
能做任何事情,对CPU的资源利 用率不够。
同步非阻塞IO模型
用户线程发起IO请求时立即返回。但并未读取到任何数据, 用户线程需要不断地发起IO请求,直到数据到达后,才真正 读取到数据,继续执行。
即 “轮询”机制
整个IO请求的过程中,虽然用户线程每次发起IO请求后可以 立即返回,但是为了等到数据,仍需要不断地轮询、重复请 求,消耗了大量的CPU的资源
是比较浪费CPU的方式,一般很少直接使用这种模型,而是在 其他IO模型中使用非阻塞IO这一特性
IO多路复用模型
本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上 ,而不是阻塞在真正的IO操作上
用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异 步),同时等待select系统调用返回。当数据到达时,IO被激活,
select 函数返回。用户线程正式发起read请求,读取数据并继续执行。
从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区 别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差 。
并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个 IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个 IO
请求的目的。而不像阻塞IO那种,一次只能监控一个IO
虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还 是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要 长。
如果用户线程只是注册自己需要的IO请求,然后去做自己的事情, 等到数据到来时再进行处理,则可以提高CPU的利用率
IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因 为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步 阻塞IO
模型,而非真正的异步IO
IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备 读取,它就通知该进程
IO多路复用适用如下场合:
当客户处理多个描述符时(一般是交互式输入和网络套接口), 必须使用I/O复用
当一个客户同时处理多个套接口时,这种情况是可能的,但很少 出现
当一个TCP服务器既要处理监听套接口,又要处理已连接套接口 ,一般也要用到I/O复用。
当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用
当一个服务器要处理多个服务或多个协议,一般要使用I/O复用
信号驱动IO模型
信号驱动IO:signal-driven I/O
就是说用户进程可以通过sigaction系统调用注册一个信号处 理程序,然后主程序可以继续向下执行,当有IO操作准备就 绪时,由内核通知
触发一个SIGIO信号处理程序执行,然后 将用户进程所需要的数据从内核空间拷贝到用户空间
此模型的优势在于等待数据报到达期间进程不被阻塞。用户 主程序可以继续执行,只要等待来自信号处理函数的通知 ;该模型并不常用
异步IO模型
异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核 通知何时可以进行IO操作,而异步IO则是由内核告诉我们 IO操作何时完成了。具体来说就是,
信号驱动IO当内核通知 触发信号处理程序时,信号处理程序还需要阻塞在从内核空 间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直 接是在
第二个阶段完成后内核直接通知可以进行后续操作了
相比于IO多路复用模型,异步IO并不十分常用,不少高性能 并发服务程序使用IO多路复用模型+多线程任务处理的架构基 本可以满足需求。况且目前
操作系统对异步IO的支持并非特 别完善,更多的是采用IO多路复用模型模拟异步IO的方式( IO事件触发时不直接通知用户线程,而是将数据读写完毕后
放到用户指定的缓冲区中)
I/O模型的具体实现
Select:Linux实现对应,I/O复用模型
Poll:Linux实现,对应I/O复用模型
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)模型
Nigix默认epoll,性能及其优秀!
Nginx:engine X ,2002年,开源,商业版
http协议:web服务器(类似于httpd)、http reverse proxy(类似于httpd)、imap/pop3 reverse proxy,tcp
NGINX is a free, open-source, high-performance an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server
二次开发版:Tengine, OpenResty
官网:http://nginx.org
正向代理和反向代理
特性: 模块化设计,较好的扩展性 ; 高可靠性 ; 支持热部署:不停机更新配置文件,升级版本,更换日志文件 ;低内存消耗:10000个keep-alive连接
模式下的非活动连接,仅 需要2.5M内存 ; event-driven,aio,mmap,sendfile
基本功能: ----静态资源的web服务器 ----http协议反向代理服务器 ----pop3/imap4协议反向代理服务器 ----FastCGI(lnmp),uWSGI(python)等协议
----模块化(非DSO),如zip,SSL模块 ----tcp,udp代理
nginx架构
nginx的程序架构: master/worker结构
一个master进程: 负载加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程 处理并响应用户请求
缓存相关的进程: cache loader: 载入缓存对象 cache manager:管理缓存对象
nginx模块:模块分类: 核心模块:core module
标准模块: HTTP 模块: ngx_http_* HTTP Core modules( 默认功能) HTTP Optional modules (需编译时指定)
Mail 模块 ngx_mail_*
Stream模块 ngx_stream_*
第三方模块
nginx的功用:静态的web资源服务器 html,图片,js,css,txt等静态资源
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
http/https协议的反向代理
imap4/pop3协议的反向代理
tcp/udp协议的请求转发(反向代理)
nginx的安装:官方: http://nginx.org/packages/centos/7/x86_64/RPMS
Fedora-EPEL: https://mirrors.aliyun.com/epel/7/x86_64/
yum -y install nginx
安装前脚本已经创建nginx用户
启动nginx(注意用nginx启动,必须用nginx -s stop停,用systemctl start nginx 启动必须用systemctl stop nginx 停)
nginx -t 检测配置文件语法 -T 检测的同时输出配置文件
Nginx:默认为启动nginx -h 查看帮助选项 -t 测试nginx语法错误 -c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 发送信号给master进程,signal可为:stop, quit,reopen, reload(reload 很多时候不生效)
nginx配置
配置文件的组成部分: 主配置文件:nginx.conf 子配置文件 include conf.d/*.conf
主配置文件的配置指令: directive value [value2 ...];
注意: (1) 指令必须以分号结尾
(2) 支持使用配置变量 内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义 set variable_name value;
引用变量:$variable_name
nginx配置文件:
标签:处理程序 加载 内核空间 机制 准备就绪 模式 epoll ack centos
原文地址:http://www.cnblogs.com/heiye123/p/7728568.html