并发模型-协程模型

并发模型-协程模型 一、介绍 1.1 什么是线程 协程(Coroutine)是一种: 运行在用户态、由程序自身调度的轻量级执行单元。 它不像线程那样由操作系统调度,而是由运行时(Runtime)负责调度。 例如: 操作系统 │ ▼ Worker(线程) │ ┌──┼───────────────┐ │ │ │ ▼ ▼ ▼ 协程1 协程2 协程10000 可以看到: 一个线程 可以运行成千上万个协程 1.2 为什么会出现协程 先看传统线程。 例如: 线程1 ↓ 查询 MySQL ↓ 等待200ms 等待期间: CPU: 空闲 线程: 阻塞 CPU 没有工作。 协程出现以后: 协程1 ↓ 等待 MySQL ↓ 主动让出 CPU ↓ 协程2 开始执行 ↓ 协程3 开始执行 CPU 一直在处理其它任务。 因此: 协程解决的是 IO 等待导致 CPU 空闲的问题。 1.3 协程不是线程 协程永远依附于线程。 没有线程: 协程无法运行。...

2025年07月11日 · 1 min · Leanku

对进程、线程和协程的理解

对进程、线程和协程的理解 一、 进程 先来了解一下操作系统的进程: 操作系统对正在运行程序的抽象,这个就是进程(process)。 比如运行一个 web 浏览器,一个 text 文本,都是运行的一个一个进程。 有的人说:进程是程序运行资源的集合。进程是系统资源分配的最小单位等等。 从静态的角度来说,进程确实是运行程序的各种资源集合。 如果你进一步思考,进程里的各种资源都有哪些呢? 内存管理相关 文件系统 调度相关 信号处理 内核栈 进程各种状态 进程运行时统计信息 进程标识 等等。 可以看出,进程中的资源是相当多的。 从 Linux 操作系统对进程的定义也可以看出。 多进程:操作系统有多个程序运行,那么就有多个进程 二、 线程 《操作系统设计与实现》里说: 在传统操作系统中,每个进程中只存在一个地址空间和一个控制流(thread)。 然后,有些情况下,需要在相同地址空间中有多个控制流并行的运行,就像他们是单独的进程一样(只是他们共享相同的地址空间)。 这些控制流通常被称为线程(thread),有时也称为轻量级进程(lightweight process)。 尽管线程必须在进程中执行,但是线程和进程是可以分别对待处理的两个概念。进程用来集合资源,而线程是 CPU 调度的实体。 线程给进程模型增加的是,允许在同一个进程环境中有多个执行流,这些执行流在很大程度上相对独立。 也即是说,在进程中,程序执行的最小单位(执行流)是线程,可以把线程看作是进程里的一条执行流。 一个进程里可以有一条或多条线程。 为什么会有多线程 在一个应用程序执行过程中,应用程序里可能会有多种事件执行。 而有些事件执行一段时间后可能会被阻塞。如果把应用程序执行事件分解成多个并行运行的线程,即可以让程序设计变得简单,如果有阻塞的, 可以把这部分让出行换其他线程执行。 还有一个原因是: 线程比进程更轻量级。所以线程比进程更加容易创建,销毁。 第三个跟第一个有点关系,是关于性能的,若多线程都是 CPU 密集型的,那么不能获取性能上增强。如果有大量计算和大量 I/O 处理,那么 多线程就可以获取性能上的优势,因为允许多线程重叠执行。 多线程的缺点: 对于多线程来说,进程中的资源是共享的,所以会产生资源竞争。 当进程中的一个线程崩溃了,会导致这个进程里的其他线程也崩溃。所以有时多进程程序更好,一个进程崩溃不会导致其他进程也崩溃。 三、 进程和线程的区别 从上面进程和线程介绍知道,线程是程序执行流的最小单位,进程是操作系统分配资源的单位。 进程与进程之间关系: 进程与进程之间是相互独立的。 线程与进程关系: 线程是进程里的执行流,进程里的线程可以是一个,也可以是多个。 所有线程共享进程里一些资源,比如代码,数据,地址空间,信号处理,打开文件,全局变量等。 同时,线程也有自己的寄存器,程序计数器,堆栈,线程状态等 四、协程 协程是建立在线程之上,一般是语言级别的 ”多线程“ 模型,比线程更加的轻量级。有的叫它微线程。它是完全运行在用户态里。 协程是在线程之上在进行抽象,它需要线程来承载运行。一个线程可以有多个协程。 协程的优点:...

2024年02月18日 · 1 min · Leanku