本节讲解什么是非阻塞IO,如何将文件描述符修改为非阻塞式

3.6.1.1、阻塞与非阻塞

(1)阻塞是指函数调用会被阻塞。本质是当前进程调用了函数,进入内核里面去后,因为当前进程的执行条件不满足,内核无法里面完成操作,就挂起这个进程,去执行其他进程。默认使用阻塞IO
(2)非阻塞IO当条件不满足时直接停止当前操作,退出程序(?)。或者非阻塞IO条件不满足时会一直占用CPU资源
(3)结合程序状态转换图一起理解

3.6.1.2、为什么有阻塞式
(1)常见的阻塞:wait、pause、sleep等函数;read或write某些文件时
wait等待回收子进程:当子进程没死,父进程就不能回收子进程,内核就阻塞住父进程,知道子进程死去称为僵尸进程,这时内核就会发一个信号给父进程,父进程就会被唤醒,去回收子进程。

(2)阻塞式的好处
非常有利于OS的性能发挥。阻塞时不会占用CPU,CPU可以去执行其他。

3.6.1.3、非阻塞

(1)为什么要实现非阻塞
(2)如何实现非阻塞IO访问:O_NONBLOCK和fcntl

a -- 阻塞
阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程知道满足可操作的条件后再进行操作;被挂起的进程进入休眠状态(放弃CPU),被从调度器的运行队列移走,直到等待的条件被满足;
b -- 非阻塞
非阻塞的进程在不能进行设备操作时,并不挂起(继续占用CPU),它或者放弃,或者不停地查询,直到可以操作为止;
二者的区别可以看应用程序的调用是否立即返回!

  驱动程序通常需要提供这样的能力:当应用程序进行 read()、write() 等系统调用时,若设备的资源不能获取,而用户又希望以阻塞的方式访问设备,驱动程序应在设备驱动的xxx_read()、xxx_write() 等操作中将进程阻塞直到资源可以获取,此后,应用程序的 read()、write() 才返回,整个过程仍然进行了正确的设备 访问,用户并没感知到;若用户以非阻塞的方式访问设备文件,则当设备资源不可获取时,设备驱动的 xxx_read()、xxx_write() 等操作立刻返回, read()、write() 等系统调用也随即被返回。因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程,否则,进程就真的挂了。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。阻塞I/O通常由等待队列来实现,而非阻塞I/O由轮询来实现。

转载于:https://www.cnblogs.com/Ocean-Star/p/9245364.html

3.6.1.非阻塞IO相关推荐

  1. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

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

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

  3. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合

    上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型. 阻塞IO 过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd. 以简单的回射服务器为例,我 ...

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

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

  5. python3 异步 非阻塞 IO多路复用 select poll epoll 使用

    有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的. 下面记录下分别基于Select/Poll/Epoll的echo ser ...

  6. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念 我们通俗一点讲: Level_triggered(水平触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写.如果这次没有把数据一次性全部读写完( ...

  7. struct用法_精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

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

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

  9. IO模型之非阻塞IO

    1. IO模型非阻塞 IO Linux下,可以通过设置socket使其变为 non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用 ...

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

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

最新文章

  1. php 使用table方式导出excel文件
  2. 高斯消元法解方程matlab程序,用高斯消元法解线性方程组 的MATLAB程序
  3. 解决:阿里云ECS服务器 远程连接不上、极慢 (主机监控的实现)
  4. 分布式锁的几种实现方式~
  5. 关于分辨率和地图打印的一些问题
  6. 福一中招聘计算机教师,2017福建福州一中招聘拟聘公示
  7. sas数据集怎么导出_SAS数据集转Stata
  8. 怎么把一台手机的便签转移到另一台手机上?
  9. 高性能计算专业应用软件大观
  10. 物流设施布局方法——CRAFT
  11. 胡灵 c语言,清华作业们男女主角现身
  12. u盘在电脑读不出来,但别的可以读,别的u盘在我电脑又可以识别怎么回事?...
  13. Unity API通读 CustomEditor
  14. 关于单相变频电源及变频电路部分介绍
  15. android 摄像头画面竖,OpenCV for Android(5):竖屏摄像头旋转问题
  16. ONVIF系列笔记-设备发现机制
  17. 我的世界中国版服务器账号封了,我的世界免费永久服务器
  18. SQl 固定日期 年、月、日(加,减 1)
  19. 湫湫系列故事——减肥记I(HDU-4808)
  20. 01336软件项目管理考试大纲

热门文章

  1. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO
  2. linux强制用户改密码,如何在Linux中强制用户在下次登录时更改密码?
  3. php发邮箱验证码找回密码,织梦dede会员通过邮箱找回密码方法
  4. html5中音乐播放器怎么写,打造属于自己的音乐播放器 HTML5之audio标签
  5. linux 安装ftp下载,LINUX FTP安装与配置
  6. linux7系统如何配置网卡,Linux 7 配置网卡(nmcli)
  7. 玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...
  8. 洛谷P1014 [NOIP1999 普及组] Cantor 表
  9. 微博 Android 启动广告,使用Xposed去除微博国际版的启动广告
  10. mysql 5.6密钥_MySQL的密钥文件不正确