进程线程协程关系

cpu的处理

  • 计算机的核心为cpu,它是计算机的运算和控制核心
  • 集成电路中的晶体管数量也在大幅度增长,大大的提升了cpu的性能
  • 根据摩尔定律,集成电路芯片中所集成的晶体管数量每隔18个月就翻一翻
  • 过于密集的晶体管虽然提高了cpu的处理性能,但也带来了单个芯片发热过高和成本过高的问题
  • 但是近年来受限于材料技术的发展,芯片中晶体管的数量增长已经放缓
  • 也就是说,程序已经无法简单的依赖硬件的提升来提高运行速度
  • 多核cpu的出现则是程序运行速度的另一个方向,硬件增长缓慢的情况下则尽量让软件最大化的利用cpu

并发和并行

并行

  • 指两个或多个程序在同一个时刻执行
  • 并行执行的程序,同一个时刻内都有多个程序在cpu中执行,这要求cpu需要有多核计算能力
  • 多个程序被分配到cpu的不同的核中被同时执行

并发

  • 两个或多个程序在同一个时间段内执行
  • 单核cpu也可以通过分时复用的方式给多个程序分配一定的执行时间片
  • 多个程序在cpu上被快速轮换的执行,从而在宏观上模拟出多个程序同时执行的效果
  • 由于cpu的执行效率非常高,时间片非常短,在各个程序间快速的切换,给人的宏观感觉就是好像同时在执行
  • 微观上实际上同一时刻只有一个程序在执行

内核空间和用户空间

  • 操作系统会把内存空间分为内核空间和用户空间
  • 内核空间的代码能够直接访问计算机的底层资源,为用户空间的代码提供计算机底层资源访问能力
  • 用户空间为上层应用程序的活动空间,无法直接访问计算机底层资源,需要借助 系统调用 库函数 等方式调用内核空间提供的资源
    进程线程协程关系_第1张图片

进程、线程和协程

进程
  • 进程是一个具有独立功能的程序 关于某个数据集合的一次动态执行过程
  • 是操作系统进行资源分配和调度的基本单位
  • 是应用程序运行的载体,
  • 动态性,结构性,独立性,并发性,异步性
线程
  • 线程则是程序执行过程中的一个单一的顺序控制流程
  • 是cpu调用和分派的基本单位
  • 线程是比进程更小的独立运行基本单元
  • 一个进程中可以拥有一个或者多个线程
  • 线程可以分为内核线程用户线程
  • 内核线程由操作系统管理调度,是内核调度实体,可以直接操作计算机底层资源,充分利用cpu多和并行计算的优势,线程切换时需要cpu切换到内核态,存在一定的开销,可创建的线程数量受操作系统的限制
  • 用户线程由用户空间的代码创建,管理和调度,保存在用户空间中,无法被操作系统感知,切换时也无须切换到内核态,切换高效并且开销小,理可创建的线程数量只和内存大小相关
协程
  • 协程是一种用户线程,属于轻量级线程(用户模拟的线程)
  • 协程的调度完全由用户代码控制,协程拥有自己的寄存器和栈上下文空间,并储存在用户空间。
  • 协程切换时无须切换到内核态,访问内核空间,切换速度极快,
  • 开发人员需要在用户空间,处理协程切换时上下文信息的保存和恢复,栈空间大小的管理的问题
  • 协程是基于线程的,内部实现上,维护了一组数据结构和n个线程,真正执行的还是线程,协程代码被扔进一个待执行队列中,由线程取出来执行,遇到异步io等操作则保存当前协程状态,去执行另外的协程,大概原理就是这样,利用并封装额操作系统的异步函数,比如linux的epoll,select和windows的iocp,event等
  • 缺点是协程的本质是个单线程,无法直接利用多核cpu的优势,需要通过协程和(进程或线程)的配合才能来利用多核cpu的能力,比如swoole,是通过协程和进程组合,所以工作worker量一般等于系统的核心数,才会最大化利用系统资源,不过我们日常所编写的大部分程序都是io密集型应用,协程有一定的提升优势,不适用于cpu计算密集型应用

欢迎扫码添加,一起交流哦!

  • 也可以点击公众号菜单或者回复微信获取
    进程线程协程关系_第2张图片

你可能感兴趣的:(php,go,python)