进程、线程和协程的区别

一、概念

  • 进程:进程是系统资源分配的最小单位,每个进程有独立的地址空间。

一个进程通常分为数据区、代码区、堆区和栈区和PCB 等5个主要部分:

  • 程序代码区:也称为文本区,它包含待执行的程序指令。在多数操作系统中,这部分区域是只读的,以避免程序在运行时不小心将代码修改,引发错误。
  • 数据区:通常分为初始化的数据区和未初始化的数据区。初始化数据区存放静态变量和全局变量等程序在执行前已经赋予初值的数据。未初始化数据区用于存放未初始化的全局变量。
  • 堆区(heap): 程序在运行期间可以主动从堆区申请内存空间,这些内存由内存分配器分配并由垃圾收集器负责回收。
  • 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值、返回值等。它们会随着函数的创建而创建,函数的返回而销毁。
  • 线程:线程是cpu调度和执行的最小单位,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
  • 协程:协程是一种更轻量级的线程,协程的调度不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),与线程相比,多个协程共享同一个线程栈和寄存器状态,由程序进行调度。协程之间的切换只需要保存和恢复少量的状态信息,避免了线程切换大量的开销。而相比于协程。

二、 进程和线程的区别

  • 实现机制:进程是资源分配的基本单位,线程是cpu调度的最小单位。
  • 资源占用:每个进程都有独立的地址空间,而同一个进程的所有线程都共享该进程的所有资源,每个线程拥有自己的栈空间。
  • 系统开销:创建、销毁进程时,由于系统都要分配和回收资源,所以系统开销大于线程的创建。
  • 切换开销:每个进程都有独立的代码,程序之间的切换会有较大的开销。线程共享进程代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
  • 关系上的区别:一个进程至少有一个线程,程序调度的单位是线程,而不是进程。

三、线程和协程的区别

线程的资源占用是MB级别的,一个协程只需要占用2~4kb。每个线程都有自己的线程栈空间和寄存器状态,由操作系统进行调度。线程之间的切换需要保存和恢复线程栈和寄存器状态,这会带来一定的开销。而在协程中,多个协程共享同一个线程栈和寄存器状态,由程序进行调度。协程之间的切换只需要保存和恢复少量的状态信息,避免了线程切换大量的开销。

  • 调度方式:线程的调度是由操作系统内核管理的,而协程完全由程序所控制(也就是在用户态执行)。
  • 资源占用:线程的资源占用是MB级别的,一个协程只需要占用2~4kb。每个线程都有自己的线程栈空间和寄存器状态,由操作系统进行调度。而在协程中,多个协程共享同一个线程栈和寄存器状态,由程序进行调度。
  • 切换开销:线程之间的切换需要保存和恢复线程栈和寄存器状态,涉及到内核态和用户态之间的切换,开销较大。协程之间的切换只需要保存和恢复少量的状态信息,通常只在用户态之间即可完成,性能开销相交于线程更小。
  • 适用场景:线程适合CPU密集型任务,如需要大量计算、并行处理等。协程更适合IO密集型任务,如网络请求、事件循环处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值