同步异步和阻塞非阻塞
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:指操作被中断唤醒,需要重新读/写 ---老王
现总结如下:
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:指操作被中断唤醒,需要重新读/写 ---老王
相关文章推荐
- socket阻塞与非阻塞,同步与异步、I/O模型
- 聊聊同步、异步、阻塞与非阻塞
- 同步、异步、阻塞和非阻塞
- 同步、异步、阻塞、费阻塞
- 【网络编程】(二)同步和异步,阻塞和非阻塞,多路复用技术
- socket阻塞与非阻塞,同步与异步、I/O模型
- IO - 同步,异步,阻塞,非阻塞
- 并发 并行 同步 异步 多线程 阻塞 非阻塞的区别
- python之多进程和多线程以及同步异步阻塞
- 同步、异步、阻塞和非阻塞
- 阻塞非阻塞 同步和异步
- 怎样理解阻塞非阻塞与同步异步的区别
- 同步、异步、阻塞、非阻塞
- socket 同步、异步、阻塞和非阻塞
- 同步异步和阻塞2-测试小项目
- 同步异步和阻塞非阻塞
- IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) .
- Windows I/O模型、同步/异步、阻塞/非阻塞
- 同步 异步 阻塞 非阻塞的区别
- 转:IO模型-- 同步和阻塞,异步和非阻塞的区别