1. IO模型
内存和外设的交互叫做IO,网络IO就是将数据在内存和网卡间拷贝。
IO本质就是等待和拷贝,一般等待耗时往往远高于拷贝耗时。所以提高IO效率就是尽可能减少等待时间的比重。
IO模型简单对比解释阻塞IO阻塞等待数据到来非阻塞IO轮询等待数据到来信号驱动信号递达时再来读取或写入数据多路转接让大批线程等待,自身读取数据异步通信让其他进程或线程进行等待和读取,自身获取结果1.1 阻塞IO
执行流在某个文件描述符下读取数据时,执行流一直等待IO条件就绪后读取数据,这就是阻塞IO。
1.2 非阻塞IO
执行流会以循环的方式反复尝试读取数据,如果IO条件未就绪,执行流会直接返回继续其他任务。
非阻塞读取方式
可通过fcntl设置文件的状态。
非阻塞读取时,数据未就绪是以出错的形式返回的,错误码为EAGIN或EWOULDBLOCK,信号导致读取未成功错误码为EINTR。
[code]void set_nonblock(int fd){ int fl = fcntl(fd, F_GETFL); if (fl < 0) { perror("fcntl failed"); return; } if (fcntl(fd, F_SETFL, fl | O_NONBLOCK) < 0) { perror("fcntl failed"); return; }}int main() { set_nonblock(0); char buf[64] = {0}; while (true) { ssize_t n = read(0, buf, sizeof(buf) - 1); if (n > 0) { buf[n - 1] = 0; std::cout |