2019独角兽企业重金招聘Python工程师标准>>>

Erlang调度器主要完成对Erlang进程的调度,它是Erlang实现软件实时和进程之间公平使用CPU的关键。Erlang运行时,有4种任务需要被调度:进程,Port,Linked-in driver,Erlang虚拟机的系统级活动。

Erlang调度器主要有以下特点:

1. 进程调度运行在用户空间 :Erlang进程不同于操作系统进程,Erlang的进程调度也跟操作系统完全没有关系,是由Erlang虚拟机来完成的;

2. 调度是抢占式的:每一个进程在创建时,都会分配一个固定数目的reduction(R15B中,这个数量默认值是2000),每一次操作(函数调用),reduction就会减少,当这个数量减少到0时或者进程没有匹配的消息时,抢占就会发生(无视优先级);

3. 每个进程公平的使用CPU:每个进程分配相同数量的reduction,可以保证进程可以公平的(不是相等的)使用CPU资源

4. 调度器保证软实时性:Erlang中的进程有优先级,调度器可以保证在下一次调度发生时,高优先级的进程可以优先得到执行。

Reduction

受操作系统中基于时间片调度算法的影响,一开始知道有reduction这个概念时,一直想搞清楚这个reduction到底对应多长的绝对时间,不过,从Erlang本身对reduction的使用来看,完全没有必要纠结这个问题。《Erlang编程指南》一书中对reduction的说明如下:

程序中的每一个命令,无论它是一个函数调用,还是一个算术操作,或者内置

函数,都会分配一定数量的reduction。虚拟机使用这个值来衡量一个进程的活

动水平。

看到这个定义的第一反应是,如果一个函数调用的执行时间很长怎么办?那不是一个进程会长时间的占用资源?Erlang对这个问题的答案是Trap机制,上一篇中有提到过,它的其中一个功能就是把费时的操作分阶段做,比如lists:reverser和lists:member可能会根据输入的不同会有很大的变化,所以就会使用到Trap机制:先执行一段时间,再Trap,然后再次调度到的时候再继续执行。

SMP支持

从R11B(2006)Erlang开始支持SMP(Symmetrical Multi Processor,也就是多核)。Erlang对SMP的支持分为以下几个阶段:

1). 单调度器、单运行队列:调度器运行在虚拟机主进程中的一个线程中,从单个任务队列中获取运行进程,因为只有一个线程,所以对运行队列的访问不需要锁;

2). 多调度器、单运行队列:调度器的个数可以自定义(参见erl命令的+S参数,默认数量同CPU核的数量),每个调度器运行在一个线程中,但是只有一个运行队列,所有调度器都从同一个运行队列获取运行进程,所以会涉及到共享资源的访问,需要用到锁。

3). 多调度器、多运行队列:每个调度器都绑定有一个运行队列,每个调度器都从各自的运行队列中获取运行进程。相比单运行队列,多运行队列会减少锁冲突,提高性能,但是,因为涉及到多运行队列,就必需要考虑负载问题:如果一个调度器很忙,另一个很闲,那怎么办?Erlang虚拟机存在一个任务迁移的逻辑,来保证各个调度器达到平衡。

进程优先级

Erlang进程有四种优先级:max, high, normal, low(max只在Erlang运行时系统内部使用,普通进程不能使用)。Erlang运行时有两个运行队列对应着max和high优先级的运行任务,normal和low在同一个队列中。

调度器在调度发生时,总是首先查看具体max优先级的进程队列,如果队列中有可以进行的进程,就会运行,直到这个队列为空。然后会对high优先级的进程队列做同样的操作(在SMP环境,因为同时有几个调度器,所以在同一时间,可能会有不同优先级的任务在同时运行;但在同一个调度器中,同一时间,肯定是高优先级的任务优先运行)。

普通进程在创建时,一般是normal优先级。normal和low优先级的进程只有在系统中没有max和high优先级的进程可运行时才会被调度到。通常情况下,normal和low优先级的进程交替执行,low优先级获得CPU资源相对更少(一般情况下):low优先级的任务只有在运行了normal优先级任务特定次数后(在R15B中,这个数字是8)才会被调度到(也就是说只有在调度了8个normal优先级的进程后,low优先级的进程才会被调度到,即使low优先级的进程比normal优先级的进程更早进入调度队列,这种机制可能会引起优先级反转:假如你有成千上万的活动normal进程,而只有几个low优先级进程,那么相比normal进程,low优先级可能会获得更多的CPU资源)。

调度算法的实现见[$OTP_SRC/erts/emulator/beam/erl_process.c --> schedule],下面的图片是算法流程图,来源于这篇论文:Characterizing the Scalability of Erlang VM on Many-core Processors。

转载于:https://my.oschina.net/jackliang55/blog/215403

Erlang并发机制 –进程调度相关推荐

  1. 关于 许式伟谈Go Erlang并发编程差异

    写在开头: 这篇文章是ECUG2014年七牛CEO许式伟的演讲稿.这篇文章很详细的分析了Go和 Erlang在实现并发编程的差异,但是有些内容可能因为作者本人个人情感的一些原因有些出入导致了知乎上的一 ...

  2. 并发机制:CSP vs Actor模型以及Golang实现

    作者:花与火山石 原文链接:https://blog.csdn.net/qq_32702033/article/details/104415434 CSP & Actor Model 本文将简 ...

  3. Golang和Erlang消息传递机制对比

    上一篇文章介绍了 Go 和 Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制 简要对比 Erlang和Go虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erla ...

  4. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

  5. Java高并发编程(二):Java并发机制的底层实现机制

    Java代码在编译后会变成Java字节码,字节码在之后被类加载机制加载到JVM中,JVM执行字节码,最终需要转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. ...

  6. Java并发机制底层实现原理-volatile

    章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code->Java class->JVM->汇编指令->cpu执行 ...

  7. Strom程序的并发机制,配置并行度(代码实现)、动态改变并行度,local or shuffle分组,分组的概念以及分组类型

    1.Storm程序的并发机制 1.1.概念  Workers (JVMs): 在一个物理节点上可以运行一个或多个独立的JVM 进程.一个Topology可以包含一个或多个worker(并行的跑在不同 ...

  8. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  9. Storm 05_Storm并发机制通信机制

    一.Storm并发机制 Worker processes Executors (threads) Tasks Worker – 进程 一个Topology拓扑会包含一个或多个Worker(每个Work ...

最新文章

  1. Java -- JDBC 学习--数据库连接池
  2. Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
  3. 十大排序算法之归并排序
  4. 「区块链+人工智能」:来自谷歌、IBM、百度的真实案例
  5. jQuery框架学习第三天:如何管理jQuery包装集
  6. android 右边抽屉,android – 抽屉在右侧抽屉中切换
  7. android so导致启动慢,谈谈Android NDK中动态链接库(.so文件)的优化
  8. 5、最长回文子串(python)
  9. Java jar包在线反编译
  10. U盘数据丢失后怎样恢复
  11. 笔记-神经网络滑模控制设计方法
  12. WebSocket模拟群聊
  13. 笔记本电脑无法连接WiFi怎么办?
  14. android透明主题引起的快速点击activity触发退到桌面
  15. Java验证辛钦大数定理
  16. 机器学习--逻辑回归模型(Logistic Regression)
  17. python小技巧5 调整图片像素输出更清晰
  18. 模拟电路设计(26)---D/A转换器电路原理
  19. opencv3_java 修改图像大小Resize Imgproc.resize
  20. 用Project软件编制项目计划【总结】

热门文章

  1. 2014_beijing_onsite
  2. MSG_PEEK标志
  3. ucosii中消息队列、消息邮箱、信号量的区别
  4. 【Linux网络编程学习】I/O多路复用——epoll
  5. html css 核心设计理念
  6. TCP send 阻塞与非阻塞
  7. PIE SDK主成分变换
  8. 蓝桥杯 方格填数(全排列+图形补齐)
  9. python入门23 pymssql模块(python连接sql server增删改数据 )
  10. Java作业09-异常