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

erlang的IO调度

阅读更多
erlang的调度有2种: 1. 进程调度 2. IO调度。网络程序的事件来源基本上只有2种:IO和定时器。IO事件有可能是大量的, 不可预期的,所以在设计上要考虑和进程调度平衡。erlang的
erl_port_task就是为这个目标设计的。

poll检查到io时间的时候,会回调iread和oready函数。这2个会把这个队列加到porttask的调度队列去。

static ERTS_INLINE void
iready(Eterm id, ErtsDrvEventState *state)
{
    if (erts_port_task_schedule(id,
&state->driver.select->intask,
ERTS_PORT_TASK_INPUT,
(ErlDrvEvent) state->fd,
NULL) != 0) {
stale_drv_select(id, state, DO_READ);
    }
}

void
ERTS_CIO_EXPORT(erts_check_io)(int do_wait)
{
...
if ((revents & ERTS_POLL_EV_IN)
    || (!(revents & ERTS_POLL_EV_OUT)
&& state->events & ERTS_POLL_EV_IN))
    iready(state->driver.select->inport, state);
else if (state->events & ERTS_POLL_EV_OUT)
    oready(state->driver.select->outport, state);
    }
...
}



/*
* Run all scheduled tasks for the first port in run queue. If
* new tasks appear while running reschedule port (free task is
* an exception; it is always handled instantly).
*
* erts_port_task_execute() is called by scheduler threads between
* scheduleing of processes. Sched lock should be held by caller.
*/

int erts_port_task_execute(void)
{
...
switch (ptp->type) {
case ERTS_PORT_TASK_FREE: /* May be pushed in q at any time */
    erts_smp_tasks_lock();
    if (io_tasks_executed) {
ASSERT(erts_port_task_outstanding_io_tasks >= io_tasks_executed);
erts_port_task_outstanding_io_tasks -= io_tasks_executed;
    }
    goto free_port;
case ERTS_PORT_TASK_TIMEOUT:  /*driver层面的timer超时时间*/
    erts_port_ready_timeout(pp);
    break;

case ERTS_PORT_TASK_INPUT: /*IO input*/
   erts_port_ready_input(pp, ptp->event);
    io_tasks_executed++;

    break;
case ERTS_PORT_TASK_OUTPUT: /*IO output*/
   erts_port_ready_output(pp, ptp->event);
    io_tasks_executed++;

    break;
case ERTS_PORT_TASK_EVENT:
    erts_port_ready_event(pp, ptp->event, ptp->event_data);
    io_tasks_executed++;
    break;
default:
    erl_exit(ERTS_ABORT_EXIT,
     "Invalid port task type: %d\n",
     (int) ptp->type);
    break;
}
...
}


void
erts_port_ready_input(Port *p, ErlDrvEvent hndl)
{
    ERTS_SMP_CHK_NO_PROC_LOCKS;
    ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(p));

    ASSERT((p->status & ERTS_PORT_SFLGS_DEAD) == 0);

    if (!p->drv_ptr->ready_input)
missing_drv_callback(p, hndl, DO_READ);
    else {
(*p->drv_ptr->ready_input)((ErlDrvData) p->drv_data, hndl);  /* 真正干活的地方 */
/* NOTE some windows drivers use ->ready_input for input and output */
if ((p->status & ERTS_PORT_SFLG_CLOSING) && erts_is_port_ioq_empty(p)) {
    terminate_port(p);
}
    }
}

在erlang的schedule里会在适当的时间执行erts_port_task_execute消耗掉IO事件。执行的时间和次数主要和process平衡。


分享到:
评论

相关推荐

    erlang深度分析.pdf

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

    erlang简介

    9. **IO处理**:Erlang的IO系统基于Unix哲学,将所有设备视为文件,支持多种IO模型如kernel poll(如epoll、kqueue),并使用定时器处理和逻辑处理(process、coroutine、fiber)等机制,优化了I/O性能。 10. **...

    erlang 部分源码

    源码中可能包含了`erts`(Erlang Run-Time System)的相关部分,它负责进程的创建、调度和通信。了解这些内部实现有助于理解Erlang如何高效地处理并发。 2. **BEAM虚拟机** BEAM是Erlang虚拟机的缩写,它是Erlang...

    Inside Erlang VM

    ERTS(Erlang Run-Time System)是Erlang VM的一部分,包含约20万行C代码和几千行Erlang代码,提供了诸如IO处理、定时器管理和逻辑处理等功能。 ERTS启动过程类似于一个小型的操作系统,初始化系统资源后,通过...

    erlang并发编程 .pdf

    标准库部分则介绍了io、file、lists和code等模块,这些模块为Erlang编程提供了丰富的工具集。 翻译计划部分介绍了翻译计划的发起人连城,以及CPiE-CN翻译志愿者团队。志愿者们负责翻译各个章节,并且整个翻译过程...

    scala erlang groovy python 原理 比较 分析

    Erlang的虚拟机(BEAM)提供了高效的进程调度和故障恢复机制,使其成为构建分布式系统的理想选择。 ### Groovy Groovy是一种面向对象的脚本语言,运行在Java平台上。它与Java高度兼容,能够无缝集成到现有的Java...

    vmstats:用于生成有关 Erlang VM 的信息的微型 Erlang 应用程序

    vmstats 是一个小型的 Erlang 应用程序,它收集 Erlang VM 上的指标并将它们发送到一个可配置的接收器(例如,StatsD)。 特征 vmstats 收集的不同指标包括: error_logger队列长度 加载的模块数 进程数 进程限制 ...

    tcp_client:一个Erlang TCP客户端连接管理器

    - `tcp_client`通常会包含一个主控制器进程,负责创建、管理和调度TCP连接。 - 每个TCP连接对应一个工作进程,负责与服务器的通信。 - 主控制器可能会维护一个状态表,记录连接的状态信息,如连接的IP地址、端口...

    otp_win_64_24.0.exe

    4. erts(Erlang Run-Time System):包括内存管理、错误处理和调度器等核心组件。 5. 应用框架:如Mnesia数据库系统、公共接口服务器(COS)和Web服务器(Yaws或Inets)等,方便开发特定用途的应用。 使用OTP Win...

    global:Erlang的包装

    nil -> IO.puts("调度器未找到") pid -> GenServer.call(pid, :fetch_task) end end ``` 总之,Elixir 中对 Erlang 的 `global` 模块的包装,是为了提供更好的互操作性和一致性,使开发者在利用 Erlang 的分布式...

    rabbitmq-linux-3.7.19.zip

    wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.19.rabbitmq37-generic-erlang$(erl -eval 'io:fwrite("~s~n", [erlang:system_info(otp_release)]).' -noshell)/rabbitmq-signing-key-...

    潜在语言的残篇-Rust开发

    强类型行为,强大的推理功能可最大程度地减少类型噪声,从一开始就利用io_uring,不可变消息传递,乐观的STM构建运行时,并且通常关注现代调度研究,该运行时会跟踪整体利用率饱和度旨在最大程度地利用利用率,同时...

Global site tag (gtag.js) - Google Analytics