缓冲同步I / O和异步I / O有什么区别?

时间:2009-04-03 14:40:12

标签: operating-system io

当使用缓冲的fread等同步I / O时,读操作是 推迟和合并,我认为这不是同步完成的。

那么缓冲同步I / O和异步I / O有什么区别?

5 个答案:

答案 0 :(得分:3)

我对异步I / O的理解是,当通过某种类型的中断完成时会通知您,因此您可以在此时执行更多I / O.使用缓冲I / O,你可以忘记它,你再也听不到那个特定的I / O.

至少就是我们处理的巨大智能磁盘阵列的情况。

异步I / O的想法是你开始I / O并返回做其他事情。然后,当I / O完成后,您会收到通知并可以执行更多I / O - 换句话说,您不会等待它完成。

特别针对同步读取情况:您请求一些输入,然后在从设备读取时等待。在那里缓冲只需要阅读超过你需要的内容,所以它可以在下次阅读时使用,而无需去设备获取它。

异步读取,您只需启动该过程即可阅读,然后在其发生时继续执行其他操作。无论是通过轮询还是中断,您都会发现读取已完成且数据可供您使用。

对于写作,我不确定我能看到一个优于另一个的优势。缓冲同步写入几乎立即返回,除非缓冲区已满(这是异步写入可能有优势的唯一时间)。

答案 1 :(得分:1)

同步I / O在轮询的基础上工作:轮询,返回数据(如果可用 - 如果不可用,则:阻塞I / O,程序阻塞直到数据可用;对于非阻塞I / O,返回状态代码,表示没有数据可用,您可以重试)。

异步I / O在回调的基础上工作:传入一个回调函数,当数据可用时,它会被调用(来自不同的线程)。

答案 2 :(得分:0)

从编程的角度来看,同步IO将在相同的功能/过程中处理,例如。

var data0 = synchronousRead();
var data1 = synchronousRead();

而异步IO将由回调处理。

asynchronousRead(callBack1);
doOtherStuff();
...

function callBack1(data)
{
    data0 = data;
}

答案 3 :(得分:0)

同步IO是您调用例程的“正常”类型,当例程读入您的局部变量(忽略写入)时,控制流程会继续。

异步IO涉及设置缓冲区变量(静态,全局或其他长寿命/宽范围),并告诉系统您希望在最终可用时将数据放入其中。然后你的程序继续。当系统有数据时,它会向您发送某种信号/事件/消息,告诉您现在缓冲变量中有数据。

GUI程序通常使用异步IO来避免在IO完成时停止用户界面。

答案 4 :(得分:0)

看这里解释你想知道的一切。

link to wikipedia