【问题标题】:Blocking in user-level thread在用户级线程中阻塞
【发布时间】:2018-08-13 21:18:45
【问题描述】:
我对用户级线程阻塞有些困惑。众所周知,一个用户级别的线程阻塞会导致整个进程被阻塞,那么为什么“响应性”是多线程的好处之一呢?在 Silberschatz “操作系统概念”一书中给出:
交互式应用程序中的多线程可能允许程序
继续运行,即使它的一部分被阻塞或正在执行
冗长的操作,从而提高对用户的响应速度。
这仅指内核级线程还是我无法理解的内容?
所以,问题是,当一个用户级线程阻塞导致整个进程被阻塞时,响应性如何成为线程的优势?
【问题讨论】:
标签:
multithreading
operating-system
【解决方案1】:
我对用户级线程阻塞有些困惑。众所周知,一个用户级别的线程阻塞会导致整个进程被阻塞,那么为什么“响应性”是多线程的好处之一呢?
这仅适用于某些操作系统。
所以,问题是,当一个用户级线程阻塞导致整个进程被阻塞时,响应性如何成为线程的优势?
在开发“用户线程”时广泛使用的系统通常会出现软件中断,从而阻止整个线程被阻塞。
现在,任何称职的操作系统都有真正的线程,而“用户线程”是时代的遗物,操作系统没有跟上。
【解决方案2】:
使用用户级线程,实际线程永远不会阻塞 - 任何可能阻塞的操作都会被拦截,而非阻塞等效操作会被执行。如果用户级线程 DID 阻塞,正如您所注意到的,它会无意中阻塞其他线程,这是被破坏的。
【解决方案3】:
那么,问题是,当一个用户级线程阻塞导致整个进程被阻塞时,响应性如何成为线程的优势?
用户级线程只在两种情况下阻塞:
当它们遇到页面错误或线程库无法处理的其他情况时。
当整个过程无路可走时。
这是用户级线程实现的主要工作——获取通常会阻塞的函数并将它们替换为非阻塞版本,以便其他用户级线程可以向前推进。
这仍然意味着,如果任何用户级线程遇到页面错误,整个进程将无法向前推进,直到页面错误得到处理。