后端开发核心技术 第7章网络IO模型 4种网络IO模型

IO两种操作

同步IO

必须等待IO操作完成后,控制权才给用户进程

异步IO

无须等待IO 完成操作,就将控制权给用户进程

网络中IO常见4种情况

输入操作:等待数据达到套接字接收缓冲区
输出操作:等待套接字发送缓冲区有足够的空间容纳将要发送的数据
服务器接受连接请求:等待新的客户端连接请求的到来
客户端发送连接请求:等待服务器回送客户发起的SYN对应的ACK

4种网络IO模型

阻塞IO模型

在Linux中,默认所以的socket都是阻塞的。
在这里插入图片描述
阻塞需要彻底完成才返回用户空间。比如在调用send()的同时,线程处于阻塞状态,在此期间,线程无法执行任何运算或响应任何网络请求。
一个改进方案是在服务端使用多线程,目的是让每个连接都拥有独立的线程。accept就是
多线程的服务器模型似乎完美地解决了为多个客户机提供问答服务的要求,如果同时响应成百上千的连接请求,则多线程会严重占用系统资源,降低系统对外界响应的效率,线程本身也容易进入假死状态。
可以使用线程池连接池,线程池旨在降低创建和销毁线程的频率,使其维持一定数量的线程,并让空闲的线程重新承担新的执行任务。连接池维持连接的缓存池,尽量重用已有的连接,降低创建和关闭连接的频率。
但是现实生活中面了的可能是同时出现的上千甚至上万次的客户端请求,*线程池连接池**或许可能缓解部分压力,但是不能解决所有的问题。只是适用于小规模的服务请求。

非阻塞IO模型

在这里插入图片描述
发处read,内核还未准备好数据,那么它并不会block用户进程,立刻返回一个错误,从用户进程的角度将,它发起一个read,无需等待,立刻得到一个结果,当用户进程判断结果是错误时间,可以再次发read,一旦内核中数据准备好,那么就返回正确值
在非阻塞状态下,recv()接口调用后立刻返回,返回值不同代表不同的含义
返回大于0 表示接受完成
返回0表示连接正常的断开
返回-1,且errno等于EAGAIN,表示recv操作还没执行完成
返回-1,且errno不等于EAGIN,表示recv操作调用遇到系统错误errno/
服务器线程可以循环调用recv()接口,可以在单个线程内实现对所有连接的数据接受工作。但是循环调用recv()将大幅度占用CPU使用率

多路IO复用模型

也叫时间驱动IO,基本原理就是有个函数(如select)会不断地轮询所负责的所有socket。当某个socket有数据达到了,就通知用户进程。
在这里插入图片描述
select/epoll的优势不在于对于单个连接处理的更快,而在于能处理更多的连接。
在多路复用IO模型种,每一个socket,都被设置为非阻塞,整个用户的进程其实是被一直阻塞的。只不过进程是被select这个函数阻塞,而不是socket IO阻塞。
在这里插入图片描述

异步IO模型

用户进程发起read操作之后,立刻做其他事情,另一方面,从内核的角度,当它收到一个异步的read请求操作之后,首先会立刻返回,所以不会对用户进程造成任何阻塞。然后,内核会等待数据准备完成,然后将数据拷贝到用户内存种,当一列完成之后,内核会给用户进程一个信,返回read操作已完成的信息
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读