当前位置: 首页 > Linux

LinuxI-O模型

时间:2023-04-06 04:45:27 Linux

1.I/O模型对比2.理解阻塞I/O和非阻塞I/O  socket在创建时默认是阻塞的,也可以设置为非-通过命令阻止。阻塞和非阻塞的概念适用于所有文件描述符,而不仅仅是套接字。我们称阻塞文件描述符为阻塞I/O,非阻塞文件描述符为非阻塞I/O。1.阻塞I/O  为阻塞I/O执行的系统调用可能会因为无法立即完成而被操作系统挂起,直到等待的事件发生。例如,当tcp客户端通过connect向服务器发起连接时,connect会先向服务器发送同步报文段,然后等待服务器返回确认报文段。如果服务器的确认段没有立即到达客户端,连接调用将被挂起,直到客户端收到确认段并唤醒连接调用。在socket的基础API中,可能被阻塞的系统调用包括accept、send、recv和connect。2.非阻塞I/O  为非阻塞I/O执行的系统调用总是立即返回,不管事件是否发生。如果事件没有立即发生,则系统调用返回-1,就像发生错误一样。此时我们就要根据errno来区分这两种情况。对于accept、send、recv,当事件没有发生时,errno通常设置为EAGAIN(意思是“再次”)或EWOULDBLOCK(意思是“期望块”);对于连接,errno设置为EINROGRESS(意思是“正在处理”)。  很明显,只有在事件已经发生的情况下,才能通过操作非阻塞I/O(读、写等)来提高程序的效率。因此,非阻塞I/O通常与其他I/O通知机制结合使用,例如I/O多路复用和SIGIO信号。三、理解I/O多路复用机制和SIGIO信号机制1、I/O多路复用  I/O多路复用是最常用的I/O通知机制。意思是应用程序通过I/O多路复用函数向内核注册一组事件,内核通过I/O多路复用函数通知应用程序准备好的事件。Linux上常用的I/O多路复用函数有select、poll和epoll_wait。需要指出的是,I/O多路复用函数本身是阻塞的,之所以能够提高程序效率,是因为它们具有同时监听多个I/O事件的能力。2.SIGIO信号  SIGIO信号也可以用来上报I/O事件。我们可以为一个目标文件描述符指定一个宿主进程,那么指定的宿主进程就会捕获SIGIO信号。这样,当目标文件描述符发生事件时,就会触发SIGIO信号的信号处理函数,我们可以在信号处理函数中对目标文件描述符进行非阻塞I/O操作。4、理解同步I/O和异步I/O  阻塞式I/O、I/O多路复用和信号驱动I/O都是同步I/O模型。因为在这三种I/O模型中,I/O的读写操作都是在I/O事件发生后由应用程序完成的。POSIX规范定义的异步模型是不同的。对于异步I/O,用户可以直接对I/O进行读写操作。这些操作告诉内核用户在何处读写缓冲区,以及内核在I/O操作完成后如何通知应用程序。即同步I/O模型需要用户代码进行I/O操作(从内核缓冲区读取数据到用户缓冲区,或者将数据从用户缓冲区写入内核缓冲区),而异步I/O机制用于内核执行I/O操作(内核缓冲区和用户缓冲区之间的数据移动由内核“在后台”完成)。你可以这样想,同步I/O通知应用程序一个I/O就绪事件,而异步I/O通知应用程序一个I/O完成事件。

猜你喜欢