Linux 进程管理之进程的终结
Linux 进程管理之进程的终结
作者:Linux码农 2023-03-02 23:50:36系统 Linux 当一个进程终结时,内核必须释放掉它所占有的资源并把这一终结事件告知父进程。进程的终结大部分都要靠 exit() 来完成的,最终的系统调用为 do_exit()。当一个进程终结时,内核必须释放掉它所占有的资源并把这一终结事件告知父进程。
进程的终结大部分都要靠 exit() 来完成的,最终的系统调用为 do_exit()。
asmlinkage long sys_exit(int error_code){do_exit((error_code&0xff)<<8);}fastcall NORET_TYPE void do_exit(long code){...WARN_ON(atomic_read(&tsk->fs_excl));if (unlikely(in_interrupt()))panic("Aiee, killing interrupt handler!");...if (unlikely(tsk->flags & PF_EXITING)) {printk(KERN_ALERT"Fixing recursive fault but reboot is needed!\n");...tsk->flags |= PF_EXITPIDONE; if (tsk->io_context)exit_io_context();set_current_state(TASK_UNINTERRUPTIBLE);schedule();}tsk->flags |= PF_EXITING;smp_mb();spin_unlock_wait(&tsk->pi_lock);...//清除定时器group_dead = atomic_dec_and_test(&tsk->signal->live);//live用来表示线程组中活动进程的数量if (group_dead) { //当没有活动的进程时exit_child_reaper(tsk);//取消高精度定时器hrtimer_cancel(&tsk->signal->real_timer); //删除POSIX.1b类型的定时器exit_itimers(tsk->signal);}//收集进程会计信息acct_collect(code, group_dead);...//设置终止代码tsk->exit_code = code;taskstats_exit(tsk, group_dead);//释放线性区描述符和页表 exit_mm(tsk);if (group_dead)acct_process();//遍历current->sysvsem.undo_list链表,并清除进程所涉及的每个IPC信号量的操作痕迹 exit_sem(tsk);//释放文件对象相关资源 __exit_files(tsk);//释放struct fs_struct结构体__exit_fs(tsk);//检查有多少未使用的进程内核栈check_stack_usage();exit_thread();cgroup_exit(tsk, 1);exit_keys(tsk);if (group_dead && tsk->signal->leader)disassociate_ctty(1);module_put(task_thread_info(tsk)->exec_domain->module);if (tsk->binfmt)module_put(tsk->binfmt->module);proc_exit_connector(tsk);//给父进程发送信号,让其知道子进程生命已经结束,来料理子进程的后事. 同时把进程状态exit_state 设置成 EXIT_ZOMBIEexit_notify(tsk);...tsk->flags |= PF_EXITPIDONE;...preempt_disable();tsk->state = TASK_DEAD;schedule();BUG();for (;;)cpu_relax(); }do_exit() 完成工作如下:
对该调用进行检查,比如该方法是不能在中断服务程序中调用的。将 task_struct 中的标志成员设置为 PF_EXITING。删除内核定时器,根据返回的结果,它确保没有定时器在排队,也没有定时器处理程序在运行。把进程的退出代码 exit_code 设置为由 exit() 提供的退出代码,或者去完成任何其他由内核机制规定的退出动作。退出代码存放在这里供父进程随时检索。调用 exit_mm( )释放进程占用的 mm_struct,若没有别的进程使用它们(也即是这个地址空间没有被共享),就彻底释放它们。调用 exit_sem(),清除进程所涉及的每个IPC信号量的操作痕迹,使得若进程排队等候IPC信号,则离开队列。调用 __exit_files、__exit_fs,分别递减文件描述符、文件系统数据的引用计数。若其中某个引用计数的数值降为零,那么就代表没有进程在使用相应的资源,此时就可以释放。调用 exit_notify() 向父进程发送信号,给子进程重新找养父,养父为线程组中的其他线程或者init进程,并把进程状态(task_strcut 结构中的exit_state)设置成 EXIT_ZOMBIE。调用 schedule() 切换到新的进程。由于处于 EXIT_ZOMBIE 状态的进程不会再会被调度,所以这是进程所执行的最后一段代码。do_exit 永不返回。到此,与进程相关的所有资源该释放的都释放掉了(假设该进程是这些资源的唯一使用者)。进程不可运行(实际上它也没有地址空间可供它运行)并处于EXIT_ZOMBIE 退出状态。
该进程目前所占用的内存资源就是内核栈、thread_info 结构和 task_struct 结构。此时进程存在的唯一目的就是向它的父进程提供信息。父进程检索到信息后,或者通知内核它不关心那些无关的信息后,子进程的这些剩余资源才被释放归还给系统。
进程描述符的删除
从上面可以知道,进程在调用 do_exit() 后,进程处于僵死状态且不能运行。但是系统还保留它的进程描述符相关信息。之所以保留这些信息是为了让系统有办法在子进程终结后仍能获得它的信息。
当父进程获取已终结的子进程的信息后,或者通知内核它不关心那些无关的信息后,子进程的这些剩余资源才被释放归还给系统。
wait() 这一族函数都是通过唯一的一条系统调用 wait4() 来实现的。它的作用就是挂起调用它的进程,直到其中的一个子进程退出,此时函数会返回该子进程的 PID。另外,调用该函数时提供的指针会包含子函数退出时的退出代码。
wait4() 最终会调用 sys_wait4()。
asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr,int options, struct rusage __user *ru){long ret;if (options & ~(WNOHANG|WUNTRACED|WCONTINUED|__WNOTHREAD|__WCLONE|__WALL))return -EINVAL;ret = do_wait(pid, options | WEXITED, NULL, stat_addr, ru);prevent_tail_call(ret);return ret;}当父进程因子进程在 exit() 中向其发送信号而被唤醒,父进程在将子进程在用户空间运行的时间和系统空间运行的时间两项统计数据合并入其自身的统计数据中,然后,在典型的条件下,就会调用 release_task() 将子进程残存的资源,就是其 task_struct 结构和系统空间堆栈,全部释放掉。
调用过程如下:
sys_wait4--> do_wait--> wait_task_zombie-->release_taskrelease_task() 实现如下:
void release_task(struct task_struct * p){struct task_struct *leader;int zap_leader;repeat:...__exit_signal(p);zap_leader = 0;leader = p->group_leader;zap_leader = (leader->exit_signal == -1);}write_unlock_irq(&tasklist_lock);release_thread(p);//调用 put_task_struct 释放进程内核栈和thread_info结构所占的页,并释放task_struct 所占的slab告诉缓存。call_rcu(&p->rcu, delayed_put_task_struct);p = leader;if (unlikely(zap_leader))goto repeat;}release_task 完成的工作如下:
调用__exit_signal(),该函数调用_unhash_process(),后者调用detach_pid() 从 pidhash 上删除该进程,同时也要从任务列表中删除该进程。__exit_signal() 释放目前僵死进程所使用的所有剩余资源,并进行最终统计和记录。若该进程是线程组最后一个进程,并且领头进程已经死掉,则通知僵死的领头进程的父进程 。调用 put_task_struct() 释放进程内核栈和 thread_info 结构所占的页,并释放 task_struct 所占的 slab 告诉缓存。到此,进程描述符和进程所有独享的资源全部就释放掉了。
责任编辑:华轩 来源:今日头条 Linux进程管理推荐系统
电脑公司Ghost Win8.1 x32 精选纯净版2022年7月(免激活) ISO镜像高速下载
语言:中文版系统大小:2.98GB系统类型:Win8电脑公司Ghost Win8.1x32位纯净版V2022年7月版本集成了自2022流行的各种硬件驱动,首次进入系统即全部硬件已安装完毕。电脑公司Ghost Win8.1x32位纯净版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,精心挑选的系统维护工具,加上绿茶独有
微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载
语言:中文版系统大小:5.13GB系统类型:Win11微软Win11原版22H2下载_Win11GHOST 免 激活密钥 22H2正式版64位免费下载系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Win11 64位 Office办公版(免费)优化 1、保留 Edge浏览器。 2、隐藏“操作中心”托盘图标。 3、保留常用组件(微软商店,计算器,图片查看器等)。 5、关闭天气资讯。
Win11 21H2 官方正式版下载_Win11 21H2最新系统免激活下载
语言:中文版系统大小:4.75GB系统类型:Win11Ghost Win11 21H2是微软在系统方面技术积累雄厚深耕多年,Ghost Win11 21H2系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。Ghost Win11 21H2是微软最新发布的KB5019961补丁升级而来的最新版的21H2系统,以Windows 11 21H2 22000 1219 专业版为基础进行优化,保持原汁原味,系统流畅稳定,保留常用组件
windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载
语言:中文版系统大小:5.31GB系统类型:Win11windows11中文版镜像 微软win11正式版简体中文GHOST ISO镜像64位系统下载,微软win11发布快大半年了,其中做了很多次补丁和修复一些BUG,比之前的版本有一些功能上的调整,目前已经升级到最新版本的镜像系统,并且优化了自动激活,永久使用。windows11中文版镜像国内镜像下载地址微软windows11正式版镜像 介绍:1、对函数算法进行了一定程度的简化和优化
微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载
语言:中文版系统大小:5.31GB系统类型:Win11微软windows11正式版GHOST ISO镜像 win11下载 国内最新版渠道下载,微软2022年正式推出了win11系统,很多人迫不及待的要体验,本站提供了最新版的微软Windows11正式版系统下载,微软windows11正式版镜像 是一款功能超级强大的装机系统,是微软方面全新推出的装机系统,这款系统可以通过pe直接的完成安装,对此系统感兴趣,想要使用的用户们就快来下载
微软windows11系统下载 微软原版 Ghost win11 X64 正式版ISO镜像文件
语言:中文版系统大小:0MB系统类型:Win11微软Ghost win11 正式版镜像文件是一款由微软方面推出的优秀全新装机系统,这款系统的新功能非常多,用户们能够在这里体验到最富有人性化的设计等,且全新的柔软界面,看起来非常的舒服~微软Ghost win11 正式版镜像文件介绍:1、与各种硬件设备兼容。 更好地完成用户安装并有效地使用。2、稳定使用蓝屏,系统不再兼容,更能享受无缝的系统服务。3、为
雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载
语言:中文版系统大小:4.75GB系统类型:雨林木风Windows11专业版 Ghost Win11官方正式版 (22H2) 系统下载在系统方面技术积累雄厚深耕多年,打造了国内重装系统行业的雨林木风品牌,其系统口碑得到许多人认可,积累了广大的用户群体,雨林木风是一款稳定流畅的系统,一直以来都以用户为中心,是由雨林木风团队推出的Windows11国内镜像版,基于国内用户的习惯,做了系统性能的优化,采用了新的系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
相关文章
- 负载均衡的初学者指南-负载均衡的算法有哪些
- win8系统查看cpu温度的操作流程
- 星穹铁道:游戏评价两极分化,米哈游仍需努力,而不是一味往游戏里塞小游戏
- win10 iis安装具体图文步骤
- Win8玩英雄联盟没有打字窗口怎样办?
- Win10 1909系统怎样显示鼠标指针轨迹?Win10 1909显示鼠标指针轨迹教程
- 海尔台式机安装win8.1和win7双系统要怎样操作【步骤介绍】
- Win11 22000.65右键开始菜单怎么改回Win10的样子?
- 希捷移动硬盘,本文教您希捷与西数哪个好
- win7系统卸载cad软件后无法重新安装怎么解决
- 微信发特技字体办法_微信
- 安装Win8系统提示Error Code:0x0000005D错误怎么办【详解】
- Win8.1系统下点击立即升级Win10闪退怎么处理?
- usb无法识别,本文教您处理usb无法识别
- Adobe 引入自动标记功能 帮助残障人士阅读 PDF 文件 - IT之家
- Win11分辨率调到了推荐但还是有黑边怎么办【详解】
- 在win7中如何设置虚拟内存的大小
- 如何在Win8桌面建立Metro应用文件夹?
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 4电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
常用系统
- 1番茄花园Ghost Win10 专业版 x64 v2023.03最新下载
- 2萝卜家园 GHOST XP SP3 极速装机版 V2015.11 下载
- 3深度技术 GHOSTXPSP3 电脑城极速装机版 2021年11月 ISO镜像高速下载
- 4深度技术 Ghost Win7 Sp1 电脑城万能极速版2018年8月(32位)ISO镜像下载
- 5Win10 Enterprise LTSC X64优化版下载_Win10 企业版Ltsc 64位完美优化版下载
- 6新萝卜家园 GhostWin7 SP1 电脑城极速稳定版2020年6月(32位) ISO镜像高速下载
- 7深度技术Win10激活镜像文件下载_深度技术Win10 32位稳定专业版下载V2021.09
- 8系统之家Ghost win10 64位 青春绿色版 v2023.11免费下载
- 9笔记本&台式机专用系统 Windows10 企业版 2020年11月(64位) 提供下载
- 10Windows Server 2022最新版下载_Windows Server 2022 V21H2 (20348.473)官方正式版下载