同步异步、单线程多线程、并发并行

一、同步 VS 异步

1. 同步

当一个线程执行同步操作时,它会按照调用的顺序依次执行这些操作,并在执行每个操作时等待该操作完成。也就是说,线程会被阻塞,直到当前同步操作完成后再继续执行下一个操作。

2. 异步

当线程执行异步操作时,它会立即启动该操作并继续执行后续代码,而不需要等待异步操作完成。异步操作通常会返回一个 Task 对象,表示正在进行的操作,并允许线程在等待异步操作完成时继续执行其他任务。

3.后台任务

是在用户不直接交互的情况下执行的任务。它们通常用于处理长时间运行的操作,比如数据加载、文件处理、网络请求等

1)后台任务与CPU资源
  • 需要CPU资源:后台任务需要CPU资源来进行计算和处理数据。例如,当后台任务执行数据处理、文件读取或网络请求时,它们会占用CPU时间来完成这些操作。
  • CPU调度:操作系统负责调度CPU资源,决定哪个任务在何时执行。当后台任务被启动时,操作系统会将其分配给可用的CPU核心。即使后台任务在“后台”运行,它们仍然需要CPU时间来完成任务。
2)为什么可以放在后台执行
  • 非阻塞性:后台任务的设计目的是使主线程(通常是用户界面线程)不被阻塞。这样,用户可以继续与程序交互,而后台任务在独立线程或异步上下文中执行。
  • 多线程和异步编程:通过多线程或异步编程模型,后台任务可以在不同的执行上下文中运行。例如,使用线程池或异步方法(如async和await)可以使任务在后台执行,而不影响主线程的响应性。
  • 优先级和调度:操作系统根据任务的优先级和当前系统资源情况调度CPU资源。后台任务通常优先级较低,因此在系统负载较轻时,它们会获得CPU时间来完成任务。

4. 异步编程模型

异步编程模型的核心在于允许程序在执行长时间操作(如I/O操作或网络请求)时,不阻塞主线程。这种机制的原理主要涉及以下几个方面:

1)异步操作的定义

异步操作是指在启动一个任务后,程序不需要等待该任务完成,而可以继续执行后续代码。这样,主线程(通常是UI线程)可以保持响应性。

2)使用回调和Promise

回调函数:异步编程常使用回调函数,当一个异步操作完成时,系统会调用这些回调函数。通过这种方式,主线程可以在等待操作完成时继续执行其他代码。

  • Promise:许多现代编程语言(如JavaScript和C#)引入了Promise(或类似的机制),使得异步操作的管理更加简单。Promise表示一个可能尚未完成的操作,并提供了then和catch等方法来处理操作成功或失败的结果。
3)事件循环机制
  • 事件循环:在JavaScript等语言中,异步操作是通过事件循环机制实现的。事件循环不断检查是否有可执行的任务,如果有,它将从任务队列中取出并执行这些任务。这意味着即使某个操作在后台运行,主线程仍然可以处理其他事件。
  • 调度机制:当异步操作完成时,相关的回调函数会被添加到任务队列中,等待事件循环处理。这样,主线程可以在任何时候响应用户输入或处理其他事件。
4)线程与任务
  • 线程池:在一些语言(如C#)中,异步任务可以在后台线程池中运行。线程池管理着一组工作线程,当需要执行异步操作时,系统会从线程池中借用一个线程来处理任务。这意味着这些任务在独立的上下文中运行,不会影响主线程。
  • Task和async/await:现代编程语言(如C#)提供了async和await关键字,使得异步编程变得更加直观。使用这些关键字时,程序会在遇到await时暂停执行,允许主线程处理其他任务,而在异步操作完成时恢复执行。

exmple

线程中有ABCD 四个操作,ABD 是同步操作,C 是异步操作, 假设执行顺序是 A -> B -> C -> D。以下是具体执行过程的示例:

  1. CPU执行顺序详细说明:
  • 执行 A:线程开始执行同步操作 A,直到完成。
  • 执行 B:线程继续执行同步操作 B,直到完成。
  • 执行 C:线程开始执行异步操作 C。此时,操作 C 在后台运行,线程不会被阻塞。
  • 执行 D:线程继续执行同步操作 D,直到完成。
  • 等待 C:最后,线程等待异步操作 C 完成(如果需要)。
  1. 关键点
  • 同步操作会阻塞线程,确保它们按顺序执行。
  • 异步操作允许线程在等待操作完成时继续执行其他代码。
  • 如果多个同步操作在异步操作之前,CPU会在它们之间进行切换;而异步操作不会阻塞线程,允许主线程继续运行其他任务。
public async Task ExecuteOperationsAsync()
{
    // 同步操作 A
    OperationA(); // 线程被阻塞,直到 A 完成
    
    // 同步操作 B
    OperationB(); // 线程被阻塞,直到 B 完成
    
    // 异步操作 C
    var taskC = OperationCAsync(); // 线程不会被阻塞,C 在后台运行
    
    // 同步操作 D
    OperationD(); // 线程被阻塞,直到 D 完成
    
    // 等待异步操作 C 完成
    await taskC; // 等待 C 完成
}

二、单线程 VS 多线程

多线程(Multithreading)

  • 多线程指在一个程序中同时运行多个线程。每个线程可以独立执行任务,充分利用多核处理器的计算能力。
  • 多线程可以是同步的(多个线程相互等待)或异步的(多个线程并行执行而不相互等待)。

单线程(Single-threaded)

  • 单线程指程序中只有一个线程在执行。所有操作按顺序执行,可能会导致长时间的阻塞。
  • 在单线程应用程序中,异步编程模式可以用来提高响应能力,例如在UI应用程序中执行异步I/O操作,以避免冻结界面。

exmple

两条线程,甲线程有ABCD 四个操作,ABD 是同步操作,C 是异步操作,乙线程有HIJK四个操作,HIK是同步操作,I 是异步操作, 甲线程的优先级高于乙线程,分别模拟在单线程和多线程CPU上执行这两个线程的操作。

单线程CPU

甲、乙线程假设执行顺序如下:

  • 甲线程:A -> B -> C (异步,后台执行) -> D
  • 乙线程:H -> I (异步,后台执行) -> J -> K

1.CPU执行顺序详细说明:

  • 执行甲线程的 A:线程甲开始执行 A,阻塞,直到 A 完成。
  • 执行甲线程的 B:线程甲继续执行 B,阻塞,直到 B 完成。
  • 执行甲线程的 C(异步):线程甲启动 C,C 在后台运行,此时甲线程不再阻塞,继续执行。
  • 执行甲线程的 D:线程甲继续执行 D,阻塞,直到 D 完成。
  • 等待 C 完成:如果需要,甲线程会等待 C 完成。
  • 执行乙线程的 H:线程乙开始执行 H,阻塞,直到 H 完成。
  • 执行乙线程的 I(异步):线程乙启动 I,I 在后台运行,线程乙不再阻塞,继续执行。
  • 执行乙线程的 J:线程乙继续执行 J,阻塞,直到 J 完成。
  • 执行乙线程的 K:线程乙继续执行 K,阻塞,直到 K 完成。
多线程CPU

甲、乙线程假设执行顺序如下:

  • 甲线程:A -> B -> C (异步,后台执行) -> D
  • 乙线程:H -> I (异步,后台执行) -> J -> K

1.CPU执行顺序详细说明:

  • 执行甲线程的 A:线程甲开始执行 A,阻塞,直到 A 完成。
  • 执行甲线程的 B:线程甲继续执行 B,阻塞,直到 B 完成。
  • 执行甲线程的 C(异步):线程甲启动 C,C 在后台运行,此时甲线程不再阻塞,切换到乙线程。
  • 执行乙线程的 H:线程乙开始执行 H,阻塞,直到 H 完成。
  • 执行乙线程的 I(异步):线程乙启动 I,I 在后台运行,线程乙不再阻塞,切换回甲线程。
  • 继续执行甲线程的 D:线程甲继续执行 D,阻塞,直到 D 完成。
  • 执行乙线程的 J:线程乙继续执行 J,阻塞,直到 J 完成。
  • 执行乙线程的 K:线程乙继续执行 K,阻塞,直到 K 完成。
  1. 关键点
  • 在单线程CPU上,所有操作按顺序执行,无法并发。
  • 在多线程CPU上,甲线程和乙线程可以并发执行,依赖于线程的优先级和调度策略,甲线程会优先于乙线程执行,同时异步操作也可以在后台执行,不会阻塞主线程的执行。

三、并发 VS 并行

并发(Concurrency)

1.定义

并发是指在同一时间段内,多个任务可以交替执行,给人一种同时进行的感觉。并发不一定要求多个任务真正同时执行,而是指它们可以在同一程序或进程中同时进行,通常是通过上下文切换来实现。

2.实现方式

并发通常依赖于多线程或异步编程模型,允许一个线程在等待某个操作完成时,切换到执行其他任务。例如,一个程序可以在等待网络响应时执行其他计算任务。

3.示例

在一个用户界面的应用程序中,主线程可以处理用户输入,而其他后台线程可以执行文件加载或网络请求。这使得用户在等待操作完成时,仍然可以与程序交互。

2. 并行(Parallelism)

1.定义

并行是指在同一时间点上,多个任务真正地同时执行。并行通常涉及多核处理器,每个核心可以同时处理一个任务。

2.实现方式

并行通常通过多线程或多进程来实现,每个线程或进程在不同的处理器核心上运行。这可以显著提高计算效率,特别是对于计算密集型任务。

3.示例

在进行大规模数据处理时,可以将数据分成多个部分,并在多个CPU核心上同时处理这些部分,以加快处理速度。

3. 关键区别

image.png

4. 总结

  • 并发强调的是任务之间的交替执行,而不一定是同时的;它更关注于程序的结构和设计,使多个任务能够在同一时间段内得到处理。

  • 并行则强调任务的同时执行,依赖于多个处理器或核心的协同工作,以提高计算性能和效率。

?疑问关系

同步与单线程

单线程描述的是程序执行时只有一个线程,而同步更多强调的是任务之间的执行的等待、依赖关系。

异步与多线程

异步编程是一种编程范式,它允许程序在等待某个操作(如I/O操作、网络请求等)完成的同时,继续执行其他任务,而不需要阻塞当前线程。

多线程编程是一种并发编程技术,它允许在一个程序中同时运行多个线程,每个线程可以独立执行不同的任务。

image.png

异步并不会阻塞线程或者创建一个新的线程,它只是把异步的操作放到后台进行处理,同时允许CPU资源执行一些力所能及的操作,该线程一直在运行状态(在时间片足够的情况下),CPU 资源没有被安排给新的线程使用。而多线程是多个线程并发操作,CPU 资源轮流安排时间片给各个线程,各个线程按照划分的时间片轮流使用CPU资源,轮流进入等待,就绪,运行的状态。

多线程与并行并发

多线程:多线程是指在一个程序中同时运行多个线程,每个线程可以独立执行不同的任务。是一种实现并发或并行的技术,可以在单核或多核CPU上运行多个线程。

并行:是真正的同时执行多个任务,依赖于多核处理器,每个核心或处理器可以同时执行一个线程,显著提高计算性能。

并发:多个线程通过时间分片可以在单个CPU上交替执行,通过任务切换在逻辑上同时执行多个任务,提高程序的响应性和资源利用率,适用于I/O密集型操作。

image.png

并行并发与多核处理器

并行:多个任务在多个核心上同时执行执行多个任务,每个核心同时处理一个任务,从而实现真正的同时执行。

  • 多核处理器的作用
    • 真正的并行执行:多核处理器可以同时执行多个线程或任务。每个核心都可以独立执行一段代码,因此可以实现真正的并行处理。
    • 性能提升:通过并行处理,程序的执行效率可以显著提高,特别是在需要大量计算的任务中。

并发:并发是指在同一时间段内管理多个任务的执行。它并不一定是同时执行,而是通过快速切换任务,使得多个任务看起来是同时进行的

  • 单核处理器的并发
    • 任务切换:在单核处理器上,通过操作系统的任务调度机制,任务会被快速切换。每个任务在其时间片内执行,切换频率高,使得多个任务逻辑上并行执行。
    • 提高响应性:并发处理可以提高程序的响应性,因为即使某个任务正在等待I/O操作,其他任务仍然可以继续执行。
  • 多核处理器的并发
    • 结合并行:在多核处理器上,并发任务可以分配到不同的核心上并行执行,同时在每个核心上也可以通过任务切换实现并发处理。
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容