多线程基础——概念

本文介绍了并行计算和并发计算的概念,强调它们在提升计算效率中的作用。并详细讲解了进程与线程的区别,以及多线程在软件和硬件层面的实现。此外,还探讨了上下文切换的原理和并发编程的三大特性:可见性、有序性和原子性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并行计算和并发计算

并行计算(parallel computing):一般是指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决。

电脑软件可以被分成数个运算步骤来运行。为了解决某个特定问题,软件采用某个算法,以一连串指令运行来完成。传统上,这些指令都被送至单一的中央处理器,以循序方式运行完成。在这种处理方式下,单一时间中,只有单一指令被运行。并行运算采用了多个运算单元,同时运行,以解决问题。

相对于串行计算,并行计算可以划分成时间并行和空间并行。时间并行即指令流水化,空间并行使用多个处理器执行并发计算。以程序和算法设计人员的角度看,并行计算又可分为数据并行和任务并行。数据并行把大的任务化解成若干个相同的子任务,处理起来比任务并行简单。

并发计算(Concurrent computing):是一种程序计算的形式,在系统中,至少有两个以上的计算在同时运作,计算结果可能同时发生。简单来说,就是将一个计算任务,分割成几个小的部分,让它们同时被计算,之后再汇整计算结果,以完成任务。

并发计算是一种程序运算的特性,可以被视为是并行运算的进一步抽象,它包涵了时间片这种可以被用来实现虚拟并行运算(pseudoparallelism)的技术,因此在实际的物理运作中,计算过程可能是并行,或非并行的。

实现并发程序有许多方式,依编程语言与操作系统的支持,可以用进程,或是线程来实现。它可以运行在单一处理器上,将不同的运行步骤分散在不同时间片中运行,以非并行方式循序运算;它也可以用并行计算来实现,将每个进程指定给处理器组中的某个处理器,以单片机多处理器平台,或是透过网络链接的分散平台来实做。

依照硬件与操作系统的支持,并发计算可以在同一个进程中完成,在同一个进程中以多线程来完成,以多个进程来达成,甚至可以分成数个程序来运行。可以用单处理器的循序计算来实现,也可以采并行计算或分布式计算方式实做。

进程与线程

进程(process):指计算机中已运行的程序。在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。

程序本身只是指令、数据及其组织形式的描述,相当于一个名词,进程才是程序(那些指令和数据)的真正运行实例。

线程(thread):是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

多线程

多线程(multithreading):是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。

软件多线程:即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的线程间来回切换,被称为单人多任务作业系统。而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单任务系统。

硬件多线程:对称多处理机(SMP)系统具有多个处理器,所以具有真正的同时执行多个线程的能力;CMP技术通过在一块芯片上集成多个核心(Core)也具有真正的多线程能力;CMT技术则稍有不同,有的是依靠硬件执行线程切换来获得多线程能力,操作系统不再负责线程切换,因而这部分开销可以减少甚至消除,这方面典型的例子是Sun的UltraSPARC T1,它同时综合了CMP和CMT。微软的Windows 2000以后的操作系统皆支持多线程与超线程技术。

上下文切换

上下文切换(context switch):又称环境切换,计算机术语,是一个存储和重建CPU的状态,因此令多个进程(process)可以分享单一CPU资源的计算过程。要切换CPU上的进程时,必需先行存储目前进程的状态,再将欲运行的进程之状态读回CPU中。

在一次切换中,第一个进程的状态要被纪录在某个地方,这样当调度器(scheduler)要回到这个进程时,才可以重建这个进程并且继续运算。这里所谓“行程的状态”,包含了这个进程使用的所有寄存器(register),特别是程序计数器;加上所有操作系统可能需要的特定资料。这些资料一般以名为进程控制块(process control block,PCB)的数据结构存储起来。

开销:上下文切换通常是计算密集型的,操作系统中的许多设计都是针对上下文切换的优化。在进程间切换需要消耗一定的时间进行相关的管理工作——包括寄存器和内存映射的保存与读取、更新各种内部的表等等。处理器或者操作系统不同,上下文切换时所涉及的内容也不尽相同。比如在Linux内核中,上下文切换需要涉及寄存器、栈指针、程序计数器的切换,但和地址空间的切换无关(虽然进程在进行上下文切换时也需要做地址空间的切换)。用户态线程之间也会发生类似的上下文切换,但这样的切换非常轻量。

并发编程三大特性

可见性(visibility)

当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。

有序性(ordering)

程序的执行顺序按照代码的先后顺序

原子性(atomicity)

原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值