传统IO性能问题
IO操作分为磁盘IO操作和网络IO操作
- 磁盘IO操作:磁盘中读取数据源,输入到内存;内存中的信息,持久化输出到磁盘
- 网络IO操作:网络中读取信息输入到内存;内存中的信息输出到网络
多次内存复制
在IO过程中,数据先从外部设备复制到内核空间,再从内核空间复制到用户空间,发生了两次内存复制操作。这种操作会导致不必要的数据拷贝和上下文切换,从而降低IO性能
阻塞IO
进程会一直阻塞,直到数据拷贝完成。这是Linux系统默认的操作模式,也是最常见的IO操作模式
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void* buf, size_t len, int flags);
(一个阻塞的recv函数)
非阻塞IO
如果数据没有到来,立马返回,不用等待数据了,但非阻塞模式的使用并不普遍,因为非阻塞会浪费大量的CPU资源
fcntl(sock)