sam*_*sam 24 c multithreading operating-system system-calls
"阻止系统调用"是什么意思?
在我的操作系统课程中,我们正在研究多线程编程.我不确定当我在我的教科书中读到"当线程进行阻塞系统调用时它可以允许另一个线程运行"是什么意思
Cro*_*man 23
阻塞系统调用必须等到可以完成操作.read()这将是一个很好的例子 - 如果没有准备好输入,它将坐在那里等待一些(如果你没有将它设置为非阻塞,当然,在这种情况下,它不会是阻塞系统调用).显然,当一个线程正在等待阻塞系统调用时,另一个线程可能正在执行其他操作.
Bre*_*dan 15
对于阻塞系统调用,调用程序在系统调用返回之前无法执行任何操作.如果系统调用可能很长(例如涉及文件IO或网络IO),这可能是一件坏事(例如,想象一个沮丧的用户在没有响应的应用程序中敲击"取消"按钮,因为该线程被阻塞等待来自未到达的网络的数据包).为了解决这个问题(在等待阻塞系统调用返回时做有用的工作)你可以使用线程 - 当一个线程被阻塞时,其他线程可以继续做有用的工作.
另一种方法是非阻塞系统调用.在这种情况下,系统调用立即返回(几乎).对于冗长的系统调用,系统调用的结果要么稍后发送给调用者(例如作为某种事件或消息或信号),要么稍后由调用者轮询.这允许您让一个线程等待许多不同的冗长系统调用同时完成; 并避免线程的麻烦(以及锁定,竞争条件,线程开关的开销等).但是,它也增加了获取和处理系统调用结果所带来的麻烦.
(几乎总是)可以在阻塞系统调用周围编写非阻塞包装器; 包装器生成一个线程并立即返回(几乎),并且生成的线程执行阻塞系统调用,并将系统调用的结果发送给原始调用者,或者将它们存储在原始调用者可以轮询它们的位置.
(几乎总是)可以围绕非阻塞系统调用编写阻塞包装器; 包装器执行系统调用的位置,并在返回之前等待结果.