Operating system 什么';缓冲同步I/O和异步I/O的区别是什么?

Operating system 什么';缓冲同步I/O和异步I/O的区别是什么?,operating-system,io,Operating System,Io,使用同步I/O(如缓冲的fread)时,读取操作是 推迟和合并,我认为这不是同步完成的 那么,缓冲同步I/O和异步I/O之间有什么区别呢?我对异步I/O的理解是,当异步I/O通过某种中断完成时,您会收到通知,这样您就可以在此时执行更多的I/O。有了缓冲I/O,您就完成了它,然后忘记了它,您再也听不到那个特定的I/O了 至少我们处理的巨大智能磁盘阵列就是这样 异步I/O的思想是,开始I/O,然后返回到做其他事情。然后,当I/O完成时,系统会通知您,您可以执行更多I/O—换句话说,您不必等待它完成

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


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

我对异步I/O的理解是,当异步I/O通过某种中断完成时,您会收到通知,这样您就可以在此时执行更多的I/O。有了缓冲I/O,您就完成了它,然后忘记了它,您再也听不到那个特定的I/O了

至少我们处理的巨大智能磁盘阵列就是这样

异步I/O的思想是,开始I/O,然后返回到做其他事情。然后,当I/O完成时,系统会通知您,您可以执行更多I/O—换句话说,您不必等待它完成

特别是对于同步读取情况:您请求一些输入,然后在从设备读取时等待。那里的缓冲只涉及读取超出您需要的内容,因此在下次读取时可以使用,而无需到设备获取

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


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

我对异步I/O的理解是,当异步I/O通过某种中断完成时,系统会通知您,这样您就可以在此时执行更多的I/O。有了缓冲I/O,您就完成了它,然后忘记了它,您再也听不到那个特定的I/O了

至少我们处理的巨大智能磁盘阵列就是这样

异步I/O的思想是,开始I/O,然后返回到做其他事情。然后,当I/O完成时,系统会通知您,您可以执行更多I/O—换句话说,您不必等待它完成

特别是对于同步读取情况:您请求一些输入,然后在从设备读取时等待。那里的缓冲只涉及读取超出您需要的内容,因此在下次读取时可以使用,而无需到设备获取

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


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

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

var data0 = synchronousRead();
var data1 = synchronousRead();
而异步IO将由回调处理

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

function callBack1(data)
{
    data0 = data;
}

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

var data0 = synchronousRead();
var data1 = synchronousRead();
而异步IO将由回调处理

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

function callBack1(data)
{
    data0 = data;
}
同步IO是一种“正常”类型,在这种情况下,您可以调用例程,当例程读入您的局部变量(忽略写入)时,控制流将继续

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

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

同步IO是一种“正常”类型,在这种情况下,调用例程,当例程读入本地变量(忽略写入)时,控制流将继续

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


异步IO通常由GUI程序使用,以避免在IO完成时暂停用户界面。

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


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

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


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

请看这里。您想知道的每件事都会得到解释


看这里。你想知道的每件事都有解释