zoukankan      html  css  js  c++  java
  • Linux下进程终止过程

    不管是在什么系统中,当进程终止之后。系统都须要释放进程占有的资源。

    否则。系统资源会被耗尽。

    以下将具体说明Linux系统中,进程终止的过程。

    进程终止方式

    linux的进程终止方式有8种,当中5种是正常终止,各自是:

    1. 从main函数返回。
    2. 调用exit函数。
    3. 调用_exit或_Exit。
    4. 最后一个线程从其启动例程返回。
    5. 最后一个线程调用pthread_exit。
    异常终止有3种,各自是:
    1. 调用abort函数。
    2. 接收到信号并终止。

    3. 最后一个线程对取消请求做出响应。

    进程终止过程

    Linux中。对于资源的释放,採取的是“谁申请谁释放”的原则。比方。进程自身申请的信号量、文件描写叙述符等,须要进程自己释放。

    而进程描写叙述符、内核栈这些资源则须要父进程来回收。

    进程自身资源释放

    无论进程以何种方式终止。终于都会调用do_exit()函数。do_exit()函数是进程的析构函数。

    借用一张网上的图,表演示样例如以下:


    do_exit()函数主要完毕下列工作:
    1. 将task_struct(内核中表示进程的数据结构)中的标志成员设置为PF_EXITING。
    2. 调用del_timer_sync()删除任一内核定时器。
    3. 假设BSD的进程记账功能是开启的,调用acct_update_integrals()输出记账信息。
    4. 调用exit_mm()函数,释放进程占有的mm_struct。

    5. 调用sem_exit()函数。释放进程的信号量。
    6. 调用exit_files()和exit_fs(),分别递减文件描写叙述符和文件系统数据的引用计数。

    7. 把存放task_struct的exit_code成员中的任务退出码置为exit()提供的退出码。
    8. 调用exit_notify()向父进程发信号。给子进程又一次找父进程,新的父进程为进程组中其它进程或者init进程。并把进程状态置为EXIT_ZOMBIE。
    9. do_exit()调用schedule()切换到新的进程。

      由于处于EXIT_ZOMBIE状态的进程不会再被调度,所以这是进程运行的最后一段代码。

    运行完上述操作之后,进程相关联的资源都被释放掉,并处于EXIT_ZOMBIE状态。可是进程的内核栈、thread_info(指向task_struct的数据结构)和task_struct。此时进程存在的唯一目的就是向父进程提供信息。父进程释放子进程占用的剩余内存。

    释放进程剩余的资源

    当一个进程终止之后,内核会向其父进程发送SIGCHLD信号(何时发?)。父进程在SIGCHLD的信号处理函数中调用wait()函数,获得已终结的子进程信息后,调用release_task()函数,释放其占用的剩余资源。
    假设父进程创建了子进程,可是又不想负责回收子进程占用的资源。能够使用两次fork的方法:
    父进程创建一个子进程,子进程再创建孙进程运行须要运行的操作。然后子进程退出。
    因为子进程退出了。那么孙进程将会被init进程托管。所以其资源的回收也将由系统来负责。

  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7002836.html
Copyright © 2011-2022 走看看