(技术分析)golang线程和协程的区别及操作系统

(技术分析)golang线程和协程的区别及操作系统

golang线程和协程有什么区别

本文的运行环境: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万个协程。 在实践中,数千个协程的存在是很常见的。

文章来源:https://www.php.cn/faq/560845.html