Google已经开始开放M:N线程模型的实现

谷歌 提供 在 Linux 内核中包含第一组补丁,其中包含确保 M:N 线程模型运行所需组件的实现。 谷歌的举措与开放一个秘密开发的API有关 切换到 适用于 Linux 内核,它使用 M:N 线程模型提供在用户空间中实现的多线程子系统的操作。 Google 使用该子系统来确保需要最小延迟的服务的运行。 线程分配的调度和管理完全在用户空间中进行,这样可以通过最小化系统调用的执行来显着减少上下文切换操作的数量。

为了保证Linux内核级别指定子系统的运行,实现了SwitchTo API,提供三种基本操作:等待、恢复和交换(切换)。 为了包含在内核中,提出了新操作 FUTEX_SWAP 的代码,以补充 FUTEX_WAIT 和 FUTEX_WAKE,并提供了在用户空间中创建多线程库的框架。 FUTEX_SWAP也可以用来在任务之间传输消息,类似于RPC。 例如,目前,要在任务之间传输消息,您需要至少执行四次 FUTEX_WAIT 和 FUTEX_WAKE 调用,但使用 FUTEX_SWAP 将允许您通过一次操作完成,完成速度将快 5-10 倍。

 Google已经开始开放M:N线程模型的实现

目前实际应用中主要采用1:1和N:1流模型。 1:1模型用于 国家知识产权局 (POSIX 流)和 Linux线程,并且意味着用户空间中的线程到内核级别的线程(执行调度单元)的直接映射。 模型 N:1 实施于 GNU Pth,将线程分派引入用户空间,并允许用户空间中的 N 个线程绑定到内核中的单个线程,而内核不知道用户线程。

1:1 模型的主要缺点是内核和用户空间之间的上下文切换开销较大。 N:1 模型解决了这一问题,但又产生了一个新问题 - 由于内核中的线程是不可分割的执行调度单元,因此与操作系统内核中的一个线程绑定的用户线程无法跨 CPU 内核扩展,最终只能绑定到单个 CPU 核心。

M:N 模型是混合模型,通过将用户空间中的 N 个线程映射到操作系统内核中的 M 个线程,消除了上述所有缺点,这样既可以减少上下文切换的开销,又可以确保跨 CPU 内核的扩展。 此选项的成本是在用户空间中实现线程调度程序的极大复杂性以及需要与内核调度程序协调操作的机制。

播放视频

来源: opennet.ru