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

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

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

最新文章

  1. C# System.Timers.Timer的一些小问题?
  2. HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法
  3. 转载 Javascript继承两种形式详解
  4. jquery cookie 用法
  5. struts1:Struts的中央控制器
  6. mac下qt设置调试器 调试器未设置
  7. C# 经典入门11章,比较
  8. collections 模块:更多数据结构
  9. Cookie常用操作以及属性
  10. 解决-Django使用filter过滤时间,无法获取月份的问题
  11. dom编程艺术笔记2--第三章
  12. linux_文件夹实现挂载(必须在同一网段)
  13. TF模型训练中注意Loss和F1的变化情况
  14. CentOS下安装JDK-rpm文件
  15. 【JAVA】判断当前日期是否在时间点内
  16. 【整理】HTML5游戏开发学习笔记(2)- 弹跳球
  17. mybaits动态SQL中的DECIMAL
  18. Jsp中格式化时间戳的常用标签
  19. 转自csdn:计算机启动过程
  20. SQL Server Management Studio 简单使用说明

热门文章

  1. 守护、互斥锁、IPC和生产者消费者模型
  2. docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置
  3. 如何在Google Play上通过电脑下载apk
  4. TCP 三次握手,四次挥手
  5. 洛谷—— P2934 [USACO09JAN]安全出行Safe Travel || COGS ——279|| BZOJ——1576
  6. Varnish 问题点 与 技术方案 Varnish 优劣分析
  7. MyMathLib系列(行列式计算2)
  8. [Android随笔]内存泄漏以及内存溢出
  9. Centos7.4 modsecurity with nginx 安装
  10. impala 概述