什么是多进程和多线程?什么是协程?
Posted on Wed, 25 Dec 2024 10:34:55 +0800 by LiangMingJian
什么是多进程和多线程?什么是协程?
什么是进程?
进程是表示资源分配的基本单位,是调度运行的基本单位。当用户运行自己的程序时,系统就创建一个进程,并为它分配包括内存空间、磁盘空间、I/O设备等资源。然后,把该进程放入进程的就绪队列中等待被系统执行。当该进程被系统的进程调度程序选中后,系统会为它分配CPU以及其它资源,运行该进程。
什么是线程
线程是进程中执行运算的最小单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。
线程与进程的包含关系

多进程和多线程的区别?
数据共享方面:
- 多进程:每个进程拥有独立的地址空间(包括代码段、数据段和堆栈段),数据默认不共享,共享数据需要通过进程间通信(IPC)机制,如管道、消息队列或共享内存来实现,这增加了复杂性和开销。
- 多线程:所有线程共享同一个进程的内存空间,包括堆内存和全局变量,数据共享非常高效且轻量,不需要额外复制机制,数据交换较为简单便捷。
数据同步方面:
- 多进程:由于内存隔离,在同步数据时,不容易出现竞争问题,同步问题较少,但实现更耗时且效率较低。
- 多线程:由于共享内存,线程间容易发生竞争问题,如多个线程同时修改同一资源,因此必须使用同步机制(如锁、信号量)来协调访问,不当同步可能导致死锁或数据损坏。
资源占用方面:
- 多进程:因为每个进程都有独立的内存空间,因此多进程的内存占用较高。CPU 占用方面,多进程能充分利用多核并行处理,但对单核 CPU 的占用不及多线程。
- 多线程:因为每个线程共享同一进程的内存空间,因此多线程的内存占用较低。CPU 占用方面,多线程能充分利用单核的 CPU 资源,当一个线程等待时,其他线程可继续占用 CPU,减少空闲时间。
可靠性方面:
- 多进程:进程间互不影响,一个进程挂掉,程序也不会整个挂掉。
- 多线程:线程影响着进程,一个线程挂掉,将导致整个进程挂掉。
什么是协程
协程是单线程语言中用来模拟多线程的一种方式。
协程的作用,是在执行部分耗时长的函数时,可以先中断执行,去处理其他耗时短的函数,等到空闲时再继续执行该耗时长的函数,最终使得这一整个过程看上去像多线程。
比如正常的任务运行流程如下述:
开始 → 任务A → 阻塞等待 → 处理A → 任务B → 阻塞等待 → 处理B → 结束
这种流程我们称之为同步,任务顺序执行,必须等待前一个任务完成后才能启动下一个任务,代码执行呈线性流程。耗时操作会阻塞整个主线程,导致后续代码无法执行,降低效率。
那么协程的任务运行流程如下述:
开始 → 任务A → 发起请求 → 挂起A → 任务B → 发起请求 → 处理B → 响应A → 恢复任务A → 结束
这种流程我们称之为异步,任务独立执行,无需相互等待,发起操作后立即执行后续代码,结果通过回调或事件通知返回。耗时操作不会阻塞整个主线程,它会先挂起,待 CPU 空闲时再执行,然后通过回调或响应事件通知,恢复耗时操作后续的执行。

协程的优势
- 执行效率极高,因为子程序切换的是函数而不是线程,因此不会有切换线程的开销,所以和多线程相比,线程的数量越多,协程性能的优势越明显。
- 不需要多线程的锁机制,因为是单线程,所以不存在同时写数据的冲突,在控制共享资源时也不需要加锁,因此执行效率高很多。