【编程性能-协程】

前言

在对比Erlang、Golang、Java时关注到了协程,在了解相关知识后总结如下,欢迎指正。
1. 协程简介
2. 为什么会有协程
3. 协程原理
4. 参考链接

1. 协程简介

  • 协程(Coroutine)也叫微线程(MicroThread),纤程(Fiber),绿色线程(GreenThread).
  • 协程是一种用户态的轻量级线程.在golang中原生提供了相关API,python和java需要借助第三方库使用.
  • 一个操作系统中可以有多个进程,一个进程中可以有多个线程,一个线程中有多个协程.

2. 为什么会有协程

因为线程对CPU的利用不够高效.CPU的速度是远远高于IO读取速度(计算机三级存储体系),操作系统IO子系统(CPU)与外设通信交互的方式有轮询、设备中断、DMA,程序为单线程时表现为同步阻塞等待IO,多线程时系统性能会提升,但线程越多CPU的ContextSwitch就越多,CPU的调度就开销越大(内核态的抢占式调度),同时线程越多占用内存量也越多.(在Java中于64位系统默认Stack大小是1024KB,线程占用内存量约为4MB.)
举例,传统的J2EE系统都是基于每个请求占用一个线程去完成完整的业务逻辑(包括事务)。所以系统的吞吐能力取决于每个线程的操作耗时。如果遇到很耗时的I/O行为,则整个系统的吞吐立刻下降,这也是为什么很多人都说磁盘数据库是瓶颈的原因(读写磁盘即IO)。这里的耗时其实是该线程在抢占到CPU的时段内一直等待I/O返回,期间CPU处于阻塞、空闲状态,并且期间会有很多无效的ContextSwitch开销.
于是有人提出解决方案:协程.

3. 协程原理

协程位于线程内,一个线程中可以有多个协程,由于线程是操作系统运算调度的最小单位,所以协程拥有自己的寄存器上下文和栈,同时同一线程内的多个协程是串行的,无法利用多核.
协程的调度是用户态的(随着coder的程序设计而调度切换),在协程A遇到阻塞时,立刻yield给下一个协程B,并且记录当前栈上的数据,阻塞完后立刻再找一个线程恢复栈并把阻塞的结果放到这个线程上跑.该过程中没有产生CPU的ContextSwitch开销,而自己的ContextSwitch开销是阻塞完成之后才notify线程以及CPU运算,其开销远小于前者.

4. 参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值