Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34262
  • 博文数量: 7
  • 博客积分: 168
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-07 15:34
文章分类

全部博文(7)

文章存档

2012年(1)

2011年(6)

我的朋友

分类: 系统运维

2011-12-28 23:19:35

总感觉想明白了,总想写清楚,写出来感觉还是黏糊。
本帖主要参考了博客文章IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)》的内容,甚至截图也是,文字是我自己重新组织过的,大家可以对比着看,我是配角,呵呵。
同步和异步:
涉及对象:调用者、被调用者
差异点:
同步发起一个调用操作后在同一个线程中等待完成(阻塞);
异步启动独立线程完成被调用操作,提供回调接口在被调用操作执行完成后回调处理(非阻塞)
就上面的观点来看,同步和异步,应该是和阻塞与非阻塞相对应的,而且就其概念来讲也是很好理解的。那为什么当这些简单的概念碰到了IO,就晕菜了呢?
先来解释一下IO的概念,IO(Input/Output),是一组输入输出接口,可以是针对文件的,也可以是针对内存结构的如一个队列,还可以是针对网络套接字的(网络IO)。
之所以对IO大费周折是因为在现代编程中的挑战是处理网络上超大规模网络访问的压力,而这种压力最后往往都算到网络IO的头上,这是因为相比于计算和存储能力的快速演进,IO的发展似乎太迟钝了,往往行程为网络的瓶颈,所以下面主要针对网络IO进行讨论。
《圣经》上将网络IO操作分为阻塞IO、非阻塞IO、IO复用、信号驱动IO、异步IO,五种模型。
POSIX将IO只分成了同步IO、异步IO两种模型。
Why is it? and How to understand?(我可怜的英语啊,原谅我吧)
针对IO的操作,可以分成两个阶段,准备阶段和操作阶段。准备阶段是判断是否能够操作,是在内核进程完成的;操作阶段则执行实际的IO调用,是在用户进程完成的。
(一)POSIX只根据用户进程的逻辑划分,IO实际执行是同步阻塞的,就是同步IO,否则就是异步IO(异步机制是通过独立线程实现的)。
(二)圣经则把两个阶段都纳入管理了,按照POSIX的逻辑,五模型中的前四种都是同步IO,第五种属于异步IO,异步IO只有一种,不用分了,同步IO则根据第一阶段的逻辑不同来划分:
1、阻塞IO:在准备阶段即同步阻塞,等待数据到来后启动(见下图wait for data部分,下同);
2、非阻塞IO:准备阶段非阻塞,通过轮询判断是否可操作;
3、IO复用:多路IO共用一个同步阻塞接口,任意IO可操作都可激活IO操作,这是对阻塞IO的改进;
4、信号驱动IO:注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程,这应该算是一种异步机制;
以上四种模型在第一阶段即判断是否可操作阶段各不相同,但一旦数据可操作,则切换到同步阻塞模式下执行IO操作,所以都算是同步IO;
异步IO则是在第一阶段就指定一个回调函数,然后返回,由独立的线程执行判断IO数据可操作并实际将数据准备好(从内核进程复制到用户进程)以后通知调用线程处理。
哎,把一个心里想的事情说清楚还是比较费劲的,即使这样,也不知道是否真的说清楚了(至少我感觉,我把我自己说明白点了,呵呵)。
阅读(2999) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~