erlang 脏调度器支持

# 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调用影响调度器上其他进程的问题。

 

 

 

 

 

你可能感兴趣的:(erlang)