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

4 operating-system

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

Dav*_*rtz 13

同步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
Run Code Online (Sandbox Code Playgroud)

这里,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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果只有异步操作并希望进行同步操作,则只需调用异步操作,然后阻塞完成处理程序未阻塞的内容.

如果您只有同步操作并且想要一个异步操作,只需创建一个新线程来调用同步操作,并让它在同步操作返回时调用完成处理程序.