“阻止系统调用”是什么意思?
在我的操作系统课程中,我们正在研究多线程编程。我不确定当我在我的教科书中读到“它可以允许另一个线程在一个线程进行阻塞系统调用时运行”时的含义“
答案 0 :(得分:23)
阻止系统调用必须等到操作完成后才能进行。 read()
将是一个很好的例子 - 如果没有准备好的输入,它将坐在那里等待一些(如果你还没有把它设置为非阻塞,当然,在这种情况下,它不会是阻止系统调用)。显然,当一个线程正在等待阻塞系统调用时,另一个线程可能正在执行其他操作。
答案 1 :(得分:14)
对于阻塞系统调用,在系统调用返回之前,调用者无法执行任何操作。如果系统调用可能很长(例如涉及文件IO或网络IO),这可能是一件坏事(例如,想象一个沮丧的用户在没有响应的应用程序中敲击“取消”按钮,因为该线程被阻塞等待来自未到达的网络的数据包)。为了解决这个问题(在等待阻塞系统调用返回时做有用的工作)你可以使用线程 - 当一个线程被阻塞时,其他线程可以继续做有用的工作。
替代方案是非阻塞系统调用。在这种情况下,系统调用立即返回(几乎)。对于冗长的系统调用,系统调用的结果要么稍后发送给调用者(例如作为某种事件或消息或信号),要么稍后由调用者轮询。这允许您让一个线程等待许多不同的冗长系统调用同时完成;并避免线程的麻烦(以及锁定,竞争条件,线程开关的开销等)。但是,它也增加了获取和处理系统调用结果所带来的麻烦。
(几乎总是)可以在阻塞系统调用周围编写非阻塞包装器;包装器生成一个线程并立即返回(几乎),并且生成的线程执行阻塞系统调用,并将系统调用的结果发送给原始调用者,或者将它们存储在原始调用者可以轮询它们的位置。
(几乎总是)可以围绕非阻塞系统调用编写阻塞包装器;包装器执行系统调用的位置,并在返回之前等待结果。
答案 2 :(得分:3)
我建议阅读这篇非常简短的文字: http://files.mkgnu.net/files/upstare/UPSTARE_RELEASE_0-12-8/manual/html-multi/x755.html 特别是你可以在那里阅读为什么阻塞系统调用可能是线程的担忧,而不仅仅是并发进程:
这对于多线程应用程序来说尤其成问题 系统调用上的一个线程阻塞可能会无限期地延迟更新 另一个线程的代码。
希望它有所帮助。