之前参考了这篇文章,下面写一写笔记

阻塞IO 非阻塞IO

1.blocking IO

linux中默认的socket都是阻塞的

用户进程发出系统调用后,数据未准备好,进程阻塞。。之后内核中有两个阶段:准备数据,复制数据到用户空间,数据在复制好了之后,内核将会唤醒该进程

特点:在数据准备与数据拷贝两个阶段进程都是阻塞的

2.non blocking IO

linux下,可以通过设置socket使其变为non-blocking

当用户发出系统调用后,如果数据没准备好,用户进程并不会被立即阻塞,而是返回一个错误。用户进程判断结果是一个error后,会再次发送read操作,一旦kernel中的数据准备好了,并且再次接收到了用户进程的系统调用后,那么用户进程直到知道数据拷贝完成。

特点:在数据准备的时候不阻塞,而是轮询。。

3.IO multiplexing

在数据准备阶段,如果数据没有准备好,用户进程被阻塞,但是可以通过调用select/epoll监听socket.当任何一个socket中的数据准备好了,select将会返回并唤醒用户进程。

与blocking IO的区别:blocking I/O只有一个一个系统调用,但是这个有两个。。同时一个select函数能处理多个连接,同时监视多个socket.

这个时候,socket是被设置为非阻塞的

4.signal driven IO

利用sigaction捕获SIGIO信号,内核在数据到达的时候发送SIGIO信号,应用进程在收到之后在信号处理程序中调用

recvfrom从内核中获取数据

5.Asynchronus IO

用的极少

用户进程发出一个read后,啥都不用管就可以直接走了。。 数据的准备与拷贝全部是内核负责的,当完成后,kernel发送给用户一个signal,之后可以通过回调函数等机制处理数据

同步IO 异步IO

其实,blocking IO , non blocking IO, IO multiplexing都属于同步IO ,为什么呢?

Stevens给出的定义(其实是POSIX的定义)是这样子的:
    A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;
    An asynchronous I/O operation does not cause the requesting process to be blocked; 
两者的区别在于在执行recvfrom这个系统调用的过程中,时候用户进程是否是阻塞的。。。

select、poll、epoll

1.select的问题:

单个进程能够监视的文件描述符的数量存在最大限制。。linux上默认是最大为1024

对socket的扫描是采用线性扫描,需要维护一个存放文件描述符的数据结构

每次调用select,都需要把文件描述符从用户态拷贝到内核态,开销比较大

2.poll相对于select的改进

利用链表存储文件描述符。。没有最大限制

支持水平触发,支持再次提交已经上次遍历已经就绪但是用户进程未处理的文件描述符

但是和select一样,大量的fd数组要被拷贝进内核态

3.epoll

epoll有EPOLLLTEPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。LT模式下,只要这个fd还有数据没读完,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN错误。

还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

epoll的优点:

1.每个fd在复制的过程中只拷贝一次

2.epoll为每个fd指定一个回调函数,当设备就绪唤醒等待队列上的消费者时,会调用这个回调函数

3.epoll所支持的文件描述符的上限是最大的可打开文件的数目,这个数目和系统内存有关

为什么要有EPOLLET

边沿触发把如何处理数据的控制权完全交给了开发者,提供了巨大的灵活性。比如,读取一个http的请求,开发者可以决定只读取http中的headers数据就停下来,然后根据业务逻辑判断是否要继续读(比如需要调用另外一个服务来决定是否继续读)。而不是次次被socket尚有数据的状态烦扰;写入数据时也是如此。比如希望将一个资源A写入到socket。当socket的buffer充足时,epoll_wait会返回这个fd是准备好的。但是资源A此时不一定准备好。如果使用水平触发,每次经过epoll_wait也总会被打扰。在边沿触发下,开发者有机会更精细的定制这里的控制逻辑。

但不好的一面时,边沿触发也大大的提高了编程的难度。一不留神,可能就会miss掉处理部分socket数据的机会。如果没有很好的根据EAGAIN来“重置”一个fd,就会造成此fd永远没有新事件产生,进而导致饿死相关的处理代码。

关于阻塞I/O 非阻塞I/O 同步I/O 异步I/O epoll select的学习相关推荐

  1. 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO

    IO分两阶段: 1.数据准备阶段:在该阶段,根据是否等待数据准备,将IO分成阻塞和非阻塞: 2.内核空间复制回用户进程缓冲区阶段:在该阶段,只要程序需要等待复制完成,才能往下运行(尽管这个时间很短), ...

  2. Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结

    同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理. 异步模式 由触发机制来通知处理消息者 我去银行办 ...

  3. 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型

    1.Redis 阻塞IO 与非阻塞IO Java在JDK1.4 中引入了NIO ,但是也有很多人在使用阻塞IO,这两种IO有什么区别? 在阻塞模式下,如果你从数据流读取不到指定大小的数据量,IO就会阻 ...

  4. 通过举例谈谈阻塞赋值与非阻塞赋值的区别

    这篇博客,通过举例说明:非阻塞赋值和阻塞赋值的区别? 一般非阻塞赋值用于时序逻辑,而阻塞赋值用于组合逻辑: 非阻塞赋值语句是并行执行的,等到一个时钟完成后才完成赋值,而阻塞赋值是顺序执行的,下一条赋值 ...

  5. 嵌入式驱动之阻塞操作、非阻塞操作

    阻塞 阻塞操作     是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作. 被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足. 非阻塞操作   进 ...

  6. 查询框赋值后不可编辑_【技巧分享】阻塞赋值与非阻塞赋值

    原创 小黑同学 明德扬FPGA科教 关于阻塞赋值和非阻塞赋值的问题,明德扬的学员提得比较多,今天小黑老师专门给大家普及一下阻塞赋值和非阻塞赋值的相关知识. 一.概述 1.阻塞赋值对应的电路往往与触发沿 ...

  7. 网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用

    今天学习了网络传输中的两个阶段.阻塞IO.非阻塞IO和多路复用 一.网络传输中的两个阶段 分别是 waitdata 和 copydata send就是copydata recv是waitdata和co ...

  8. 深入理解阻塞socket和非阻塞socket

    什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件或设备的两种工作方式. 阻塞的意思是指,当试图对该文件描述符进行 ...

  9. 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...

最新文章

  1. python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...
  2. 【自动驾驶】5. ROS和DDS的区别总结
  3. JVM:内存划分总结
  4. Black Hat|英特尔CPU设计漏洞为恶意软件打开后门
  5. Android:CheckBox控件
  6. 在jsx中绑定js表达式以及jsx注释
  7. x390更换开机_ThinkPad X390怎么装win10系统|ThinkPad X390用u盘重装win10系统教程-系统城...
  8. SQL9 查找除复旦大学的用户信息(数据库否定语句写法)
  9. no.7_qzhai 开心版_开心宝贝GM版下载-开心宝贝GM版安卓下载
  10. hdu-acm steps 命运
  11. [转载]linux+nginx+python+mysql安装文档
  12. 什么是Complement(补码)?(转)
  13. 自己学java需要多久_自学 java, 学多久可以自己找到工作?
  14. Google Earth影像数据破解之旅
  15. 【EMI测试】如何选择近场电磁干扰故障诊断的测试设备/探头
  16. 28岁华为员工工资表曝光,牛逼的人注定会牛逼
  17. mysql 代理 mycat_使用MyCAT代理MySQL数据库
  18. java循环满足跳出_java,break语句,无论是否满足条件,都会跳出for循环?
  19. 15.7数据库(7):MySQL创建校园数据库
  20. “智慧之城”如何构建数据根基,打造数据治理新样本-亿信华辰

热门文章

  1. WorkFlow设计篇Step.2—传参的用法-订单金额的处理(续)-WF4.0
  2. 利用正则表达式去除所有html标签,只保留文字
  3. Android 多线程及线程通信
  4. 03 在百度地图上定位到指定位置
  5. 6425C-Lab2 安全高效地管理AD
  6. 防水+四扬声器诺基亚X7细节
  7. 《Asp.Net 2.0 揭秘》读书笔记(八)
  8. linux c fopen open 互相转换 文件指针 到 文件描述符 FILE* 转 FD
  9. linux shell mkpasswd 生成随机密码
  10. java struts2 安全漏洞 devMode 简介