五种IO模型
什么是IO,read/write的时候是在IO,究竟做了什么?
①等,等IO事件就绪②数据拷贝,写入发送等操作实际不是这些系统调用做的,而是先将数据拷贝到缓冲区中,由系统来接手发送写入。
IO = 等 + 数据拷贝。
1.阻塞式IO
这里用五个钓鱼佬的故事来解释五种IO模型。
老赵喜欢钓鱼,一坐就是一整天,他亲历亲为,自己等鱼上钩(等待事件),自己在将鱼钓上来(数据拷贝)。
这是阻塞式IO,我们最常见的IO,阻塞式等待。
2.非阻塞式IO
老钱也喜欢钓鱼,他不像老赵干干等着,他看到没有鱼鳔没有上下浮动,就去做其他的事情,偶尔会来检查下是否有鱼上钩,当有鱼上钩了,他会将鱼钓上来。
这是非阻塞式IO,程序调用函数,该函数检查是否有事件就绪,没有就继续进行下一项任务,偶尔再来检查下是否就绪。非阻塞式轮询检测等待。
3.信号驱动式IO
老孙也喜欢钓鱼,他有个高科技,他的鱼鳔上有个报警器,他将鱼钩扔进河流就不再管了,去做自己的事情,直到报警器响起,他才来将鱼钓上来。
信号驱动式IO,当事件就绪,系统会向进程发送SIGIO的信号,进程会调用回调函数来处理IO。
4.多路复用IO
老李酷爱钓鱼并财大气粗精力十足,他一下子买了10个钓鱼用具,都将这些用具同时甩进了河流中,同时等待这10个鱼鳔的响应,哪个上下浮动就去处理将鱼钓上来。
多个事件都没有就绪,进程会被阻塞,轮询式检测事件,哪一个就绪就去处理哪一个。
前面4个都属于同步IO模型。
5.异步IO
老周也喜欢钓鱼,他是一个老板,自己事情很忙,他告诉手下,他想钓鱼,他的手下就去钓鱼,钓鱼的全过程老周都没有参与,但是收获了鱼。
在异步IO模型中,进程只需要告诉OS它要读取数据就立即返回,当数据就绪之后,OS会自动的将数据从内核空间拷贝到进程空间。
同步IO无论是多路复用还是信号驱动,最后都要亲力亲为的将数据从内核缓冲区拷贝到进程空间。而异步IO是直接获取结果,因为待数据就绪之后OS会自动拷贝数据。