协程是一种轻量级线程,相比于线程操作系统内核是无法感知到协程的存在的,在Golang中协程的运行是依赖于它的调度器的,而线程的运行是需要操作系统内存资源的,并发运行时会带来上下文的切换,从用户态转移到内核态,还需要加载寄存器,甚至在上下文切换时会出现CPU缓存失效问题,而协程的出现能够更好地提升程序的并发,合理的运用CPU资源,而协程和线程主要不同在于调度方式、上下文切换的速度、调度策略、栈的大小等,如下。
1、调度方式: 协程是用户态的,在Golang中协程的运行依赖于调度器,协程和线程之间的关系是多对多的,线程是在进程之内的 而,进程和线程的关系是一对多的,线程和协程的关系如下图:
2、上下文切换速度 协程的速度是要快于线程的,主要原因是因为线程需要上下文的切换而协程是完全不需要的,前面所说的,还会进行保留寄存器会,将会影响速度的。
3、调度策略 线程是属于抢占式的,为了均衡每个线程的生命周期会定时的发出中断信号进行执行上下文切换,而协程是协作式的,只有完成了自己的任务,就会让出权限。
4、栈的大小 线程的栈大小是比较大的属于Mb级别的,而协程是Kb级别的默认2Kb。而最大的区别在协程的栈容量是可以进行动态的扩容的,总体来看是比较轻量的。
以上便是线程和协程的主要区别,希望对你有帮助。