要理解Fibers首先需要对抢占式多任务和协作式多任务有所了解
抢占式是指暂停或中断正在执行的计算任务,而不是与其合作。中断后再继续恢复该任务的执行,这种改变又称为上下文切换。其缺点在于操作系统可能会在一个不适当的时间进行上下文切换。
例如:Linux的调度程序特权任务Scheduler
采用的就是取消进程任务,而不是与其合作。
早期的多任务处理系统会自愿割让时间给另一个应用程序,这种方法有许多操作系统支持,被称为协作多任务处理。协作多任务依赖于线程,一旦停止则放弃控制权。其缺陷是编写拙劣的代码会堵塞整个系统。
例如:实时嵌入式系统往往采取协作多任务处理方式以获取真正的实时高性能。
什么是Fibers呢?
Fibers是一个轻量的线程,也称为绿色线程。
Fibers是一个可以在Linux等抢占式线程调度下执行协作多任务的Node.js线程库包。
Fibers是一个流程或应用级别的概念,并不对应操作系统的线程。
Fibers提供类似执行流的线程,当操作系统线程是抢占式调用时,开发人员可使用Fibers实现协作多任务。
Fibers的概念类似于协程coroutines
,执行时可以被程序暂停或继续。
进程VS线程VS协程VS纤程
在操作系统中,除了进程和线程外,还有一种较少应用的纤程Fiber
,又称为协程Coroutine
。Fiber常常拿来跟线程做对比,对于操作系统而言,它们都是轻量级的运行态。
通常认为Fiber比线程更加轻量开销更小,不同之处在于:Fiber是由线程或Fiber创建的,Fiber调度完全由用户代码控制。对系统内核而言,是一种非抢占式的调度方式。
Fiber实现了协作式多任务,而线程和进程则受内核调度,依照优先级实现抢占式的多任务。
系统内核是不知道Fiber的具体运行状态,Fiber的使用其实与操作系统是无关的。
Node.js中的Fibers
在Node.js中单线程是仅针对JavaScript而言的,其底层充斥着多线程。如果需要在JavaScript中实现多线程,常见的作法是编写C++的addon来绕过JavaScript的多线程机制。不过这种方法增加了开发调试的成本和难度。
Node.js中node-fibers
库为Node提供了纤程的功能,node-fibers
采用C语言编写。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200770.html原文链接:https://javaforall.cn