我一直在学习操作系统的内部结构,我对同步和异步 I/O 之间的基本区别是什么感到困惑。
操作系统如何知道它是同步的还是异步的?
最佳答案
同步 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
(可能由另一个线程)获取操作的结果。通常操作系统不必知道哪个是哪个。例如,您可以只实现异步操作并让完成处理程序解除对同步线程的阻塞。通常,在引擎盖的深处,它们看起来都是一样的,在操作完成时调用一些代码来完成任何必须做的事情。
您可以轻松地将其中一个变成另一个。
如果您只有异步操作并且想要同步操作,只需调用异步操作,然后阻塞完成处理程序未阻塞的内容。
如果您只有同步操作并且想要异步操作,只需创建一个新线程来调用同步操作并让它在同步操作返回时调用完成处理程序。
关于operating-system - 同步和异步 I/O 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35012494/