IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> linux五种IO模型 -> 正文阅读

[网络协议]linux五种IO模型

linux五种IO模型,包括同步模式(阻塞模式、非阻塞模式、多路复用模式、信号驱动模式)和异步模式
在Linux中,对于一次写入IO操作,是将数据拷贝到TCP内核缓冲区;对于一次读取IO的操作,通常包括两个不同阶段:
 (1)等待数据准备好,到达内核缓冲区;
 (2)从内核向进程复制数据。

参考:https://blog.csdn.net/z_ryan/article/details/80873449

1.阻塞式模型
阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
send:若TCP内核发送缓冲区已满,则阻塞等待;若未满,则拷贝数据到缓冲区,并立即返回。(数据实际是由内核协议从缓冲区发送到对端)
recv:若TCP内存接收缓冲区没有数据,则阻塞等待;若有数据,则拷贝缓冲区数据到进程空间并立即返回。

2.非阻塞模式
非阻塞调用是指无论是否可以发送成功,都立即返回。linux通过fcntl设置非阻塞模式。
send:无论TCP内核缓冲区是否已满都立即返回,返回值为实际写入缓冲区的数据长度,范围[0,实际传入数据长度]。
recv:无论TCP内核缓冲区是否有数据都立即返回,返回值为实际接收的数据长度,0表示未接收任何数据。


3.多路复用模式
一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。多路复用有select和recv两次系统调用,若同时监控的描述符不多,性能没有阻塞模式快。
select:单个进程可监视的fd数量被限制1024,描述符多时效率低。
poll:本质和select没有区别,没有fd数量限制。
epoll(epoll_ctl、epoll_wait):没有fd数量限制,效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。

4.信号驱动模式
信号驱动I/O并不常用,它是一种半异步的I/O模型。在使用信号驱动I/O时,当数据准备就绪后,内核通过发送一个 SIGIO 信号通知应用进程,应用进程就可以开始读取数据了。

5.异步模式
?

关于close说明:
1.客户端close
(1)发送缓冲区无数据直接发送FIN,发送缓冲区有数据等发送缓冲区发送完毕再发FIN;
(2)接收缓冲区无数据直接发送FIN,接收缓冲区有数据直接发送RST(对端不会返回ACK);
close完后同时关闭socket读写,客户端连接状态:
WAIT_1:发送FIN,等待服务端ACK(客户端调用close)
WAIT_2:接收ACK,等待服务端FIN
TIME_WAIT:接收FIN,等待固定时间(服务端调用close)(保证服务端可以收到FIN,所以一般不建议服务器主动close,容易产生大量CLOSE_WAIT)

2.服务端接收FIN/RST
(1)接收FIN(说明客户端发送缓冲区和接收缓冲区均没有数据,且服务端发送缓冲区也没数据),此时服务端只能调用recv(若再调用send发送数据,客户端会返回RST)
(2)接收RST,丢弃发送缓冲区数据,关闭socket写通道,保留接收缓冲区数据,可以继续调用recv。
服务端连接状态:
CLOSE_WAIT:接收FIN,回复ACK(客户端调用close)
LAST_ACK:发送FIN,等待ACK(服务端调用close)
CLOSED:接收ACK,连接关闭
?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:36:12  更:2021-07-15 16:38:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 12:57:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计