典型IO模型(上)

什么是IO?

  • IO就是input和output
  • IO的过程:
    • 等待IO就绪,等待资源就绪(等待资源可用)

    recv(fd, buf, bufsize, 0)
    read(fd, buf, bufsize, 0)

  • 拷贝数据到缓冲区当中

五种IO模型:

    阻塞IO 非阻塞IO 信号驱动IO 多路转接IO 异步IO

阻塞IO:

  • 介绍: 在资源不可用的情况下,IO请求一直被阻塞, 直到资源可用

  • 例子: 当钓鱼的时候,将鱼钩甩入水中,眼睛一直看着鱼漂,直到鱼漂沉下去, 再将鱼拉上来,钓鱼完毕。
  • 特点: 
    • 调用阻塞IO的方式,阻塞等待的时长取决于内核
    • 在等待过程当中,程序与CPU的利用率是极低
    • 在IO等待就绪到拷贝数据之间,实时性是特别的高
    • 代码调用简单,容易编写

 非阻塞IO:

  • 在资源不可用的情况下,IO请求不会被阻塞,当发起一 次IO调用之后,调用直接返回, 返回资源不可用
  • 基于这种情况,因为非阻塞IO直接调用返回的特性, 导致了我们需要对调用结果进行判断,判断调用是否完成。直白的说,我们在调用非阻塞IO的时候, 需要搭配循环来使用,循环的目的是,防止调用没成功, 需要二次调用, 直到调用完毕

  • 例子: 钓鱼的时候,将鱼钩抛入水中,眼睛看一眼鱼漂,如果鱼漂没有动, 则刷一会抖音,在看一眼鱼漂,如此往复, 直到看到鱼漂动了,将鱼钓上来
  •  特点:
    • 相较于阻塞IO而言,CPU的利用率比阻塞IO要高
    • 非阻塞IO用于增加了循环,导致了非阻塞IO,代码复杂
    • 数据就绪和拷贝没有阻塞IO实时
    • 循环调用

  阻塞和非阻塞的概念: 
    只需要判断在资源不可用的条件下,发起IO调用:
      如果IO调用不返回,则为阻塞
      如果IO调用返回了,则为非阻塞。当前的IO调用并没有完成功能, 需要循环调用

 

信号驱动IO:

  • 在代码当中自定义一个信号(SIGIO-29)处理函数,当IO准备就绪之后, 进程就会收到SIGIO信号, 回调自定义注册的函数,在自定义注册的函数内部发起IO调用。

  • 例子: 钓鱼的时候,在鱼竿上绑一个铃铛,钓鱼人就可以忙其他事情了,当鱼竿上面的铃铛响起,说明有鱼中杆了,只需要将其拉起,完成钓鱼过程
  •  特点:
    • 代码更加复杂,牵扯到了信号
    • 相比较鱼非阻塞IO,IO准备就绪到拷贝数据之间更加实时了
    • 虽然加上信号逻辑之后,代码复杂了,但是我们不需要在代码当中在循环调用判断了

异步IO:

  • 自定义信号处理函数
  • 发起IO调用

  • 例子: 钓鱼的时候,将女朋友带着,让女朋友进行钓鱼,钓到鱼之后告诉我,我直接拿着鱼,进行使用

    同步和异步的概念:
      区分在多线程当中学习的同步,在多线程当中, 同步是保证临界资源访问合理性
      同步和异步的概念,只需要判断数据是谁拷贝完成的: 
        如果数据是用户自己拷贝完成的,则为同步
        如果数据为内核拷贝,则为异步
        异步的代码: aio_read, aio _write

结论:

  • 阻塞IO, 非阻塞IO, 信号驱动IO,数据拷贝工作都是程序自己完成
  • 异步IO, 数据拷贝工作由内核完成
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值