“阻止系统调用”是什么意思?

“阻止系统调用”是什么意思?

在我的操作系统课程中,我们正在研究multithreading编程。 我不确定当我在我的教科书中阅读时它是什么意思“它可以允许另一个线程在线程进行阻塞系统调用时运行”

阻塞系统调用是必须等到可以完成操作的调用。 read()将是一个很好的例子 – 如果没有输入准备好,它将坐在那里等待一些(如果你没有将它设置为非阻塞,当然,在这种情况下它不会是阻止系统调用)。 显然,当一个线程正在等待阻塞系统调用时,另一个线程可能正在做其他事情。

对于阻塞系统调用,调用程序在系统调用返回之前无法执行任何操作。 如果系统调用可能很长(例如涉及文件IO或网络IO),这可能是一件坏事(例如,想象一个沮丧的用户在没有响应的应用程序中敲击“取消”按钮,因为该线程被阻塞等待来自未到达的网络的数据包)。 要解决这个问题(在等待阻塞系统调用返回时执行有用的工作),您可以使用线程 – 当一个线程被阻塞时,其他线程可以继续执行有用的工作。

另一种方法是非阻塞系统调用。 在这种情况下,系统调用立即返回(几乎)。 对于冗长的系统调用,系统调用的结果要么稍后发送给调用者(例如,作为某种事件或消息或信号),要么稍后由调用者轮询。 这允许您让一个线程等待许多不同的冗长系统调用同时完成; 并避免线程的麻烦(以及锁定,竞争条件,线程开关的开销等)。 但是,它也增加了获取和处理系统调用结果所带来的麻烦。

(几乎总是)可以在阻塞系统调用周围编写非阻塞包装器; 包装器生成一个线程并立即返回(几乎),并且生成的线程执行阻塞系统调用,并将系统调用的结果发送给原始调用者,或者将它们存储在原始调用者可以轮询它们的位置。

(几乎总是)可以围绕非阻塞系统调用编写阻塞包装器; 包装器执行系统调用的位置,并在返回之前等待结果。

我建议阅读这篇非常简短的文字: http : //files.mkgnu.net/files/upstare/UPSTARE_RELEASE_0-12-8/manual/html-multi/x755.html特别是你可以看到为什么阻塞系统调用可能是线程的担心,而不仅仅是并发进程:

这对于multithreading应用程序尤其成问题,因为系统调用上的一个线程阻塞可能无限期地延迟另一个线程的代码的更新。

希望能帮助到你。