马哥教育网络第20期—IO类型与IO模型

IO类型与IO模型

IO类型

同步与异步(synchronous,asynchronous):关注消息通知机制

同步:进程发出系统调用之后,不会立即有返回信息,但是一旦有返回信息,则一定是最终结果.
异步:进程发出系统调用之后,会有立即返回结果,但不是最终的结果,当内核处理完成之后,内核通过通知机制通知进程,该系统调用已完成.

阻塞与非阻塞(blocking,nonblocking):关注系统调用完成时,调用者的状态

阻塞:调用者在返回结果之前,一直处于被挂起状态,直到有调用结果返回时才能继续工作.
非阻塞:调用者在调用结果返回之前,并不会被挂起,即系统调用这个动作不会阻塞调用者.

IO模型的分类

  • 阻塞I/O

  • 非阻塞I/O

  • 复用I/O

  • 事件驱动I/O

  • 异步I/O

自己画的

37.png

画完之后参考网上的

42.png

阻塞I/O模型

38.png

 当用户进程发起系统调用之后,在内核还没有完成该调用任务时,进程会一直被挂起,直到内核将调用完成(内核将数据从磁盘取出到内核内存做处理,处理完之后在将数据转移至进程内存),这时进程才可以继续工作.

非阻塞I/O模型

39.png

 当用户进程发起系统调用之后,该进程不会被挂起,先是处于盲等待状态,反复向内核确认该调用是否完成,当内核将数据从磁盘取出到内核内存处理完成时,该进程会被挂起,并且内核会将处理的数据转移至进程内存,这时进程来能继续工作(该进程在数据从内核内存转移至进程内存时,是被挂起).

复用I/O模型

40.png

 当用户进程发起系统调用之后,该进程可以发送多个处理请求交给内核处理,select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间.

事件驱动I/O模型

 当用户进程发起系统调用之后,内核会立即返回一个信号,表示该调用已经收到,接下来该进程可以去处理其他工作,当内核将数据在内核内存中准备好之后,就会通知该进程,进程这个时候就会被挂起,等待内核将数据转移至进程内存,进程才可以继续工作.

异步I/O模型

41.png

 当用户进程发起系统调用之后,内核会立即返回一个信号,表示该调用已经收到,进程可以自由活动,接下来内核处理数据,当内核将数据转移至进程内存之后,会通知该进程数据已经准备好,此时进程只要去进程内存接着处理就OK.

原创文章,作者:nice_neo_linux,如若转载,请注明出处:http://www.178linux.com/19860

赞 (1)
nice_neo_linuxnice_neo_linux
上一篇 2016-06-26 22:40
下一篇 2016-06-26 22:41

相关推荐

  • ​ 基于Sentinel实现redis主从自动切换

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具,它可以实现对redis的监控、通知、自动故障转移。 Sentinel作用: Master状态检测 当被监控的某个 Redis Master异常无法连接时 Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知,并且进行Master-Slave切换,将其中一…

    Linux干货 2016-02-14
  • 8.1作业

    创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为“Gentoo Distribution” [root@localhost wang]# useradd -G bin,root -s /bin/csh -c "Gentoo&n…

    Linux干货 2016-08-02
  • 超级用户切换普通用户后如何重置root密码

    今天在使用su命令切换root用户和普通用户使用中不小心改了root密码,在普通用户条件下怎么也切换不到root用户,于是通过搜索和尝试终于改了root密码,现以centos7为例总结如下: 1、首先进入开启菜单,按下e键进入编辑模式,找到ro那一行,将ro改为rw,在语言后面加上init=/bin/sh 2、根据提示按下ctrl-x键(注意选中x) 3、尝…

    Linux干货 2017-03-27
  • N25-第三周作业

    1.列出当前系统所有已经登录的用户的用户名,注意同一个用户登录多次,只显示一次即可   who | cut -d" " -f1 |uniq 2.取出最后登录到当前系统的用户的相关信息    w | tail -1 3.取出当前系统上被用户当做其默认shell最多的那个shell &nbsp…

    Linux干货 2016-12-19
  • python基础_1

    变量/常量 常量:一旦赋值,就不能对它从新复制。python不存在常量 字面常量:一个单独出现的量,未赋值给任何变量或者常量 变量:就是一个名字,在固执符号的左边,这个名字可以指复制符号右边的内容。 变量列子: i = 3 print(i)  注:python 是强类型语言,是动态类型语言。(强类型指类型之间不能相互计算/动态类型是指变量是可以赋值…

    Linux干货 2017-10-10
  • day6作业

    1、创建用户gentoo,附加组为bin和root,默认shell为 /bin/csh,注释信息为"Gentoo Distribution"     2、创建下面的用户、组和组成员关系 名字为admins 的组 用户natasha,使用admins …

    系统运维 2016-08-08