Linux的五种IO模型

关于同步、异步与阻塞、非阻塞的理解 - Rabbit_Dale - 博客园1、前言 前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步、异步属于两个进程中间的协作关系,例如使用浏览器访问一个网https://www.cnblogs.com/Anker/p/5965654.html简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别 - 大数据从业者FelixZh - 博客园POSIX 同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。https://www.cnblogs.com/felixzh/p/10345929.html


×操作系统中的IO 简述

IO (Input/Output,输入/输出)即:×× 数据的读取(接收)或写入(发送)操作 ××

通常用户进程中的一个完整IO分为两阶段:

1.用户进程空间<–>内核空间

2.内核空间<–>设备空间(磁盘、网络等)

IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。

LINUX中进程无法直接操作I/O设备,其必须通过系统调用请求kernel来协助完成I/O动作;内核会为每个I/O设备维护一个缓冲区。

对于一个输入(读取到内存 比如读取数据到我们程序malloc的buffer中)操作来说,进程IO系统调用后,内核会先看缓冲区中有没有相应的缓存数据,没有的话再到设备中读取,因为设备IO一般速度较慢,需要等待;内核缓冲区有数据则直接复制到进程空间。

所以,对于一个网络输入(读取网络资源)的操作,通常包括两个部分

  1. 等待网络数据到达网卡 --> 读取到内核空间         (这个过程就是准备数据)
  2. 从内核缓冲区复制数据到进程空间
  3. 然后具体的用户函数,把结果返回。

 IO 操作发生时一般涉及两个对象,一个是调用这个IO的 进程 (or 线程) ,另一个就是系统内核 (kernel)

×IO执行的两个阶段

 在Linux中,对于一次读取IO的操作,数据并不会被直接拷贝到程序的程序缓冲区。

通常包括两个不同阶段:
 (1)等待数据准备好,到达内核缓冲区;
 (2)内核向进程复制数据。


  对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所有等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用程序缓冲区。

举个例子:就以TCP传输为例子。

1.第一个阶段就是等待客户端的数据通过网络到达服务端的内核tcp接收缓冲区

2.第二个阶段就是我们应用程序调用read读取内核tcp接收缓冲区的数据

我们区分阻塞式IO和非阻塞式IO就是通过IO的执行的两个阶段是否阻塞来区分的


为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。

同步


  所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,调用者会轮询查看结果。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。

异步


  异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。比如:调用aio_read系统调用时,不必等IO操作完成就直接返回,调用结果通过信号来通知调用者。

  阻塞与非阻塞与等待消息通知时的状态有关。

阻塞 


  阻塞

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值