您的位置:首页 > 其它

同步异步和阻塞非阻塞

2017-02-21 14:23 211 查看
看了很多文章,知乎/博客等等

现总结如下:

IO操作:
1.等待数据准备好。
2.从内核到进程拷贝数据。
同步IO和异步IO:
1.同步IO导致请求进程阻塞,直到IO操作完成。
2.异步IO不导致请求进程阻塞。

IO多路复用(又叫事件驱动,select,poll,epoll)有阻塞和非阻塞状态,在处理IO时,阻塞和非阻塞都是同步IO

异步IO要使用特殊的函数:Linux下是AIO windows下是IOCP

eg:

异步的特性有:主动通知用户,或者调用提前注册号的回调函数处理. 而不需要轮询.

忙等待 vs 忙等待:

// 阻塞等待,阻塞期间不占用cpu

sem_wait(&sem);

// 忙等待,虽然也是在等待信号,但是一直占用cpu

while(1) {

    if (sem_trywait(&sem) == 0) 

        break;

    else if (errno != EAGAIN) {

        perror("trywait error");

        break;

    }

}

如果在open一个设备时指定了O_NONBLOCK标志,read/write就不会阻塞。

以read为例,如果设备暂时没有数据可读就返回-1,

同时置errno为EWOULDBLOCK(或者EAGAIN,这两个宏定义的值相同),表示本来应该阻塞在这里(would block,虚拟语气),

事实上并没有阻塞而是直接返回错误,调用者应该试着再读一次(again)。

这种行为方式称为轮询(Poll),调用者只是查询一下,而不是阻塞在这里死等,

EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写 

EINTR:指操作被中断唤醒,需要重新读/写  ---老王
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: