为什么多对多线程模型没有被更多地使用
Why is the Many-to-Many threading model not used in more
操作系统概念一书谈到了各种多线程模块(第4.3节),其中提到大多数操作系统都使用一对一模型; Linux、Windows 等。但是,它随后讨论了多对多模型,并修复了一对一模型中出现的一些问题,但稍后提到它唯一被广泛使用的实现是两级模型,它只是多对多模型的扩展,该模型曾在旧版本的 Solaris (9) 中使用,但现在不再使用并已被替换通过一对一的模式。我的问题是,如果多对多模型更好,那么为什么不更常用呢?是因为复杂吗?我可以想象,如果用户和内核级线程之间没有某种 "sticky" 映射,上下文切换可能会出现问题?
感谢您对此的任何帮助。
已使用; go routines 在 Go 中就是这样,由 Go runtime 管理。随着内核内存变得更便宜(因为内存变得更便宜)和 pthreads 的使用变得无处不在,管理两级模型的运行时成本,以及支持它的人工时间成本,预示着它的消亡。
Go 例程是一种编程模型,意味着非常便宜,以至于 Go 程序不应该以拥有数千个例程为耻。 Go 运行时非常小心地保留了一个虚拟-cpu 池(由真实线程构建),可以非常快速地采用 go 例程。
操作系统概念一书谈到了各种多线程模块(第4.3节),其中提到大多数操作系统都使用一对一模型; Linux、Windows 等。但是,它随后讨论了多对多模型,并修复了一对一模型中出现的一些问题,但稍后提到它唯一被广泛使用的实现是两级模型,它只是多对多模型的扩展,该模型曾在旧版本的 Solaris (9) 中使用,但现在不再使用并已被替换通过一对一的模式。我的问题是,如果多对多模型更好,那么为什么不更常用呢?是因为复杂吗?我可以想象,如果用户和内核级线程之间没有某种 "sticky" 映射,上下文切换可能会出现问题?
感谢您对此的任何帮助。
已使用; go routines 在 Go 中就是这样,由 Go runtime 管理。随着内核内存变得更便宜(因为内存变得更便宜)和 pthreads 的使用变得无处不在,管理两级模型的运行时成本,以及支持它的人工时间成本,预示着它的消亡。
Go 例程是一种编程模型,意味着非常便宜,以至于 Go 程序不应该以拥有数千个例程为耻。 Go 运行时非常小心地保留了一个虚拟-cpu 池(由真实线程构建),可以非常快速地采用 go 例程。