原理
1:disable SMP
一个调度器对应一个运行队列
没有SMP支持的erlang VM 只有一个Scheduler运行于主线程,Scheduler从运行队列中取出需要运行的erlang进程和IO任务
![](http://dl2.iteye.com/upload/attachment/0107/6867/f6a1f5ce-7621-3ec0-9be8-6c3e2018f807.png)
2:enable SMP =
多个调度器对应一个运行队列:这时会比上面慢,因为锁保护
有SMP支持的erlang VM 可以有1-1024个Scheduler,每个Scheduler运行于一个独立的操作系统线程,操作系统决定它是否要在不同的核上面运行。由于多个Scheduler从同一个公共运行队列中去除需要运行的erlang进程和IO任务,所以对共享数据进行锁保护
![](http://dl2.iteye.com/upload/attachment/0107/6871/923f706c-9016-336b-b83b-bd08413f5789.png)
N个调度器,N个运行队列。每个调度器对应一个运行队列
![](http://dl2.iteye.com/upload/attachment/0119/1398/88846a91-c292-37ab-9d7d-8fc09b4ebe9d.png)
运行
从OTP R12B开始只要操作系统告知当前是多CPU(多核),SMP就会自动开启并设定Scheduler个数和CPU或核的数量一致:
![](http://dl2.iteye.com/upload/attachment/0107/6873/e3d1c92f-3b58-3331-beda-7390d3674c16.png)
开启和关闭SMP
erl -smp [auto|disable|enable]
启动erl时设置Scheduler数量
erl +S 2:2