- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在上一门操作系统类(class),我们正在谈论线程。在维基百科上 here它说对于 1:N 内核线程:
If one of the threads needs to execute an I/O request, the whole process is blocked and the threading advantage cannot be utilized
然而,这让我开始思考。在 C 中,如果我在主线程上创建为 UI,并且如果我使用 pthread 在新线程上执行 I/O,那么我的 UI 不会阻塞。这与维基百科所说的不矛盾吗,因为我仍然只有 1 个进程和 2 个线程,所以根据维基百科所说,我的 I/O 线程不应该阻塞我的 UI 吗?
编辑:如果 Windows 和 OS X 使用维基百科声称的 1:1 模型,那么为什么在 OSX 中执行 top 命令或在 Windows 中使用任务管理器时我没有看到每个程序线程的单独进程,为什么我仍然看到 1 个进程下列出的多个线程?
最佳答案
维基百科指的是用户级线程,其中将整个线程组分配给单个内核线程。因此,当其中一个线程执行 I/O 操作时,控制权将传递给内核,内核线程将在等待 I/O 操作完成时阻塞。但是由于组中的每个线程都映射到同一个内核线程,其余线程也会阻塞。
另一方面,Pthreads 不是用户级线程。每个pthread在内核中映射到不同的线程(进程),内核负责调度这些线程。如果您的 GUI 应用程序创建一个执行 I/O 操作的新 pthread,该线程将不会阻塞主应用程序,因为它们在内核中是不同的线程。
至于您的编辑:您看到特定进程下的线程数的原因是每个线程组都有一个启动进程并创建线程的父线程。在您的示例中,它将是 GUI 应用程序 - 它生成的每个线程都会“指向”它(实现特定于操作系统,例如 Linux 具有 tgid
字段,即 pid
父线程)。您通常对进程的性能而不是特定线程的性能感兴趣,因此所有线程的数据都聚合在父线程下。
关于c - 当一个线程在 C 中阻塞时,为什么整个进程不会阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724135/
我是一名优秀的程序员,十分优秀!