当一个线程在C中阻塞时,为什么整个进程都不会阻塞

时间:2015-02-25 16:20:46

标签: c multithreading process operating-system kernel

我正在学习操作系统,我们正在谈论线程。在维基百科here上,它表示对于1:N内核线程:

  

如果其中一个线程需要执行I / O请求,那么整个   流程被阻止,无法利用线程优势

然而这让我想到了。在C中,如果我在主线程上创建UI,如果我在使用pthread的新线程上执行I / O,则我的UI不会阻塞。这与维基百科所说的不相矛盾,因为我仍然只有1个进程有2个线程,所以我的I / O线程不应该根据维基百科所说的阻止我的用户界面吗?

编辑:如果Windows和OS X使用维基百科声称的1:1模型,那么为什么在OSX中我执行top命令或在Windows中使用任务管理器时,我看不到每个程序线程的单独进程,为什么我仍然看到1进程下列出的多个线程?

2 个答案:

答案 0 :(得分:8)

Wikipedia指的是用户级线程,其中整个线程组被分配给单个内核线程。因此,当其中一个线程执行I / O操作时,控制传递给内核,内核线程将在等待I / O操作完成时阻塞。但由于组中的每个线程都映射到同一个内核线程,因此其余线程也会阻塞。

另一方面,Pthreads是不是用户级线程。每个pthread都映射到内核中的不同线程(进程),内核负责调度线程。如果您的GUI应用程序创建了一个执行I / O操作的新pthread,则该线程不会阻止主应用程序,因为它们在内核中是不同的线程

至于您的编辑:您看到特定进程下的线程数的原因是每个线程组都有一个启动进程并创建线程的父线程。在您的示例中,它将是GUI应用程序 - 它产生的每个线程将“指向”它(该实现特定于操作系统,例如Linux具有tgid字段,该字段是pid的父线程)。您通常对进程的性能而不是特定线程感兴趣,因此所有线程的数据都聚合在父线程下。

答案 1 :(得分:0)

我的第一个想法是你从Wiki引用的陈述不正确。使用线程的主要原因之一是具体,因此I / O操作不会阻止整个过程。