调度器42—进程exit退出流程
2024-09-08 19:39:01
基于Linux-5.10
一、do_exit()简要流程
1. 执行路径
各驱动和内核机制中直接调用
SYSCALL_DEFINE1(exit, int, error_code) //exit.c 将 (error_code&0xff)<<8 传给参数 code
do_exit(code);
if (unlikely(in_interrupt())) //当前进程关中断后退出了,panic。
panic("Aiee, killing interrupt handler!");
if (unlikely(!tsk->pid)) //当前进程关抢占后退出了,panic。
panic("Attempted to kill the idle task!");
exit_signals(tsk);
tsk->flags |= PF_EXITING; //标记进程正在退出
if (unlikely(is_global_init(tsk))) //init进程退出了,panic。
panic("Attempted to kill init! exitcode=0x%08x\n", tsk->signal->group_exit_code ?: (int)code);
tsk->exit_code = code; //更新退出码
exit_notify(tsk, group_dead);
tsk->exit_state = EXIT_ZOMBIE;
exit_rcu(); //通知RCU进程退出了
do_task_dead
tsk->state |= TASK_DEAD;
tsk->flags |= PF_NOFREEZE; /* Tell freezer to ignore us: */
__schedule(false);
可以看到:
(1) 调用exit()的执行流程最终只是将进程状态设置为 TASK_DEAD,然后切走了,在这个流程中并没有释放 task_struct 结构。
(2) 关中断和原子上下文执行exit流程会报panic。
最新文章
- commons-lang包中我们常用的类的作用
- Oracle客户端配置
- 深入浅出设计模式——单例模式(Singleton Pattern)
- Robberies(HDU2955):01背包+概率转换问题(思维转换)
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
- 基于HTML5实现五彩连珠小游戏
- Javascript的动态运动(1)
- asp.net中当服务器出错时显示指定的错误页面
- ubuntu下怎么合并windows下分割的zip包
- 把Orchard部署到Windows Azure Web Sites
- WPF WebBrowser Memory Leak 问题及临时解决方法
- ace_tree总结。各类问题解决办法汇集
- Statistics in Python
- toggle显示与隐藏切换
- A - Jugs ZOJ - 1005 (模拟)
- Java Web部署到tomcat后,使用动态编译无法找到相关类的解决方案
- OC基础:数组.字典.集 分类: ios学习 OC 2015-06-18 18:58 47人阅读 评论(0) 收藏
- Spring配置连接池
- 【react router路由】<;Router>; <;Siwtch>; <;Route>;标签
- Linux新手随手笔记1.9-使用Apache搭建网站