IO

传统IO性能问题

IO操作分为磁盘IO操作和网络IO操作

  • 磁盘IO操作:磁盘中读取数据源,输入到内存;内存中的信息,持久化输出到磁盘
  • 网络IO操作:网络中读取信息输入到内存;内存中的信息输出到网络

多次内存复制

img

在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)