🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
进程占用太多资源,线程切换资源占用少但是会有锁、竞争冲突等问题。 线程分为内核态线程和用户态线程 一个“用户态线程”必须要绑定一个“内核态线程”。 但是 CPU 并不知道有 “用户态线程” 的存在,它只知道它运行的是一个 “内核态线程”(Linux 的 PCB 进程控制块)。 内核线程叫“线程”,用户线程叫“协程”。 ## 3种协程和线程的映射关系: N:1 N个协程绑定一个线程 优点是协程在用户态线程即完成切换,不会陷入到内核态,这种切换非常的轻量快速; 缺点是1个进程的所有协程都绑定在1个线程上。 * 某个程序用不了硬件的多核加速能力 * 一旦某协程阻塞,造成线程阻塞,本进程的其他协程都无法执行了,根本就没有并发的能力了。 1:1 1个协程绑定一个线程 缺点:协程的创建、删除和切换的代价都由CPU完成。 M:N M个协程绑定1个线程,克服了以上的缺点,但实现起来最为复杂。 协程和线程是有区别的,线程由CPU调度是抢占式的,协程由用户态调度是协作式的, 一个协程让出CPU后,才执行下一个协程。