进程、线程与协程

进程与线程

  • 在大多数情况下,线程是进程的组成部分,一个进程可以存在多个线程,这些线程并发执行共享进程的内存资源
  • 进程之间是相互独立的,不同进程具有不同的内存地址空间、代表程序运行的机器码、进程状态、操作系统资源描述符等
  • 操作系统调度到CPU中执行的最小单位是线程

线程与协程

  • 协程被认为是轻量级的线程。
  • 线程不同的是,操作系统内核感知不到协程的存在,协程的管理依赖于Go语言运行时自身提供的调度器
  • 调度方式来看
    • 协程是用户态
    • 协程的管理依赖于Go语言运行时的调度器
    • Go语言中的协程是从属于某一个线程的
    • 协程与线程的对应关系是:M:N
  • 上下文的切换速度
    • 协程的切换速度要快于线程
    • 原因是协程切换不需要经过操作系统用户态与内核态的切换,只需要保存极少的状态和寄存器变量值
  • 调度策略
    • 线程的调度在大部分时间是抢占式的,操作系统调度器为了均衡每个线程的执行周期,会定时发出中断信号强制执行线程上下文切换
    • 协程在一般情况下是协作式调度的,当一个协程处理完自己的任务之后,可以主动将执行权利让渡给其它协程
    • 说明协程不会被轻易的强占
  • 栈的大小
    • 协程栈默认是2KB
    • 线程的默认是2MB
    • Go语言中的协程栈在Go运行时的帮助下会动态检测栈的大小,并且动态扩容

进程、线程与协程
http://example.com/2023/04/25/进程、线程与协程/
Author
fuzunyuan
Posted on
April 25, 2023
Licensed under