繁体   English   中英

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

[英]What is meant by "blocking system call"?

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

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

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

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

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

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

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

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

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

希望能帮助到你。

阻塞系统调用是一种系统调用,任何进程都可以通过该调用从系统请求某些服务,但该服务当前不可用。 所以那个特定的系统调用会阻塞进程。

如果你想在多线程的上下文中说清楚,你可以通过链接 go ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM