博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
I/O模式总结
阅读量:4950 次
发布时间:2019-06-11

本文共 572 字,大约阅读时间需要 1 分钟。

进程读取数据时要经过两个阶段:

1.等待内核准备数据;

2.将内核缓冲区中的数据复制到进程缓冲区中。

一、阻塞IO

进程会阻塞在等待内核准备数据和数据从内核空间复制到用户空间这两个阶段。

二、非阻塞IO

进程读取数据时,如果内核数据还没有准备好,则会立即返回一个错误告诉进程数据还没准备好。所以程序必须不断轮询询问内核数据到底准备好了没。

当内核准备好数据后,此模式还是会阻塞在从内核复制数据到用户空间的过程中,所以此模式还是属于同步IO。

三、IO多路复用

监听多个IO对象,当对象上有事件发生时,通知进程。例如select,epoll。

以select为例,用户进程会阻塞在select调用上,等待有哪些socket变成可读状态(此阶段属于内核数据准备阶段,即等待网卡获取到数据)。

当有socket变为可读状态后,用户调用recvfrom,又会阻塞在复制内核数据到进程的过程中。

所以多路复用模式的优势不是比阻塞IO处理单连接更快,而是能够在单进程中处理更多的连接。

四、异步IO(上面三个均属于同步IO

用户调用异步读取后立即返回,然后可以去做其他工作,当内核数据准备好,并且将数据从内核空间复制到用户空间后会发出信号通知进程处理。

 

 

转载于:https://www.cnblogs.com/CLAYJJ/p/10184882.html

你可能感兴趣的文章
JS中this的详解及例子
查看>>
用Entity Framework 来创建MySql数据库和表结构
查看>>
TensorFlow随机值:tf.random_normal函数
查看>>
poj 1733 Parity game(种类并查集)
查看>>
SQL Server2008函数
查看>>
课堂随笔3月8日下午
查看>>
ORM之F查询和Q查询
查看>>
BIOS编程相关常用外设介绍
查看>>
springboot学习笔记:9.springboot+mybatis+通用mapper+多数据源
查看>>
NO 3 ,人生苦短,我学python之python 元祖tuple魔法
查看>>
Spring-Boot Banner
查看>>
876-链表的中间结点
查看>>
BZOJ 3781 莫队
查看>>
BZOJ 3674/BZOJ 3673 主席树
查看>>
JAVA的String类
查看>>
wtforms 简单使用
查看>>
flume介绍
查看>>
eclipse优化总结
查看>>
java异常处理
查看>>
【操作系统】主存空间的分配和回收
查看>>