同线程

时间:2020-01-09 10:35:52  来源:igfitidea点击:

同线程(Same-threading)是一种并发模型,其中单线程系统可扩展到N个单线程系统。结果是N个单线程系统并行运行。

同一个线程的系统不是纯粹的单线程系统,因为它包含多个线程。但是每个线程都像一个单线程系统一样运行。因此,术语"同线程"而不是"单线程"。

为什么选择单线程系统?

我们可能想知道为什么今天有人设计单线程系统。单线程系统之所以流行,是因为它们的并发模型比多线程系统简单得多。单线程系统不与其他线程共享任何状态(对象/数据)。这使单线程可以使用非并发数据结构,并更好地利用CPU和CPU缓存。

不幸的是,单线程系统不能完全利用现代CPU。现代CPU通常会多带2、4、6、8个内核。每个内核都充当一个单独的CPU。单线程系统只能使用其中一个内核,如下所示:

同线程:单线程横向扩展

为了利用CPU中的所有内核,可以扩展单线程系统以利用整个计算机。

每个CPU一个线程

同线程系统通常在计算机中每个CPU运行1个线程。如果计算机包含4个CPU或者具有4个内核的CPU,则通常会运行4个相同线程系统的实例(4个单线程系统)。下图说明了这一原理:

没有共享状态

同一个线程的系统看起来类似于传统的多线程系统,因为同一个线程的系统内部有多个线程在运行。但是有细微的差别。

同一线程系统与传统多线程系统之间的区别在于,同一线程系统中的线程不共享状态。没有线程并行访问的共享内存。没有并发数据结构等,线程可以通过这些结构共享数据。此处说明了这种差异:

缺少共享状态是导致每个线程在单线程系统下的行为。但是,由于同一个线程的系统可以包含多个线程,因此它实际上不是"单线程系统"。由于缺乏更好的名称,我发现将这样的系统称为同线程系统而不是"具有单线程设计的多线程系统"更为精确。同线程更容易说,也更容易理解。

从本质上讲,相同线程意味着数据处理停留在同一线程内,并且同一线程系统中没有任何线程可以同时共享数据。有时,这也被称为没有共享状态并发或者单独的状态并发。

负载分配

显然,同一个线程的系统需要在运行的单线程实例之间共享工作负载。如果只有一个线程可以完成任何工作,则该系统实际上将是单线程的。

究竟如何在不同线程上分配负载,取决于系统的设计。我将在以下各节中介绍一些内容。

单线程微服务

如果系统包含多个微服务,则每个微服务都可以单线程模式运行。当我们将多个单线程微服务部署到同一台计算机上时,每个微服务都可以在单个CPU上运行单个线程。

微服务本质上不共享任何数据,因此微服务是同线程系统的一个很好的用例。

分片数据服务

如果系统确实确实需要共享数据,或者至少需要共享一个数据库,则可以对数据库进行分片。分片意味着将数据划分到多个数据库中。通常对数据进行划分,以使彼此相关的所有数据一起位于同一数据库中。例如,属于某个"所有者"实体的所有数据都将插入到同一数据库中。但是,分片不在本教程的讨论范围之内,因此我们必须搜索有关该主题的教程。

线程通讯

如果同一线程系统中的线程需要进行通信,则它们通过消息传递来进行通信。如果线程A要向线程B发送消息,则线程A可以通过生成消息(字节序列)来发送消息。然后,线程B可以复制该消息(字节序列)并读取它。通过复制消息,线程B确保线程A在读取消息时无法修改消息。复制后,线程A无法访问该消息副本。

通过消息传递进行的线程通信如下所示:

线程通信可以通过队列,管道,Unix套接字,TCP套接字等进行。无论系统适合什么。

更简单的并发模型

在同一线程系统中在自己线程中运行的每个系统都可以实现为单线程。这意味着内部并发模型变得比线程共享状态简单得多。我们不必担心并发数据结构以及此类数据结构可能导致的所有并发问题。