浏览 1921 次
锁定老帖子 主题:erlang的进程调度器工作流程
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-08
/* * schedule() is called from BEAM (process_main()) or HiPE * (hipe_mode_switch()) when the current process is to be * replaced by a new process. 'calls' is the number of reduction * steps the current process consumed. * schedule() returns the new process, and the new process' * ->fcalls field is initialised with its allowable number of * reduction steps. * * When no process is runnable, or when sufficiently many reduction * steps have been made, schedule() calls erl_sys_schedule() to * schedule system-level activities. * * We use the same queue for normal and low prio processes. * We reschedule low prio processes a certain number of times * so that normal processes get to run more frequently. */ Process *schedule(Process *p, int calls); erlang系统调度的核心就是这个函数。 schedule调度的顺序是这样的: 1. 首先处理timer超时。 2. 处理子进程退出的情况。 3. 处理port_task事件,也就是port的IO事件 4. 如果没有活跃的进程 就sys_schdule阻塞在底层的IO中。 5. 根据process的优先级选出一个进程来调度。 这5个调度schdule要去平衡调度的力度,以期公平。 void erl_sys_schedule(int runnable) { #ifdef ERTS_SMP ERTS_CHK_IO(!runnable); ERTS_SMP_LC_ASSERT(!ERTS_LC_IS_BLOCKING); #endif } check_io就阻塞在poll上等待IO时间的发生,也就是说如果系统不繁忙的时候所以的scheduler都在等待IO事件的发生。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |