多线程模型 - 一对多模型

标签 multithreading operating-system one-to-many

我一直在读恐龙书,并对这个特定的模型感到困惑。

书上说,对于一对多模型“线程管理是由用户空间的线程库完成的,所以效率很高;但是如果一个线程进行阻塞系统调用,整个进程就会阻塞。另外,因为只有一次只能有一个线程访问内核,多个线程无法在多处理器上并行运行”

我感到困惑的是,如果进行阻塞系统调用,整个进程将阻塞是什么意思?这是否意味着如果我有一个多线程程序并且其中一个线程被阻塞,那么它的所有线程都将不得不等待,从而有效地停止程序?

如果正在执行的程序导致此模型的阻塞,是否意味着由于内核线程阻塞而无法交换另一个单独的程序来执行?如果答案是肯定的,则可以交换另一个程序(进程),那么为什么多线程程序不能在阻塞线程被迫等待时简单地执行其另一个线程?

最佳答案

如果您在用户级别管理线程,则意味着交换是由您的应用程序完成的,而不是由操作系统调度程序完成的。每个线程必须达到某个点,将控制权交给(或失去)管理机制,但该机制也是用户级的,因此如果其中一个线程正在执行系统调用 - 您的线程管理系统(并且所有其他线程都必须等待,直到内核代码完成。

操作系统仍然始终处于事件状态,并且仍然可能抢占整个程序,因此其他进程不会挨饿,只有您自己管理的内部“线程”。这些线程在该阻塞期间无法启动,因为负责启动它们的机制也被内核阻塞。

关于多线程模型 - 一对多模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467248/

相关文章:

java - 关于 android onCreate()c 中数据库 Activity 的问题

python - 如何通过命令行传递参数以在 Python 中设置环境

swift - 如何在 Core Data 中插入具有多对多关系的对象? swift 3/Xcode 8

mysql - 避免一对多关系中的许多查询的最佳方法

Python 2.7 : Child thread not catching KeyboardInterrupt

java - 为什么在 Java 中我的 CPU 绑定(bind)线程会导致内核空间中的操作?

multithreading - 线程休眠时的线程与核心

c - 如何显示 sigusr1 和 sigusr2 的输出?

memory-management - 页表条目的引用和修改位如何影响分页?

one-to-many - TypeORM:如何实现双向关系,多个字段-->一种实体类型