聊聊IO
1、I/O:Input/Output
磁盘 IO:读写磁盘文件
网络 IO:读写 socket 文件
标准输入输出:读写控制台
2、阻塞 IO
应用进程发起 read() 请求之后,调用recvfrom()阻塞,直到数据进入数据接收队列。
数据准备好之后,从内核拷贝到应用进程,应用进程进行数据解析,整个过程应用进程是阻塞的
2次阻塞 一次是TCP连接,一次是读数据的时候
3、非阻塞 IO
应用进程发起 read() 请求,如果数据没有准备好,则立即返回一个返回值,应用进程收到之后,会不断发起 read() 请求,直到内核准备好数据,这个时候应用进程阻塞着,直到数据由内核拷贝到应用进程,应用进程进行数据解析。
可以调用 fcntl 将客户端连接套接字设置为非阻塞
fcntl(client_fd,F_SETFL,0_NONBLOCK);
总结:
BIO:去书店买书,没有我想要的书,我一直在书店等。
NIO:去书店买书,如果没有我想要的书,我走,隔一天再来买,直到有书了。轮询有一点就是浪费 CPU
第二种 NIO:买书的时候,提前给老板打电话,有这本书了,我再来买。多路复用
4、多路复用
IO 多路复用模型中,线程首先发起 select 请求,询问内核数据是否就绪了,等内核把数据准备好了,应用进程再发起 read 请求
Java 中的 NIO ,有一个选择器,也可以被称为多路复用器。通过它,只需要一个线程便可以管理多个客户端连接。
5、select、poll、epoll
select
poll
epoll