`
jzhihui
  • 浏览: 268423 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang并发机制 –进程调度

阅读更多

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

 

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

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

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

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

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

 

Reduction

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

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

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

动水平。

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

 

SMP支持

R11B2006Erlang开始支持SMPSymmetrical Multi Processor,也就是多核)。ErlangSMP的支持分为以下几个阶段:

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

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

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

 

进程优先级

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

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

普通进程在创建时,一般是normal优先级。normallow优先级的进程只有在系统中没有maxhigh优先级的进程可运行时才会被调度到。通常情况下,normallow优先级的进程交替执行,low优先级获得CPU资源相对更少(一般情况下):low优先级的任务只有在运行了normal优先级任务特定次数后(在R15B中,这个数字是8)才会被调度到(也就是说只有在调度了8normal优先级的进程后,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

0
0
分享到:
评论
2 楼 chuqingq 2013-11-17  
很不错,学习!
1 楼 AsIMovedon 2013-04-10  
好文章,学习了。

相关推荐

    erlang并发编程 .pdf

    在《Erlang并发编程》一书中,详细介绍了Erlang语言的核心并发模型和编程范式,包括但不限于串行编程、进程创建、进程间通信、分布式编程以及错误处理等。书中指出Erlang的并发性能得益于其轻量级进程,这些进程是由...

    erlang的timer和实现机制

    Erlang的定时器实现机制基于Erlang的进程调度和消息传递机制。Erlang中的每个定时器都是一个单独的进程,当设置定时器时,实际上是创建了一个新的进程,并将其加入到时间表中。这个时间表由Erlang虚拟机(VM)维护,...

    erlang编程 Introducing Erlang

    它负责解释Erlang字节码,提供内存管理、垃圾回收和并发调度等功能。 ### 10. 语言特性 Erlang的语法简洁,支持模式匹配、函数式编程、列表处理和递归等特性。它的动态类型系统和强大的类型推断让代码更加灵活。 ...

    并发需求下的Scala及Erlang语言的比较与使用

    - **Erlang**: 在Erlang中,轻量级进程被当作Actor单元,由Erlang虚拟机(BEAM)直接管理和调度。这些进程具有极低的内存占用和切换开销,非常适合大规模并发处理。Erlang的并发模型强调无共享内存和不可变数据结构...

    erlang programming

    Concurrent Programming in ERLANG可能深入讲解如何设计和管理并发进程,以及如何处理进程间的同步和异步通信。 3. **分布式系统**:“面对软件错误构建可靠的分布式系统.pdf”强调了Erlang在构建分布式系统时的...

    erlang 深度分析

    - **调度**: 进程调度策略是基于优先级的,优先级高的进程会优先被调度执行。 #### 2. 性能定量分析 - **工具**: 使用`observer`和`sys`等内置工具进行性能监测。 - **指标**: - **内存使用**: 包括总内存、堆...

    Concurrent Programming in ERLANG (P1-90)

    客户端-服务器模型是Erlang并发编程中常见的一种架构模式。服务器进程负责接收来自客户端进程的请求,并根据请求提供相应的服务。 **5.6 进程调度、实时性和优先级** 进程调度决定了进程何时以及如何被选择来执行...

    erlang深度分析.pdf

    Erlang的性能定量分析涉及对VM行为的深入研究,包括内存使用、进程调度以及垃圾回收(GC)等方面的性能指标。这涉及到监控ERTS的运行时参数,例如ETS(Erlang Term Storage)使用的内存、进程的数量和状态,以及SMP...

    erlang 24.0版本 win64 位

    在24.0版本中,可能会有对进程调度或通信机制的优化,使得并发执行更加平滑,减少了上下文切换的开销。这对于构建大规模并行系统至关重要,因为Erlang的轻量级进程可以轻松地创建成千上万个并发实体。 此外,Erlang...

    erlang 部分源码

    Erlang的并发模型基于进程(processes),这些进程是轻量级的,并且具有内置的消息传递机制。源码中可能包含了`erts`(Erlang Run-Time System)的相关部分,它负责进程的创建、调度和通信。了解这些内部实现有助于...

    erlang 程序设计 源码

    进程间通信通过消息传递实现,这是Erlang并发模型的核心。 2. **故障恢复与容错**:Erlang支持热代码替换,可以在运行时更新代码而不会中断服务。此外,进程之间独立运行,一个进程的崩溃不会影响其他进程,这使得...

    programming erlang src code

    3. 并发模型:Erlang的并发模型基于actor模型,每个进程都有自己的状态,并通过消息进行交互。这种模型有助于实现分布式和容错系统,因为进程之间的通信是异步的,不会因某个进程阻塞而影响整个系统。 4. 热代码...

    erlang官方资源包

    总结起来,"otp_src_21.3.tar.gz"是一个包含Erlang OTP框架源代码的压缩包,对于理解Erlang并发模型、开发基于OTP的系统以及搭建RabbitMQ服务器至关重要。通过学习和使用这些资源,开发者可以构建出高效、健壮的...

    poolboy erlang

    在Erlang这种并发性极强的编程语言中,线程池的概念同样重要,它可以帮助开发者有效地管理和调度并发进程,提高系统的响应速度和整体性能。 线程池是一种进程管理机制,它预先创建了一组工作进程,当有新的任务到来...

    inside Erlang VM3

    Erlang是一种通用、并发、强容错的编程语言,最初由爱立信公司开发,旨在解决电信系统的高并发、高可靠需求。它运行在Erlang虚拟机(Erlang Virtual Machine, ERTS)之上,ERTS提供了语言的基础执行环境。 #### ...

    erlang简介

    8. **多核心支持**:Erlang运行时系统(ERTS)充分利用多核CPU资源,通过调度器和进程分配策略,确保多处理器环境下的高效运行。 9. **IO处理**:Erlang的IO系统基于Unix哲学,将所有设备视为文件,支持多种IO模型...

    Erlang语言介绍[E文]下

    - **预抢占式调度**:Erlang 的虚拟机负责进程的调度,采用预抢占式的调度策略,这意味着虚拟机会根据需要自动切换进程,而无需依赖于操作系统。 #### 三、函数示例 为了更好地理解 Erlang 中的进程如何工作,我们...

    erlang程序设计

    BEAM提供了垃圾回收、进程调度和内存管理等服务。 7. 分布式特性:Erlang支持多节点集群,节点间可以透明地通信,这使得构建分布式系统变得简单。 8. 数据类型:Erlang有多种内建数据类型,包括原子(atom)、整数...

Global site tag (gtag.js) - Google Analytics