IO概念&5种IO模型介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/summy_J/article/details/74474902

ForeWord


本文介绍了IO概念和5种IO模型,希望能以最轻松的方式让大家理解这两个知识 ٩(๑>◡<๑)۶

1

开始啦。。。。。。。
~tips:全文阅读需3min~


Concept


IO叫做输入输出,我们可以将IO理解为两步:

  1. 等待IO事件就绪
  2. 数据就绪后进行真正意义上的IO(真正的数据搬迁)

所以,IO的过程一是等,然后才是输入输出。

进而,我们可以得到评价IO是否高效的标准:

       在IO过程中“等”的比重越小的性能越好,越大的性能越低。

666

IO中有两个重要的函数:read&write

他们也有两个功能:
1. 等
2. 获取/写数据

等就是不能读和写,也就是写/读条件不就绪,即发送/接收缓冲区没有被写满,所以读写事件是否就绪通常要与文件描述符相关。


5种IO模型


1. A Story

先给大家讲一个钓鱼的故事٩(๑>◡<๑)۶

扫描二维码关注公众号,回复: 3142972 查看本文章

2

~风和日丽的一天,张铁锤拿着鱼竿和小板凳,提着桶,来到小河边钓鱼。~

   他先给鱼竿上放好鱼饵,然后就坐在自己的小板凳上,眼睛一直瞪着鱼竿的尽头。等到鱼上钩后,自己收竿把鱼放在桶里。

不一会,李狗蛋也来了。

   他也和王铁锤一样,上好鱼饵之后就等鱼上钩。但他的做法是一边玩手机,一边瞄着鱼竿是否有动静,还不时的和王铁锤搭讪,但王铁锤并不理他,因为他在一动不动的盯着鱼竿,不能分心。

又过了一会,赵二毛也来凑热闹了,

   但他多拿了一样东西———铃铛,他把铃铛系在鱼竿上,然后坐在小板凳上,拿出了一本《C和指针》看起了书,这样铃铛一响就直接收竿。嗯,文化人就是不一样。

今天钓鱼的人真不少,刘翠花也过来了,

   但她放了个大招,直接拿了100多只鱼竿,全固定在岸边。这样几乎不用等,水池边全是她收竿的身影。不一会儿,就钓了好几桶鱼。

王老五看见这么多人钓鱼,顿时兴致也来了,但人家是老板,还有事要做。

   于是吩咐司机让他去钓鱼,钓到了鱼就打电话通知他。只能说,有钱人就是不一样。

好了,我们的故事就讲到这里。

其实,钓鱼的过程和IO非常类似,要先等鱼上钩,然后才真正开始钓鱼。所以,上边的5个人实际上就对应了5种IO模型。

2. 5种IO模型

用这种讲故事的方式来介绍5种IO模型还是太口语化了,还是让我们严肃一点吧 (。◕ˇ∀ˇ◕)

1. 阻塞IO

对于王铁锤,他一直看着鱼竿,自己等,自己钓,而且等的过程中不做其他的事。这就是阻塞IO:

     阻塞式等待IO事件,在等的过程中不能做其他事。

2. 非阻塞IO

对于李狗蛋,他也是自己等,自己钓。但他并不是一直盯着鱼竿,而是时刻检测钓鱼事件是否就绪,没有就做其他的事(玩手机、搭讪)。这就是非阻塞IO:

     非阻塞等待,不断检测IO事件是否就绪。没有就绪就可以做其他事。

3. 信号驱动IO

对于赵二毛,他将钓鱼事件是否就绪的信息转移到铃铛上,不用自己检测事件就绪,只需要将铃铛作为信号通知方式。这就是信号驱动IO:

     linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行并不阻塞,当IO时间就绪,进程收到SIGIO信号。然后处理IO事件。

4. IO复用/多路转接IO
对于刘翠花,她也是自己等,自己钓。但可以同时等待多个鱼上钩事件。这样她钓到鱼的概率就很大,等的时间短,效率明显比其他人高。这就是多路转接IO:

     linux用select/poll函数实现IO复用模型,这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操作。而且可以同时对多个读操作、写操作的IO函数进行检测。知道有数据可读或可写时,才真正调用IO操作函数

5. 异步IO
对于王老五(老板),他并没有经过等的过程,只需要发起事件(让司机钓鱼),然后享受结果。这就是异步IO:

     linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序。

3. 区别与联系

前4种模型都有等和IO两个阶段,并将数据从内核拷贝到调用者的缓冲区,自己等,自己进行数据搬迁。所以统称为同步IO。 与第5种异步IO相区分。

   注:这里同步/异步的概念与进程&线程中的概念不同,不同的背景下应该有不同的理解。

The End


本文通过一个小故事介绍了5种IO模型,希望能让大家更好的理解这几种IO模型的概念和区别。

告辞。。。

213

猜你喜欢

转载自blog.csdn.net/summy_J/article/details/74474902