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

erlang进程退出时清扫的资源

阅读更多
ERTS要终止一个经常的时候调用一下函数

void
erts_do_exit_process(Process* p, Eterm reason)
{
    ErtsLink* lnk;
    ErtsMonitor *mon;
#ifdef ERTS_SMP
    erts_pix_lock_t *pix_lock = ERTS_PID2PIXLOCK(p->id);
#endif

    p->arity = 0; /* No live registers */
    p->fvalue = reason;
   
#ifdef ERTS_SMP
    ERTS_SMP_CHK_HAVE_ONLY_MAIN_PROC_LOCK(p);
    /* By locking all locks (main lock is already locked) when going
       to status P_EXITING, it is enough to take any lock when
       looking up a process (erts_pid2proc()) to prevent the looked up
       process from exiting until the lock has been released. */
    erts_smp_proc_lock(p, ERTS_PROC_LOCKS_ALL_MINOR);
#endif
   
    if (erts_system_profile_flags.runnable_procs && (p->status != P_WAITING)) {
    profile_runnable_proc(p, am_inactive);
    }

#ifdef ERTS_SMP
    erts_pix_lock(pix_lock);
    p->is_exiting = 1;
#endif
   
    p->status = P_EXITING;

#ifdef ERTS_SMP
    erts_pix_unlock(pix_lock);

    if (ERTS_PROC_PENDING_EXIT(p)) {
/* Process exited before pending exit was received... */
p->pending_exit.reason = THE_NON_VALUE;
if (p->pending_exit.bp) {
    free_message_buffer(p->pending_exit.bp);
    p->pending_exit.bp = NULL;
}
    }

    cancel_suspend_of_suspendee(p, ERTS_PROC_LOCKS_ALL);

    ERTS_SMP_MSGQ_MV_INQ2PRIVQ(p);
#endif

    if (IS_TRACED_FL(p,F_TRACE_PROCS))
trace_proc(p, p, am_exit, reason);

    erts_trace_check_exiting(p->id);

    ASSERT((p->trace_flags & F_INITIAL_TRACE_FLAGS) == F_INITIAL_TRACE_FLAGS);

   
    /* 清除进程用的定时器 */
    cancel_timer(p); /* Always cancel timer just in case */

    /* 清除bif定时器 */
    if (p->bif_timers)
erts_cancel_bif_timers(p, ERTS_PROC_LOCKS_ALL);

    /* 清除ETS 资源*/
    if (p->flags & F_USING_DB)
db_proc_dead(p->id);

#ifdef ERTS_SMP
    if (p->flags & F_HAVE_BLCKD_MSCHED)
erts_block_multi_scheduling(p, ERTS_PROC_LOCKS_ALL, 0, 1);
#endif

    /* 清除 DLL驱动资源 */
    if (p->flags & F_USING_DDLL) {
erts_ddll_proc_dead(p, ERTS_PROC_LOCKS_ALL);
    }

    /* 清除dist节点监控 */
    if (p->nodes_monitors)
erts_delete_nodes_monitors(p, ERTS_PROC_LOCKS_ALL);

    /*
     * The registered name *should* be the last "erlang resource" to
     * cleanup.
     */
    /* 清除名字登记 */
    if (p->reg)
(void) erts_unregister_name(p, ERTS_PROC_LOCKS_ALL, NULL, p->reg->name);


    {
int pix;

ASSERT(internal_pid_index(p->id) < erts_max_processes);
pix = internal_pid_index(p->id);

erts_smp_proc_tab_lock();
erts_smp_sched_lock();

#ifdef ERTS_SMP
erts_pix_lock(pix_lock);

ASSERT(p->scheduler_data);
ASSERT(p->scheduler_data->current_process == p);
ASSERT(p->scheduler_data->free_process == NULL);

p->scheduler_data->current_process = NULL;
p->scheduler_data->free_process = p;
p->status_flags = 0;
#endif
process_tab[pix] = NULL; /* Time of death! */
ASSERT(erts_smp_atomic_read(&process_count) > 0);
erts_smp_atomic_dec(&process_count);

#ifdef ERTS_SMP
erts_pix_unlock(pix_lock);
#endif
erts_smp_sched_unlock();

if (p_next < 0) {
    if (p_last >= p_next) {
p_serial++;
p_serial &= p_serial_mask;
    }
    p_next = pix;
}

erts_smp_proc_tab_unlock();
    }

    /*
     * All "erlang resources" have to be deallocated before this point,
     * e.g. registered name, so monitoring and linked processes can
     * be sure that all interesting resources have been deallocated
     * when the monitors and/or links hit.
     */

    mon = p->monitors;
    p->monitors = NULL; /* to avoid recursive deletion during traversal */

    lnk = p->nlinks;
    p->nlinks = NULL;
    p->status = P_FREE;
    erts_smp_proc_unlock(p, ERTS_PROC_LOCKS_ALL);
    processes_busy--;

    if ((p->flags & F_DISTRIBUTION) && p->dist_entry)
erts_do_net_exits(p->dist_entry, reason);

    /*
     * Pre-build the EXIT tuple if there are any links.
     */
    if (lnk) {
Eterm tmp_heap[4];
Eterm exit_tuple;
Uint exit_tuple_sz;
Eterm* hp;

hp = &tmp_heap[0];

exit_tuple = TUPLE3(hp, am_EXIT, p->id, reason);

exit_tuple_sz = size_object(exit_tuple);

{
    ExitLinkContext context = {p, reason, exit_tuple, exit_tuple_sz};
    erts_sweep_links(lnk, &doit_exit_link, &context);
}
    }

    {
ExitMonitorContext context = {reason, p};
erts_sweep_monitors(mon,&doit_exit_monitor,&context);
    }

    delete_process(p);

#ifdef ERTS_ENABLE_LOCK_CHECK
    erts_smp_proc_lock(p, ERTS_PROC_LOCK_MAIN); /* Make process_main() happy */
    ERTS_SMP_CHK_HAVE_ONLY_MAIN_PROC_LOCK(p);
#endif
}


这些资源是进程拥有的 它有义务释放这些资源。 所以如果发现某些资源被莫名其妙的清除,请检查是不是进程异常退出!


5
0
分享到:
评论
1 楼 mryufeng 2009-07-24  
于是你看到 register但是没看到unregister

相关推荐

    Erlang进程模型学习PPT

    Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...

    erlang 中进程

    由于Erlang进程是独立的,当一个进程崩溃时,它不会影响其他进程。OTP的错误处理机制允许系统优雅地处理错误,恢复到稳定状态。Supervisors可以配置为简单的一次重启、有限次数的重启或停止整个子树,从而避免无限...

    Erlang进程池WorkerPool.zip

    Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    erlang port driver test

    总的来说,这个项目是为了验证和优化 Erlang 在 Linux 环境下通过 Port Driver 与外部程序交互的能力,测试可能涵盖了端口的创建、数据交换、错误处理和资源管理等多个方面。通过这样的测试,开发者可以确保他们的...

    xiandiao_erlang_Erlang课后习题_

    当一个进程出错时,它不会影响到其他进程,这种特性使得Erlang非常适合构建高可用的服务。 5. **简洁的错误处理**:Erlang使用“let it crash”哲学,鼓励快速失败和快速恢复。错误通常通过抛出异常来处理,而不是...

    erlang官方资源包

    2. Erlang的并发模型:Erlang通过轻量级进程(LWP)实现并发,这些进程具有极低的创建和切换开销。进程间的通信通过消息传递完成,这种模型有利于构建容错和分布式系统。 3. RabbitMQ:RabbitMQ是一个广泛使用的...

    Erlang入门:构建application练习4(进程link的作用)

    当两个链接的进程之间发生异常退出时,系统会自动向另一个进程发送一个`{'EXIT', From, Reason}`的消息,告知对方进程发生了什么。这种机制允许进程捕获并处理伙伴进程的退出情况,增强了系统的容错性。 在"bank2...

    erlang编程 Introducing Erlang

    Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...

    erlang的timer和实现机制

    Erlang中的每个定时器都是一个单独的进程,当设置定时器时,实际上是创建了一个新的进程,并将其加入到时间表中。这个时间表由Erlang虚拟机(VM)维护,负责监控所有已激活的定时器。 定时器进程的工作原理如下: 1...

    Erlang_CNode用户指

    Erlang的并发模型基于轻量级进程(Lightweight Process,LWP),每个进程之间通过异步的消息传递进行通信,这种模式非常适合构建大规模并发系统。 CNode是Erlang生态系统中的一个重要组件,它允许Erlang虚拟机(VM...

    erlang_版本24.3.4.4

    学习Erlang时,你需要掌握以下核心概念: - **BEAM虚拟机**:Erlang的运行时系统,全称是BIFs (Built-In Functions)、Erlang、Assembler and Memory管理器。 - **OTP行为**:如Supervisor(监督者)、GenServer...

    Erlang程序设计,包含完整目录和全套源码

    Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行时的同步开销,提高了系统的并行处理能力。在Erlang中,创建和销毁进程非常快速,使得它...

    Erlang脚本在进程间通信中的高效应用与实践

    Erlang作为一种专为构建可扩展、并发和分布式系统而设计的编程语言,其在进程间通信(IPC)领域的应用尤为广泛。Erlang脚本,即以.erl为扩展名的文件,允许用户编写和执行一系列Erlang命令,以实现进程间的通信和...

    Erlang入门

    当一个进程崩溃时,不会影响其他进程,实现了良好的容错性。 **四、分布式特性** Erlang天生支持分布式计算,可以透明地在多台机器上运行程序。节点间的通信也是通过消息传递实现,这使得构建分布式系统变得相对...

    erlang整理的一些心得和lunix查看cpu和内存信息的方法

    它使用轻量级进程(Lightweight Processes, LWP)实现并发,每个进程占用资源少,易于创建和通信,使得处理大量并发任务变得高效。 2. **错误恢复与容错**:Erlang 采用“Let It Crash”哲学,鼓励程序在遇到错误时...

    windows下安装Erlang环境

    **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes, LWP),这些进程消耗资源极少,使得系统能够同时处理成千上万个并发任务。由于进程间通信主要通过消息传递,而不是共享内存,因此避免了常见的...

    erlang中文基础教程

    4. **容错性**:Erlang的错误处理机制鼓励“let it crash”理念,即当一个进程出错时,它会自动崩溃,其他进程不受影响,从而实现系统的自我修复。 5. **分布式**:Erlang天生支持分布式计算,可以轻松地在多台机器...

    erlang25.0 windows版本

    5. **并发与分布式特性**:Erlang以其强大的并发处理能力著称,新版本可能在进程管理、消息传递等方面有进一步的改进。 6. **编译器升级**:Erlang的BEAM虚拟机和编译器可能会有优化,使得编译速度更快,生成的代码...

    《Programming Erlang》

    2. **故障隔离**:Erlang进程之间通过异步消息传递通信,当一个进程崩溃时,不会影响其他进程,这种机制提供了天然的容错性。 3. **函数式编程**:Erlang强调纯函数,即没有副作用的函数,这使得代码更易于理解和...

Global site tag (gtag.js) - Google Analytics