# dirty shceduler
##简介
在 Erlang 虚拟机的层面,NIF 调用是不会被抢占的,因此运行时间过长的 NIF 会影响其所在的调度器上的所有其他进程的调度。erlang R17引入脏调度器一定程度上解决了这个问题。
脏调度器本质上和普通调度器是一样的,也是运行在虚拟机中的调度器线程,但是这种调度器专门运行长时运行的 NIF,R17允许将长时运行的NIF直接丢到脏调度器上去跑。通过调用enif_schedule_dirty_nif 将需要长时运行的 NIF 函数丢到脏调度器上。长时运行的函数返回的时候要调用 enif_schedule_dirty_nif_finalizer 函数,表示从脏调度器返回到了普通调度器。
## 脏调度器支持
### 环境
cpu需要支持多核
### erlang 源码编译安装
编译参数:
--enable-hipe --enable-kernel-poll --enable-threads --enable-sctp --enable-smp-support --enable-dirty-schedulers --disable-silent-rules
Windows下暂时没有找到编译方法,linux下编译通过。
安装完成后启动erlang,调用erlang:system_info(dirty_cpu_schedulers),返回数字表示支持脏调度器,否则不支持。
### 编码实现
R17和 R18脏调度器的使用是调用不同的API实现的,可以参考网上的相关文档。在具体代码里面可以根据版本号,确定不同的函数调用
## 结语
目前脏调度器属于实验性质的,相关参考文档也不多。脏调度器也不能彻底解决NIF调用影响调度器上其他进程的问题。