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

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

以下将具体说明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()函数是进程的析构函数。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdHV6aHV0dXpodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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进程托管。所以其资源的回收也将由系统来负责。

Linux下进程终止过程的更多相关文章

  1. 《linux下进程的创建,执行,监控和终止》

    <linux下进程的创建,执行,监控和终止> http://blog.csdn.net/miss_acha/article/details/43671047 http://blog.csd ...

  2. 【Linux下进程机制】从一道面试题谈linux下fork的运行机制

    今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #include "stdio.h" #includ ...

  3. 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

    在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...

  4. linux 下进程通讯详解

    linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket

  5. 在Linux下安装PHP过程中,编译时出现错误的解决办法

    在Linux下安装PHP过程中,编译时出现configure: error: libjpeg.(a|so) not found 错误的解决办法 configure: error: libjpeg.(a ...

  6. Linux下进程的建立

    Linux下进程的建立 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程来创建另外一个进程.这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使 ...

  7. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  8. Linux下进程间管道通信小作业

    在进行这次作业之前,我们先来看看什么是管道吧! 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间, ...

  9. FFmpeg在Linux下安装编译过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52402759 今天介绍下FFmpeg在Linux下 ...

随机推荐

  1. Perl模块利用CPAN在线安装自动化

    需要解决2个问题: 1.  如何与CPAN交互:利用perl –MCPAN –e ‘install 模块’ 2.  如何安装指定的版本:作者/模块-版本.tar.gz How to install a ...

  2. linux Cenos-7.0下安装jdk搭建环境变量

    搭建linux系统的java环境本人目前所知有两种方式: 第一种是从oracle官网下载linux系统的jdk版本: 第二种是使用yum命令的方式下载安装,咱们今天讲的是第一种方式. 一.工具准备: ...

  3. 紫书 例题 10-6 UVa 1635 (二项式定理+唯一分解定理)

    首先可以发现按照题目的算法最后得出来是一个杨辉三角 如果ai的系数是m的倍数,那么i即为答案 因为这个系数可能很大,而我们只需要判断倍数 所以我们就把m分解质因数,然后判断每一个系数 的质因数的幂是不 ...

  4. 紫书 习题 10-7 UVa 10539(long long + 素数筛)

    注意要开long long 如果int * int会炸 那么久改成long long * int #include<cstdio> #include<vector> #incl ...

  5. PatentTips - Virtualizing performance counters

    BACKGROUND Generally, the concept of virtualization in information processing systems allows multipl ...

  6. AP设备漫游阈值设置

    在多个AP部署的场景下,默认情况下,手持移动设备(如PDA.手机)信号弱到断掉时才切换AP,无线信号很弱的情况下网络是非常的不稳定的,因此我们需要配置AP设备的漫游阈值(RSSI阈值),以便连接的无线 ...

  7. 同学们,OpenCV出3.0了,速去围观!

    OpenCV3.0 OpenCV > NEWS > OpenCV 3.0 2015-06-04 With a great pleasure and great relief OpenCV ...

  8. IIS集成和经典配置

    检測到在集成的托管管道模式下不适用的ASP.NET设置的解决方法(非简单设置为[经典]模式).  我们将ASP.NET程序从IIS6移植到IIS7,可能执行提示下面错误: HTTP 错误 500. ...

  9. js最近天数

    //七天查询 recent(6); //30天查询 recent(30); //最近天数 var recent=function(arg){ var myDate = new Date(); //获取 ...

  10. 记一次struts2漏洞修复带来的问题

    struts2作为万年漏洞王,感觉已经被弃如敝屣了,除了一些古老的项目,比如我手上的一个项目,以前每次出现漏洞就如临大敌,手忙脚乱的赶在公司红头文件发出来前修复它.然后改了一两次后毅然决然用别的框架代 ...