(BAT必会知识)Linux网络编程中五种IO模型讲解

IO操作分两步:发起IO请求等待数据准备,实际IO操作(洗衣服,晾衣服)

同步需要主动读写数据,在读写数据的过程中还是会堵塞(好比晾衣服堵塞了你)

异步仅仅需要I/O操作完毕的通知。并不主动读写数据,由操作系统内核完毕数据的读写(机器人帮你晾衣服)

五种IO的模型:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO和异步IO

前四种都是同步IO,因为在内核数据copy到用户空间时都是阻塞的

权威:RFC标准或数据《UNIX Network Programming》中文《UNIX网络编程-卷-》第六章 推荐去看

1.阻塞IO

等待数据准备到数据数据 都是阻塞的 什么都干不了 干等着

在这里插入图片描述

2.非阻塞IO

取数据过程中 内核告诉你没准备好 过一会你又来看 内核告诉你还没准备 但这个过程你可以去干别的,但需要时不时去检查 当内核准备好数据拷贝后返回 但实际拷贝数据这个过程中也是阻塞的 所以是同步IO

在这里插入图片描述

3.IO多路复用

一个线程处理多个连接

线程会监听多个请求,会轮询,哪个好了就操作哪个,但在拷贝数据时也是阻塞的 属于同步IO

比上面好的优点是:特别多线程可以处理更多连接

I/O多路复用是阻塞在select,epoll这样的系统调用,没有阻塞在真正的I/O系统调用如recvfrom
            进程受阻于select,等待可能多个套接口中的任一个变为可读
    
            IO多路复用使用两个系统调用(select和recvfrom)
            blocking IO只调用了一个系统调用(recvfrom)
            select/epoll 核心是可以同时处理多个connection,而不是更快,所以连接数不高的话,性能不一定比多线程+阻塞IO好
            多路复用模型中,每一个socket,设置为non-blocking,
            阻塞是被select这

在这里插入图片描述

4.信号驱动IO

很少很少用到!

在这里插入图片描述

5.异步I/O(POSIX的aio_系列函数)

Future-Listener机制

你是一个进程或线程 由其它模块帮你去完成 你不能卡住

好比你是个大哥,你有点事告诉小弟去办 这个期间你去忙别的 小弟完成后告诉你完成了

1.进程调用 直接返回 主进程去干其它事情

2.内核主动去复制到用户空间 指定信号

在这里插入图片描述

总结

1.IO操作分为两步 第一步发起IO请求,等待数据准备 这里是阻塞IO和非阻塞IO的区别
第二步实际的IO操作,将数据从内核拷贝到进程中,这里是同步IO和异步IO的区别

2.前四种IO模型都是同步IO,区别在于第一阶段,而他们的第二阶段都是相同的,数据从内核copy到应用缓冲区期间都是阻塞的,进程阻塞于recvfrom调用或者select()函数,相反,异步I/O模型在这两个阶段都要处理

3.阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞知道完成那么就是传统的阻塞IO,如果不阻塞。那么就是非阻塞IO

4.同步IO和异步IO的区别在于第二步是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、多路复用IO、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你完成IO操作再将结果返回给你,那么就是异步IO

重点

几个核心点:
   阻塞非阻塞说的是线程的状态(重要)
   同步和异步说的是消息的通知机制(重要)
   
   同步需要主动读写数据,异步是不需要主动读写数据
   同步IO和异步IO是针对用户应用程序和内核的交互

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113746926