本文的运行环境:Windows 10系统,go1.20版本,戴尔g3电脑。
golang线程和协程的区别:
1. 调度方法
线程:线程根据CPU时间片进行抢占式调度。 操作系统通过中断信号(定时器中断、I/O设备中断等)进行线程上下文切换。 当发生线程上下文切换时,需要从操作系统用户态转移到内核态,并保存状态信息; 当切换到下一个要执行的线程时unity协程和线程的区别,需要加载状态信息并从内核态传输到操作系统用户态。
协程:协程存在于用户态,由go语言运行时调度器调度。 协程属于某个线程。 多个协程可以调度到一个线程中。 一个协程也可以切换到多个线程执行。 因此3D交通工具,协程和线程是多对多(M:N)的关系。
2. 调度策略
线程:抢占式调度。 为了平衡各个线程的执行周期,操作系统调度程序会定期发出中断信号来强制线程上下文切换。
协程:协作调度。 协程处理完自己的任务后,可以主动将执行权转移给其他协程,不会轻易被抢占。 只有当协程运行时间过长后,Go语言调度器才会强制抢占其执行。
3. 上下文切换速度
线程:线程上下文的切换需要在操作系统的用户态和内核态之间进行切换,切换速度约为1~2微秒。
协程:协程是用户模式下的轻量级线程。 协程的切换不需要用户态和内核态之间的切换,切换时只需要保存很少的状态值。 因此,切换速度要快数倍3D素材,大约0.2微秒左右。 (比线程切换快约10倍)
4. 堆栈大小
线程:线程的堆栈大小一般在创建时指定。 Linux和Mac上默认的堆栈大小一般为8MB(可以通过ulimit -s查看)。 2000个线程需要16G虚拟内存。
协程:默认的go协程堆栈大小为2KBunity协程和线程的区别,16G虚拟内存可以创建超过800万个协程。 在实践中,数千个协程的存在是很常见的。