多路复用

4-4 多路复用IO模型

*爱你&永不变心* 提交于 2019-12-01 06:49:28
多路复用IO(IO multiplexing) IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了。有些地方也称这种IO方式为 事件驱动IO (event driven IO)。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图: 当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket, 当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。 这个图和blocking IO的图其实并没有太大的不同,事实上还更差一些。因为这里需要使用两个系统调用\(select和recvfrom\), 而blocking IO只调用了一个系统调用\(recvfrom\)。但是,用select的优势在于它可以同时处理多个connection。 强调: 1. 如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking

五种IO模型

柔情痞子 提交于 2019-11-30 19:03:25
IO的产生   I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分.   当用户进程调用了recvfrom这个系统调用,就引发了一次IO过程,这个时候的IO就要等待系统去磁盘上将数据读取读来,再拷贝到进程中 在网络情况下,IO通常分为两步   1.等待系统准备数据   2.数据从内核中拷贝到进程中   如果想提高IO的效率,就要减少准备数据的时间. 通常的IO模型分为5种   1.阻塞IO   2.非阻塞IO   3.事件驱动IO   4.多路复用IO   5.异步IO 1.阻塞IO   在内核将数据拷贝到进程中之前,整个进程都处在等待状态,就是阻塞IO   A拿着一支鱼竿在河边钓鱼,并且一直在鱼竿前等,在等的时候不做其他的事情,十分专心。只有鱼上钩的时,才结束掉等的动作,把鱼钓上来。       2.非阻塞IO   每次进程询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮寻,减少数据等待的时间,当准备数据时,进程是在非阻塞状态的,可以去做一些其他操作.   B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等)

为什么使用HTTP2?

守給你的承諾、 提交于 2019-11-29 19:37:47
最近我们公司的官网由原来的http1.1已升级到http2,而我们前端开发对http2还是一片懵懂,更不知道为何换成了这个,故此补充了下http2的相关知识。 http1.1相比于http1.0有哪些优势? 缓存处理 在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准, HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 带宽优化及网络连接的使用 HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 错误通知的管理 在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。 Host头处理 在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)

Redis面试题

北城以北 提交于 2019-11-29 18:47:12
1.为什么要使用Redis? a.实现分布式锁 redis提供了可以用来实现分布式锁的方法,比如redis的setnx方法等 b.提高性能 通过redis可以实现基于内存的数据库,可以通过redis实现对请求的缓存。 c.实现高并发 redis的缓存功能、以及可以通过redis可以实现类似与消息队列的能够,避免了大量请求同时调用数据库。 2.单线程的Redis为什么这么快? a.绝大数的请求操作都是纯粹的内存操作 b.采用了单线模式,避免了不必要的上下文切换和竞争条件 这里的单线程指的是网络请求模块只使用了一个线程(所以不必考虑并发安全性),即一个请求处理所有网络请求,其他模块仍使用了多个线程。 c.非阻塞IO—IO多路复用 IO多路复用实现了可以同时监听多个客户端。 IO多路复用与多线程相,IO多路复用不需要切换到内核进行线程切换,需要更少的时间和资源. 3.Redis过期策略和内存淘汰机制 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 惰性删除: key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。 定期删除: 每隔一段时间执行一次删除过期key操作 注:redis一般使用定时删除、定期删除; mercached只使用惰性删除。 4.使用Redis有什么缺点?

Python IO多路复用

我的未来我决定 提交于 2019-11-29 13:21:41
IO多路复用 多个socket是否已经发生变化,(是否已经连接成功/是否已经获得数据)(可读/可写) 实现: IO多路复用 非阻塞 代码如下: import socket import select client1 = socket.socket() client1.setblocking(False) # 将原本链接阻塞,修改为非阻塞 # 百度创建链接,阻塞 try: client1.connect(('www.baidu.com',80)) except BlockingIOError: pass client2 = socket.socket() client2.setblocking(False) # 将原本链接阻塞,修改为不阻塞 # 百度创建链接,阻塞 try: client2.connect(('www.sogou.com',80)) except BlockingIOError: pass client3 = socket.socket() client3.setblocking(False) # 将原本链接阻塞,修改为不阻塞 # 百度创建链接,阻塞 try: client3.connect(('www.oldboyedu.com',80)) except BlockingIOError: pass socket_list = [client1,client2

Redis03——Redis架构

冷暖自知 提交于 2019-11-29 10:29:59
Redis架构 1.1.问题 redis是单线程,单实例,为什么并发那么多,依旧很快呢? 回答:因为调用了系统内核的epoll 1.2.Linux的早期版本 Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。 1.3.内核的跃迁 Linux kernal在之后的发展,有了很大的变化,Linux到达率NIO时期。我们可以使用客户端进行轮询访问。但是,我们如果打进1000个线程访问,那么成本就会很大。我们出现了select函数,select函数和pselect函数,我们可以直接传1000个文件描述符,一旦有返回,那么再去调read函数。这个叫做多路复用的NIO。 紧接着,内核再次跃迁,我们出现了一个共享空间,通过mmap进行空间映射。(本质是红黑树+链表//红黑树是一种自平衡的二叉查找树)。我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取

嵌入式linux4412多路复用式串口操作(select和poll实现方法)

时光总嘲笑我的痴心妄想 提交于 2019-11-28 22:47:44
1实验目的 通过编写多路复用式串口读写,进一步理解多路复用函数的用法,同时更加熟练地掌握LINUX设备文件的读写方法。 2、实验内容 本实验中,实现两台机器(宿主机和目标板)之间的串口通信,而且每台机器均可以发送数据和接收数据。除了串口的设备名称不同,两台机器上的程序基本相同。 首先,程序打开串口设备文件并进行相关配置,调用select()函数或poll()函数,使它等待从标准输入(终端)文件中的输入数据及串口设备的输入数据。 1、如果有标准输入文件上的数据,则写入到串口,使对方读取。 2、如果有串口设备上的输入数据,则将数据写入到普通文件中。 select函数 LINUX系统提供select函数来实现 多路复用输入/输出模型 ,原型: int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 参数maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset分别对应于需要检测的 可读文件描述符 的集合, 可写文件描述符 的集 合及 异常文件描述符 的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为0。 1.timeout=NULL( 阻塞 :select将一直被阻塞

http/1.x、http/2与https的区别

流过昼夜 提交于 2019-11-28 07:20:05
  面试的时候被问到http与https的区别、以及http/1.x与http/2的区别,之前偶尔有了解,但是没有系统的学习,所以答的就比较模棱两可,结果不大如人意,于是狠下心来。。。学呗 一、首先说http与https的区别   (一)、了解http与https之前先要知道一下几个概念:     1、什么是http与https?     2、什么是ssl与tls       1、http(HyperText Transfer Protocol)超文本传输协议,https(Hypertext Transfer Protocol Secure)超文本传输安全协议,就是http的安全版本。http与https都属于应用层协议,下一层是TCP(传输层协议),https没有对http作任何修改,https是由http进行通信,但利用SSL/TLS来加密数据包,https是在http与tcp之间加了一个ssl/tls协议。http + 加密 + 认证 + 完整性保护 = https,可以说https是披着ssl/tls外衣的http。那么什么是ssl/tls?       2、ssl/tls:SSL/TLS是HTTP和TCP之间的中转协议,也是一个应用层协议。我们可以把ssl/tls理解为一个黑盒子,我们把数据丢给http,http把数据丢给ssl/tls,ssl

一文读懂 HTTP/2 特性

て烟熏妆下的殇ゞ 提交于 2019-11-28 03:35:23
HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP/2标准于2015年5月以RFC 7540正式发表。 那 HTTP/2 到底有哪些具体变化呢? 二进制分帧 先来理解几个概念: 帧:HTTP/2 数据通信的最小单位消息:指 HTTP/2 中逻辑上的 HTTP 消息。例如请求和响应等,消息由一个或多个帧组成。 流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。 HTTP/2 采用二进制格式传输数据,而非 HTTP 1.x 的文本格式,二进制协议解析起来更高效。 HTTP / 1 的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。 HTTP/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。 多路复用 多路复用

1.nginx基础

孤人 提交于 2019-11-27 12:14:18
nginx是一个开源且高性能、可靠的http中间件、代理服务 选择nginx的原因: io多路复用 io多路复用 多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的 “复用” 指的是复用同一个线程 I/O多路复用实现的方式 select、poll、epoll select是linux下出现的最早的 缺点: 1. 能够监视文件描述符的数量存在最大限制 1024个 2. 线性扫描效率低下 epol 效率比select好 1. 每当FD就绪,采用系统的回调函数之间将fd放入,效率更高。跟select比(一个是遍历获取,一个是传了id过去) 2. 最大连接无限制 轻量级 功能模块少 代码模块化 cpu亲和 把cpu核心和nginx工作进程进行绑定方式,把每个worker进程固定在一个cpu上执行,减少cpu的cache miss,获得更好的性能 sendfile 减少了用户空间这一层,直接使用内核空间 nginx的安装 Mainline version 开发版本 Stable version 稳定版 Legacy version 历史版本 官网 安装目录 /etc/logrotate.d/nginx 配置文件 nginx日志轮转,用于logrotate服务的日志切割 /etc/nginx /etc/nginx/nginx.conf /etc/nginx