同步和异步I / O之间的区别

时间:2016-01-26 11:12:10

标签: operating-system

我一直在学习操作系统的内部结构,我对同步和异步I / O之间的基本区别感到困惑。
操作系统如何知道它是同步还是异步?

1 个答案:

答案 0 :(得分:10)

同步I / O意味着某些执行流程(例如进程或线程)正在等待操作完成。异步I / O意味着没有任何东西在等待操作完成,并且操作本身的完成会导致某些事情发生。

同步I / O - 启动I / O的某些执行工具(如进程或线程)也等待I / O完成(并且可能完成它)。当I / O完成时,同一个执行工具继续做其他事情,也许使用I / O的结果。

示例:

int i = read (file_handle, buffer, length);
if (i <= 0)
      return;
// handle results

这里,read操作开始从文件读取。调用read的同一线程在读操作完成时获取返回值,并可以处理结果。

异步I / O - 没有执行车辆等待I / O完成。当I / O完成时,无论执行车辆是否完成,I / O都可以安排以后的事情发生。

示例:

async_read (file_handle, buffer, length, completion_handler);
// do other stuff having nothing to do with the read

...

completion_handler(int count)
{
    if (count < 0)
         return;
    // handle results
}

这里,对async_read的调用启动了读操作。启动操作的线程可以继续完成其他操作。当操作完成时,实现调用completion_handler(可能由另一个线程)来获取操作的结果。

通常操作系统不必知道哪个是哪个。例如,您可以仅实现异步操作,并使完成处理程序取消阻止同步线程。通常,在引擎盖下,它们在操作完成时调用的一些代码看起来都是一样的,无论必须做什么。

你可以很容易地转向另一个。

如果您只有异步操作并且想要同步操作,只需调用异步操作,然后阻止完成处理程序解除阻塞的内容。

如果您只有同步操作并希望进行异步操作,只需创建一个新线程来调用同步操作,并让它在同步操作返回时调用完成处理程序。