IO复用
Posted liuzhiyun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO复用相关的知识,希望对你有一定的参考价值。
http 协议特点
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径
- 灵活 :HTTP允许传输任意类型的数据对象。正在传输的类型由Content-type加以标记
- 无连接:即限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,就断开连接。采用这种方式可以节省传输时间
- 无状态:HTTP协议是无状态协议。无状态指-----协议对于事务处理没 有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的数据量增大。另一方面,再服务器不需要先前信息时它的应答就较快。
HTTP协议工作位置
在tcp/ip协议栈中的位置
http协议通常承载与TCP协议之上,工作在应用层
pv :page view 一次页面的访问
uv:User View 一个用户(IP)点开页面算一个(表现一个网站活跃度)针对队里IP
active connetion:活动链接数
qps :每秒的请求数
2E pv; active connetion 100w;qps 1-2w
MPM多道处理模块
Prefork :实现了一个非线程型的。预派生的web服务器
主进程,生成多个子进程,每个子进程处理一个请求
Worker:主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求
复用I/O
event : 主进程,生成多个子进程,每个子进程响应多个请求
它把服务进程从连接中分离出来,在开启keepalive场合下相对worker模式能够承受的了更高的并发负载
事件驱动式I/O
同步:调用发出之后不会立即返回,但一旦返回,则返回即是最终结果
异步:调用发出之后,别调用方立即返回消息,但返回的并非最终结果;被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果
关注点---是消息通知机制
阻塞 :调用结果返回之前,调用者会被挂起;调用者只有在得到返回结果之后才能继续;
非租塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者
关注点---调用者等待被调用者返回调用结果时的状态
阻塞blocking IO
非租塞nonblocking IO
多路IO multiplexing
异步 asynchronous IO
事件驱动 signal driven IO
基于TCP客户/服务器程序的套接字函数
IO发生时涉及的对象和步骤。对一个network IO ,它会涉及到两个系统对象,一个是调用这个IO的process(or thread),另一个就是系统内核。
当一个read 操作发生时,它会经历两个阶段:
- 等待数据准备
- 将数据从内核拷贝到进程中
当用户进程调用recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。
对于network IO来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。
而在用户进程这边整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。
实际上,除非特别指定,几乎所有的IO接口(包括socket接口)都是阻塞型的
阻塞:特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都会被block
select和epoll模型(Apache和nginx)
select同步阻塞
- 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
- 同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
- select支持的文件描述符数量太小,默认是1024
Epoll异步模型
- 支持一个进程打开大数目的socket描述符
- IO效率不随FD数目增加而线性下降
- 使用mmap加速内核与用户空的消息传递
- 边缘触发和水平触发
同步IO:用户进程发出IO调用,去获取IO设备数据,双方的数据要经过内核缓冲区同步,完全准备好后,再复制返回到用户进程。而复制返回到用户进程会导致请求进程阻塞,直到I/O操作完成。
同步IO:导致请求进程阻塞,直到I/O操作完成。
异步IO:不导致请求进程阻塞。
异步IO:用户进程发出IO调用,去获取IO设备数据,并不需要同步,内核直接复制到进程,整个过程不导致请求进程阻塞。
所以, 阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型者为同步IO模型,只有异步IO模型是异步IO。
IO模型的具体实现方式对比
1.几种模式实现方式
2.select,poll,epoll区别
apache是同步阻塞模式,select实现方式
nginx是异步非阻塞工作模式,epoll实现方式
IO复用:http://note.youdao.com/noteshare?id=002ebbbcadabb6f33cb1115aab7a7f6f&sub=BB926F20646E4E8088150B6C13FDE4B9
https://www.cnblogs.com/f-ck-need-u/p/7624733.html
https://blog.51cto.com/anfishr/2308885
以上是关于IO复用的主要内容,如果未能解决你的问题,请参考以下文章
IO多路复用/基于IO多路复用+socket实现并发请求/协程