可能重复:
Technically why is processes in Erlang more efficient than OS threads?
每次提到Erlang进程或绿线程或协程时,与内核线程相比,它们总是被描述为“轻量级”。通常给出的原因是内核线程涉及上下文切换很慢。
但是关于上下文切换究竟是什么呢?与在用户区切换绿色线程相比,它有多慢?
上下文切换是主要(唯一?)因素,它解决了事件驱动程序(如Nignx)和多处理程序(如Apache)之间性能和内存消耗的差异?
答案 0 :(得分:12)
在抢占式,单片式,多任务操作系统上进行上下文切换涉及两种路径之一,即通过某些系统服务调用(睡眠,互斥锁获取,等待事件,阻塞I / O)对调度程序的隐式收益或通过中断和调度程序决定交换正在运行的任务。
当调度程序交换任务时,会发生一些重量级的事情:
根据我的理解,绿色线程任务非常简单。用户模式调度程序指示协程运行,直到协程生成。以上几点不同:
简而言之,用户模式中的上下文切换涉及一些库调用和写入堆栈指针寄存器。内核模式中的上下文切换涉及中断,用户/内核转换以及系统级行为,如地址空间状态更改和缓存刷新。