在shell中执行一条可执行程序(./a.out) 系统执行的过程

news/2024/7/19 14:52:49 标签: linux, 系统调用, linux内核

目录

系统调度过程

用户空间角度:

内核角度

1、调用fork创建一个新进程

2、使用_fo_fork创建新进程

3、父进程调用wake_up_new_task尝试唤醒新进程

4、CPU选择一个合适的进程来运行;

5、运行新进程

6、实现负载均衡


系统调度过程

分析在命令行下使用./test程序。程序在用户态和内核台中运行的流程

用户空间角度:

shell 运行test程序,调用fork()系统调用函数来创建一个新进程;

调用exec系统调用函数来装载test程序。

ret = fork()
if(ret > 0)
{
    //父进程
}
else if(ret == 0)//子进程
{
    execve()
}
else
{
    //失败
}

内核角度

do_fork ->新进程

1、调用fork创建一个新进程

2、使用_fo_fork创建新进程

  • 创建新进程的task_struct数据结构
  • 复制父进程的task_struct数据结构到新进程
  • 复制父进程相关的页表项到新进程
  • 设置新进程的内核栈

3、父进程调用wake_up_new_task尝试唤醒新进程

  • 调用调度类select_task_rq(),为新进程寻找一个负载最轻的CPU(如果CPU0有四个线程在运行,CPU有一个线程在运行,那么新进程在寻址负载最轻的CPU为CPU1)
  • 调用调度类的enqueue_task(),把新进程添加到CPU1的就绪队列里

4、CPU选择一个合适的进程来运行;

  • 每次时钟节拍到来时,scheduler_tick()检查是否需要重新调度;check_preempt_tick会做检查,当需要重新调度时会设置当前进程的thread_info中的TIF_NEED_RESCHED标志位。
  • 在中断返回前会检查当前进程是否需要调度。如需要调度,调用preempt_schedule_irq来切换进程运行。
  • 调度器的schedule函数会调用调度类的pick_next_task来选择下一个最合适的进程
  • switch_mm切换父进程和新进程的页表
  • switch_to切换进程来运行 

5、运行新进程

  • 新进程第一次调用时会调用ret_from_fork函数
  • 返回用户空间运行shell程序
  • shell程序调用exec来运行test程序,最终新进程编程test进程

6、实现负载均衡

  • 在每个时钟节拍到来,检查是否需要触发软中断来实现SMP负载均衡,调用函数为scheduler_tick->trigger_load_balabce()。下一次实现负载均衡的时间点存放在就绪队列的next_balance成员里。
  • 触发 SCHED_SOFTIRQ软中断
  • 在软中断函数run_rebalance_domains里,从当前CPU开始遍历CPU拓扑关系,寻找负载不均匀的调度组;
  • 找到调度组最繁忙的,然后计算迁移多少到CPU1上才能保持两个调度组负载平衡;
  • 从CPU0迁移部分进程到CPU1 


http://www.niftyadmin.cn/n/102851.html

相关文章

SQL零基础入门学习(十四)

上篇:SQL零基础入门学习(十三) SQL NULL 值 NULL 值代表遗漏的未知数据。 默认地,表的列可以存放 NULL 值。 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该…

JUnit介绍与使用

自动化是通过selenium脚本来实现的,而JUnit是Java单元测试工具,只不过我们在实现自动化的时候要借用一些JUnit库里提供的一些方法。优化我们的自动化使用版本:JUnit5(支持最低Java版本为8)依赖导入到pom.xml&#xff1…

【深度探讨】如何利用区块链改善公共服务

发表时间:2022年5月4日 信息来源:bsvblockchain.org BSV区块链协会全力支持符合企业和政府对于节能降耗和合法合规等相关要求的区块链生态系统。 然而,虽然监管机构负责其监管范围内的技术服务的性质、目的和影响,但他们并不是全…

利用递归实现括号匹配

案例引入以下则是各个字符串经过括号处理之后的结果:12((21))(12-->12(21)1232((((2121)212(21)-->32(2121)212(21)ABDF((SA)SA)SA(SA)SA(((-->ABDF((SA)SA)SA(SA)SA算法思路:这个问题的解决方法就是将字符按顺序逐一加入到新的string容器store…

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2,axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML):异步的 Jav…

推荐系统遇上深度学习(一四三)-[快手]一致性终身用户行为建模方法TWIN

标题:《TWIN: TWo-stage Interest Network for Lifelong User Behavior Modeling in CTR Prediction at Kuaishou》链接:https://arxiv.org/pdf/2302.02352.pdf今天给大家分享的是快手近期发表的终身行为序列建模上的工作,当前工业界主流的方…

Android 9.0 SystemUI去掉QuickQsPanel的黑色透明背景

1.概述 在9.0的系统rom定制化开发中,在systemui的原生系统中,在系统systemui的下拉状态栏的QuickQsPanel默认会有黑色透明背景,当设置默认壁纸比较透明的时候 能够看到很清楚, 所以要去掉这些黑色透明背景,就需要看systemui的下拉状态栏的布局来进行文件的分析 2.SystemUI…

Python|每日一练|数组|数学|矩阵|单选记录:将一组数尽可能均匀地分成两堆,使两个堆中的数的和尽可能相等|加一|螺旋矩阵 II

1、将一组数尽可能均匀地分成两堆,使两个堆中的数的和尽可能相等(算法初阶,基础知识) 贡献者:doreen08 麦克叔叔去世了,他在遗嘱中给他的两个孙子阿贝和鲍勃留下了一堆珍贵的口袋妖怪卡片。遗嘱中唯一的方…