我一直在学习操作系统的内部结构,我对同步和异步I / O之间的基本区别感到困惑。
操作系统如何知道它是同步还是异步?
答案 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
(可能由另一个线程)来获取操作的结果。
通常操作系统不必知道哪个是哪个。例如,您可以仅实现异步操作,并使完成处理程序取消阻止同步线程。通常,在引擎盖下,它们在操作完成时调用的一些代码看起来都是一样的,无论必须做什么。
你可以很容易地转向另一个。
如果您只有异步操作并且想要同步操作,只需调用异步操作,然后阻止完成处理程序解除阻塞的内容。
如果您只有同步操作并希望进行异步操作,只需创建一个新线程来调用同步操作,并让它在同步操作返回时调用完成处理程序。