redis
IO模型都有哪几种(多路复用)?
I0多路复用:是利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。 ❒ 阶段一: ✔ 用户进程调用select,指定要监听的Socket集合内核监听对应的多个socket ✔ 任意一个或多个socket数据就绪则返回readable ✔ 此过程中用户进程阻塞 ❒ 阶段二: ✔ 用户进程找到就绪的socket依次调用recvfrom读取数据 ✔ 内核将数据拷贝到用户空间 ✔ 用户进程处理数据 ❒ I0多路复用是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待充分利用CPU资源。不过监听Socket的方式、通知的方式又有多种实现,常见的有: ✔ select ✔ poll ✔ epoll ❒ 三种多路复用的区别 ✔ select和poll只会通知用户进程有Socket就绪,但不确定具体是哪个Socket,需要用户进程逐个遍历Socket来确认 ✔ epoll则会在通知用户进程socket就绪的同时,把已就绪的Socket写入用户空间
✔ select/poll 内核检测数据,可以知道有没有数据到,有没有客户端进行连接,但是具体是哪一个还需要轮循遍历。 但是这个遍历不再是遍历read或者recv函数,而是另外的。效率较比之前是有所提升的。 ✔ epoll 内核检测,不仅能检测到是否有数据到,还能告诉你是那几个数据到了。在程序中只需要检测一次,实现多路复用为一路的。