多路转接方案:select poll epoll 介绍和对比

打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表