什么是多线程?
什么是多线程?
多线程是将单个计算任务拆分成较小的部分,以便在多个计算单元之间进行并行处理的过程。例如,要将库存数据库中的所有值翻倍,可以将操作拆分到多个计算核心,每个核心负责将一个值翻倍。多线程可以加快许多类型的计算操作,例如处理大量用户请求、非顺序计算以及输入和输出任务,从而提高整体性能。大多数现代计算机都支持多线程,包括云实例、桌面和移动设备。
多线程的工作原理是什么?
线程是可以作为独立单元运行的最小计算指令序列。在操作系统(OS)中运行的进程通常包含一个或多个线程。
多线程是一种分离这些线程并在多个核心上运行它们的计算技术。线程仍然共享主进程的内存空间,这允许操作系统协调这些线程的工作。也可以在单个处理器或 CPU 核心上运行多个线程,操作系统将 CPU 周期安排到特定线程或使用超线程。

线程创建、调度和操作模型
线程由操作系统(内核级线程)或在用户空间库内(用户级线程)创建。这允许多种不同的程序操作模型:
- 工作程序线程:这些线程处理高容量的后台任务,例如文件 I/O 和网络请求。
- 线程池:当规模较大时,线程创建可能会非常消耗计算资源。创建和回收一组线程池可以减少开销。
- Fork-join 模型:在此模型中,您将大型任务拆分为同时运行的子任务,然后合并结果。
线程生命周期和状态
五态模型是计算中的一个基本概念,它描述了进程或线程可能存在的状态:新建、就绪、正在运行、阻塞/等待和退出。操作系统和运行时环境管理这些状态之间的转换,以提高整体效率。
- 新建:新线程已创建但尚未开始。
- 就绪:线程已准备好运行,但正在等待调度器分配中央处理单元(CPU)时间。
- 正在运行:线程在处理器上运行。
- 阻塞/等待:线程暂停,等待事件,例如 I/O 完成或来自其他线程的信号。
- 退出:线程已运行完成或过早停止。
线程同步机制
由于线程共享内存,它们必须协调对共享资源的访问,否则就可能出现多个线程同时尝试修改同一数据的情况,从而导致数据丢失。这些被称为竞态条件。
有几种常见的同步工具可以缓解竞态条件:
- 锁(或互斥锁):锁或互斥锁强制线程一次只能进行系统调用或访问某个资源。
- 信号量:锁一次只允许一个连接,而信号量则允许有限数量的连接访问一组资源池。
- 条件变量:条件变量是一种通信机制,线程可以告诉对方等待,直到满足某些条件。
- 原子操作:原子操作是多步操作,要么运行到完成,要么根本不运行,例如,检查和递增计数器。原子操作允许您在没有锁的情况下完成简单的操作。
尽管同步有助于提高数据完整性,但过度使用同步机制可能会导致性能问题或线程被阻塞。
- 瓶颈:当一个线程锁定了太大部分代码,以致其他线程几乎无法开展工作时,就会形成瓶颈。
- 死锁:当两个线程停滞时,就会发生死锁,每个线程都在等待另一个线程持有的资源。
上下文切换和开销
当操作系统在运行一条指令时将 CPU 从一个线程切换到另一个线程时,它会执行上下文切换,在加载下一个线程之前保存当前线程的状态。尽管上下文切换是多线程程序运行所必需的,但它们会消耗更多的计算资源,如果管理不当,规模一大就容易出问题。
多线程有哪些类型?
可以在程序中以多种不同的方式实现并行多线程。多线程的三种主要类型是内核级、用户级和混合线程。它们之间的主要区别在于操作系统内核如何与线程交互。
内核级线程
“内核级线程”也称为一对一线程。在此模型中,线程由操作系统内核直接创建和管理。这样操作系统调度器就可以看到每个线程,因此可以将每个线程分配给单个核心。内核级线程广泛用于现代操作系统,非常适合需要高吞吐量或大规模响应能力的应用程序,例如当您需要对工作负载进行云爆发时。
用户级线程
用户级线程也称为多对一线程。在此模型中,单独的线程完全由用户空间库管理,无需操作系统直接参与。对内核而言,库创建的所有这些线程都显示为一个进程。在池化、轻量级处理比真正并行更重要的环境中,用户级线程非常有用。一个示例使用案例是处理许多小型查询的数据库连接池。
混合线程
混合线程也称为多对多线程。在此模型中,您将多个用户线程映射到相同或更少数量的内核线程。例如,这意味着应用程序可以生成 10 万个逻辑线程(用户级线程),而操作系统只能管理 16 个物理线程(内核级线程)及其关联核心。
多线程应用程序有哪些优势?
通过将工作划分为多个并行编程操作,多线程可以提高计算性能并帮助优化资源利用率,从而提供许多优势。
提高性能和吞吐量
通过在多个中央处理单元(CPU)核心或虚拟处理器上执行多任务处理,多线程允许工作并行运行,而不是按顺序运行。并行处理可以显著提高速度,特别是对于要执行许多重复或相同任务的操作。例如,并发操作在数据转换、批处理或处理重复的用户请求时很有用。
提高资源利用率
包括云实例在内的现代计算环境的 CPU 容量可能未得到充分利用。多线程可以帮助最大限度地同时使用所有可用硬件。
增强应用程序响应能力
多线程可以通过将后台任务移至其他线程来提高系统的响应能力。例如,对大型文件传输进行后台处理。这有助于防止进程的主线程冻结,因为它通常负责用户界面。
并发工作负载的可扩展性
通过使用额外的核心来处理并行运行的请求,在云环境中运行的多线程应用程序可以高效扩展。Web 服务器、API 和微服务从这种能力中受益匪浅。这些应用程序可以使用线程池来管理多个线程或数百或数千个同时连接,而无需额外的进程。
多线程和多处理有什么区别?
多线程和多处理都是实现并发的技术。它们在运行和处理系统资源的方式上有所不同。
多线程
线程共享内存,从而实现相对较快的通信。但是,多线程需要仔细同步,帮助防止瓶颈或死锁。线程创建速度快,开销相对较低。此模型非常适合 I/O 密集型任务,在这些任务中,不同的线程通常在外部系统上等待,例如执行大型文件传输。
多处理
创建多个进程比创建多线程更消耗资源,但是每个进程都有自己的独立内存空间。尽管与多线程的共享内存模型相比,这通常会使处理变慢,但运行隔离进程可以更加稳定,因为一个进程失败不会影响其他进程。进程间通信通过管道或队列等机制进行。多处理非常适合 CPU 密集型工作负载,例如数据处理和机器学习。

AWS 如何支持您的多线程需求?
AWS 在我们的计算实例、无服务器函数和容器化工作负载管理解决方案中提供多线程功能。在 AWS 上探索适用于开发人员和软件应用程序的多线程技术:
- AWS Batch 是一项完全托管式批量计算服务,可以在 Amazon Elastic Container Service、Amazon Elastic Kubernetes Service、AWS Fargate 以及竞价型实例或按需型实例等各种 AWS 计算产品中,规划、安排和运行您的容器化批处理机器学习、模拟和分析工作负载。
- Amazon EC2 提供各种具有单线程和多线程功能的计算实例。优化 CPU 功能允许您在实例启动期间和之后指定自定义数量的 vCPU,并且可以对使用单线程 CPU 运行良好的工作负载(例如高性能计算应用程序)禁用 Intel 超线程技术。
- Amazon Elastic Container Service(ECS)是一项完全托管式容器编排服务,使团队能够构建、管理及运行极为严苛的容器化工作负载,而无需复杂的基础设施管理,从而让开发团队腾出时间来更快地创新。
- AWS Lambda 使您能够只专注于代码,同时它可以处理所有基础设施管理,包括多线程。Lambda 支持更快的开发、更高的性能、更高的安全性和成本效益。
立即创建免费账户,开始在 AWS 上使用多线程。
Browse all cloud computing concepts
Browse all cloud computing concepts content here:
Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages