Linux IO模式和select,poll,epoll解释

一些概念:

虚拟空间:是进程所看到的所有地址组成的空间。虚拟空间某个进程对所有分配给它的所有物理地址的重新映射。

寻址返回与计算机的位数有关系。分为内核空间与用户空间。针对32位的Linux系统,最高的1G字节为内核空间。最低的3G字节为用户空间。

进程阻塞:这是进程自身的一种主动行为。当进程进入阻塞状态的时候,不占用CPU资源。

文件描述符fd:非负整数,是一个索引值。指向内核为每一个进程所维护的该进程的打开文件记录表。

缓存IO:大多数文件系统的默认IO都是缓存IO。过程是:数据先被拷贝到操作系统的内核缓冲区(页缓存 page cache)中,然后再拷贝到应用程序的地址空间。

举例:

当一个read操作发生时,会经历两个阶段:

1 等待数据准备(waiting for the data to be ready)

2 将数据从内核拷贝到进程中(copying the data from the kernel to the process)

LInux IO模式分为5种:

阻塞IO(blocking IO)

非阻塞IO(non-blocking IO)

IO多路复用(IO multiplexing)

信号驱动IO(signal driven IO) (不常用)

异步IO(asynchronous IO)

阻塞IO(blocking IO):

在Linux中,默认情况下,所有的socket都是blocking的。图示如下:

上面提到了两个阶段,再blocking IO里,两个阶段都被阻塞了

非阻塞IO(nonblocking IO)

图示如下:

nonblocking IO的特点是用户进程需要不断的主动询问kernel数据准备好了没有

IO多路复用(IO multiplexing)

也称为event driven IO,包括select,poll,epoll。单个进程可以同时处理多个网络连接的IO。

原理是select,poll,epoll会不断轮询所负责的socket,当socket有数据到达了,会通知用户进程

图示如下:

用户进程调用了select,整个进程会被block。同时kernel会监视所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候再调用read,将数据从kernel拷贝到用户进程

在这里,我们使用了select,recvfrom两个system call,相比较blocking IO的一个system call(recvfrom)效率更差,使用select的优势在于它可以同时处理多个connection,而不是对于单个连接处理的更快。

所以,当要处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟更大。

在IO multiplexing model里,对于每一个socket,一般都设置成non-blocking的。大多数情况下,整个用户的process被select函数所阻塞

异步IO(asynchronous IO)

异步IO的流程如下:

用户进程发起read之后立即返回,去做其他的事情。

kernel收到read之后,不会对用户进程产生任何block。而是等待数据准备完成,将数据拷贝到用户内存,然后给用户进程发送一个signal,告诉read操作完成了

总结:

blocking和non-blocking的区别

调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下立即返回

syschronous IO和asynchronous IO的区别

判断同步IO,异步IO的关键点在于在真实的IO操作里(比如recvfrom),进程有没有被阻塞。

在non-blocking中,如果kernel的数据没有准备好,这时候固然不会block进程。但是当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存里,这时候进程是被block的,所以non-blocking,blocking均是同步IO

而异步IO是当进程发起IO操作之后,立即返回,再也不理睬,知道收到kernel发送的IO完成的信号。在这个过程中,进程完全没有被block

同步异步的区分点在于:用户进程是怎样知道数据ok了的(自己主动check得知,还是接收到的signal得知);数据在kernel中准备完成之后,是谁负责拷贝数据到用户内存的(自己拷贝还是kernel负责拷贝的)

各个IO model的比较图:

本文从以下ref中整理而来:

ref: https://segmentfault.com/a/1190000003063859

原文地址:https://www.cnblogs.com/geeklove01/p/8979760.html

时间: 2024-11-10 07:32:50

Linux IO模式和select,poll,epoll解释的相关文章

文档-linux io模式及select,poll,epoll

文档-Linux IO模式详解 1. 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分

Linux IO模式及 select、poll、epoll详解

注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念: - 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32

Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池

[本文谢绝转载原文来自http://990487026.blog.51cto.com] Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select  poll  epoll udp组播 线程池 TCP 11种状态理解: 1,客户端正常发起关闭请求 2,客户端与服务端同时发起关闭请求 3,FIN_WAIT1直接转变TIME_WAIT 4,客户端接收来自服务器的关闭连接请求 多路IO转接服务器: select模型 poll模型 epoll模型 udp组播模型 线

IO复用之select poll epoll的总结

I/O复用使得程序能够同时监听多个文件描述符,对于提高程序性能至关重要.I/O复用不仅仅在网络程序中使用,但是我接触到的例子中,TCP网络编程那块使用I/O复用比较多,例如,TCP服务器同时处理监听socket和连接socket. 在了解I/O复用之前,我们需要先了解几个概念. 1,同步I/O与异步I/O 2,LT(水平触发)和ET(边缘触发) POSIX把两个术语定义如下: 同步I/O:导致请求进程阻塞,直到I/O操作完成 异步I/O:  不导致请求进程阻塞 阻塞是进程在等待某种资源,但是不能

(转)Linux IO模式及 select、poll、epoll详解

本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚

Linux IO模式及 select、poll、epoll详解(转载)

http://segmentfault.com/a/1190000003063859#articleHeader6   原文 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟

IO复用一select, poll, epoll用法说明

三种IO复用类型 Select系统调用 #include<sys/select.h> int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* execptfds,struct timeval* timeout); #nfds表示监听的文件描述符总数: #readfds,writefds,execptfds分别表示对应的fd_set类型的集合 可以如下定义:fd_set readfds,writefds,execptfds

Linux IO模式及 select、poll、epoll详解(转)

原文:https://segmentfault.com/a/1190000003063859 我只摘取了其中的epoll代码示例,服务端代码 #define IPADDRESS "127.0.0.1" #define PORT 8787 #define MAXSIZE 1024 #define LISTENQ 5 #define FDSIZE 1000 #define EPOLLEVENTS 100 listenfd = socket_bind(IPADDRESS,PORT); str

多路IO复用模型--select, poll, epoll

select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精力 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct tim