shell终端敲入命令计算机都做了什么?

news2025/1/13 15:33:56

本文参考:

linux命令行的运行原理是什么? - 知乎 (zhihu.com)

8.1 键盘敲入 A 字母时,操作系统期间发生了什么? | 小林coding (xiaolincoding.com)

shell命令背后的执行过程_shell 命令执行的产生的进程_kyrieguard的博客-CSDN博客

进程的API接口:fork、wait和exec - 知乎 (zhihu.com)

Linux进程创建、可执行文件的加载和进程执行进程切换 - 知乎 (zhihu.com)

Linux进程描述符task_struct结构体详解–Linux进程的管理与调度(一)_CHENG Jian的博客-CSDN博客

分析Linux内核创建一个新进程的过程 | 远航 (luoyuanhang.com)

这个过程中涉及到太多的知识,包括操作系统中的输入输出设备管理,文件系统,内存管理,进程的创建和调度,只能用自己浅薄的理解先梳理一下,还需要不断补充。

整体过程可以理解如下:

在这里插入图片描述

针对上面的每一步,其实都可以好好琢磨一下:

  • 1,7主要涉及操作系统的设备管理:
    当用户通过键盘输入命令的时候,控制键盘的设备控制器就会产生扫描码数据,并将其缓存在键盘控制器的缓冲区中,紧接着键盘控制器通过总线向CPU发送中断请求。CPU 收到中断请求后,操作系统会保存被中断进程的 CPU 上下文(这里应该是用户进程),然后调用键盘的中断处理程序中断处理函数的功能就是从键盘控制器的寄存器的缓冲区读取扫描码,然后写入到显示设备的控制器的寄存器中的数据缓冲区,最后将这些数据显示在屏幕里。显示出结果以后,恢复中断进程上下文。

在这里插入图片描述

  • 2主要涉及操作系统进程的知识:
    打开一个命令行终端,其实就是打开了两个程序,一个是显示界面的程序,展示输入的命令;还有一个就是shell程序,进行命令解释和调用执行,两者可以理解为统一的“shell程序”。

    其中shell解释器工作主要包括:

    • 首先会判断这是一个绝对路径的命令还是其他,是绝对路径命令就直接由bash去执行

    • 如果是其他就会判断这是否是一个别名命令,别名命令会将其展开为原始命令

    • 然后会再判断这是外部命令还是内部命令,是内部命令就执行

    • 如果是外部命令就会到PATH变量中遍历寻找,找到命令路径就会往下执行,找不到bash就会抛出command not found 异常

  • 3,4涉及磁盘文件系统管理的知识:
    当输入的命令是外部命令的时候,shell解释器会到磁盘的PATH变量中查找命令的路径

在这里插入图片描述

​ 往细里聊,UNIX磁盘文件的组织涉及到:虚拟文件空间VFS,用于统一用户层与不同文件系统间的接口,文件系统的索引组织结构,磁盘文件的阻塞IO与非阻塞IO方式,这里不展开讲述。
​ 这一步的话就是将外部命令对应文件的inode找到。

  • 4涉及到操作系统内存管理方面的知识:

    通过我们刚刚找到的外部命令对应的文件inode,找到其磁盘中的二进制命令数据,需要将其加载到内存中来。磁盘通常是按4KB磁盘块的形式读入内存的,此外,Linux系统采用的虚拟内存技术,当我们在进行命令装载的时候,并不会一下子将所有的命令文件从磁盘中加载到内存中来,而是会“按需取用”。在一行一行命令执行的过程中,当其关联的磁盘文件还没有加载进来的时候,触发缺页中断处理,通过CPU中的内存管理单元MMU进行虚拟地址到物理地址的转换,将物理页加载到内存中来。在加载的过程中可能会碰到内存空间不足的情况,又需要将一部分未使用的内存页swap换出。

  • 5,6涉及到进程管理方面的知识:

    当命令被加载进来,shell检查是否具有足够的空间,会为相关的命令创建进程。其实shell命令执行主要就是父子进程创建的问题。

    其背景知识就是C语言中进程创建的api,可以参考进程的API接口:fork、wait和exec - 知乎 (zhihu.com),fork,wait,exec的执行。

    放在本问的场景下:

    • shell进程调用fork( )建立一个子进程。
    • shell进程本身用系统调用wait( )来等待子进程完成(如果是后台命令,则不等待)。
    • 子进程运行时调用execve( ),子进程根据命令名到目录中查找有关文件,将它调入内存,执行这个程序
    • 当子进程完成处理后终止,向父进程(shell进程)报告,并将结果进行展示

其中关于进程创建task_struct()结构可以参考 Linux进程描述符task_struct结构体详解–Linux进程的管理与调度(一)_CHENG Jian的博客-CSDN博客

关于父子进程创建拷贝的过程可以参考 分析Linux内核创建一个新进程的过程 | 远航 (luoyuanhang.com)

别人做的实验可以参考 Linux进程创建、可执行文件的加载和进程执行进程切换 - 知乎 (zhihu.com)

当然进程创建出来就涉及到进程调度方面的知识,这些知识也是很多学问,网上有很多资料这里也不再赘叙。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三维动画渲染用什么软件好?

三维渲染是通过计算机应用程序把 3D 模型生成图像(照片级真实感或非照片级真实感)的自动化过程,三维动画渲染是动画制作过程的最后一步,该过程将各种视觉效果应用于最终模型,例如阴影、纹理、灯光反射和运动模糊等&…

史上最全的接口测试,吐血整理从零到接口自动化实战...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试&#xf…

04_并发容器类

1. 重现线程不安全&#xff1a;List 首先以List作为演示对象&#xff0c;创建多个线程对List接口的常用实现类ArrayList进行add操作。 public class NotSafeDemo {public static void main(String[] args) {List<String> list new ArrayList<>();for (int i 0; i…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…

Kubernetes集群的类似top的查看指标的工具ktop

Kubernetes集群的类似top的工具。 遵循Unix/Linux顶级工具的传统&#xff0c;ktop是一个显示有关Kubernetes集群中运行的节点、pod和其他工作负载资源的有用度量信息的工具。 项目地址&#xff1a;https://github.com/vladimirvivien/ktop使用效果图&#xff1a; 特性 集群资…

Linux如何压缩和解压文件

先看压缩 Linux zip 命令用于压缩文件。 zip 是个使用广泛的压缩程序&#xff0c;压缩后的文件后缀名为 .zip 将 /home/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip&#xff1a; zip -r html.zip /home/html 如果在我们在 /home/html 目录下&#xff0c;可…

经济回暖、兴趣电商升级,品牌在竞争白热化的市场中如何突围?| D3大会圆桌回顾

冬去春来&#xff0c;消费市场韧性回弹&#xff0c;消费趋势正处于“转折”和“跃升”的阶段。新的机遇和挑战也将伴随着新的思维、方法和模式&#xff0c;呈现出更多元的变化和创新&#xff1a;渠道虚实融合&#xff0c;内容为王&#xff0c;社会化媒体成为主战场等消费场景不…

13-NumPy

文章目录 一.基础1.Ndarray对象2.数据类型 二.数组1.数组属性&#xff08;1&#xff09;arange&#xff08;2&#xff09;shape&#xff08;3&#xff09;ndim&#xff08;4&#xff09;itemsize 2.创建数组&#xff08;1&#xff09;empty&#xff08;2&#xff09;zero&#…

【接口自动化测试】月薪12k必会技术,从0到1学习接口自动化测试,6个操作安排的明明白白

导读&#xff1a;在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原…

电商直播商家崛起所面临的问题,订单管理系统起关键性作用

随着短视频直播的兴起&#xff0c;电商企业再次迎来大爆发&#xff0c;随着销量的猛增&#xff0c;随之而来的的订单处理成了各大商家的头等大事&#xff0c;面对再次崛起的电商蓝库云认为企业在订单管理会经常遇到以下问题&#xff1a; 电商企业在订单管理中可能面临以下问题…

js版计算连续12个月计算不超3万公里

<!--考虑比亚迪车友不是程序员的多&#xff0c;写了个html版的&#xff0c;复制以下代码在记事本&#xff0c;改后缀名为test.html&#xff0c;然后用浏览器打开--> <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>…

基于SpringBoot3从零配置MybatisPlus

基于SpringBoot3从零配置MybatisPlus记录 文章目录 1.环境2.表数据准备3. 配置pom配置yml 配置MapperScan 3.问题总结问题1: Property sqlSessionFactory or sqlSessionTemplate are required问题2&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound stat…

Python学习13:说句心里话 A(python123)

描述 分两次从控制台接收用户的两个输入&#xff1a;第一个内容为"人名"&#xff0c;第二个内容为"心里话"。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪…

使用D435i深度相机运行ORB-SLAM3

下载安装链接 下载ORB-SLAM3地址&#xff1a; git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git eigen3多版本安装&#xff1a;https://blog.csdn.net/weixin_41756645/article/details/129570141 ORB-SLAM2中eigen3版本为&#xff1a;3.2.10版本 ORB-SLAM3中eigen3版…

【Jetpack】ViewModel + LiveData + DataBinding 综合使用 ( 核心要点说明 | 组合方式 | 代码示例 )

文章目录 一、ViewModel LiveData DataBinding 核心要点1、ViewModel 使用要点2、LiveData 使用要点3、DataBinding 使用要点 二、ViewModel LiveData DataBinding 代码示例1、ViewModel LiveData 代码2、build.gradle 构建脚本 - 启用 DataBinding3、DataBinding 布局文件…

ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能

文章目录 ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能一、需求与思路二、基本调教三、开始秀四、 总结 ChatGPT实战100例 - (10) 提前体验ChatGPT的多模态绘图功能 这个绘图其实比较基础&#xff0c;只能说是能显示个图吧 真要出图&#xff0c;隔壁 文心一言 秒杀…

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量

如何提高三维模型OSGB格式转换3DTILES的转换速度和数据质量 提高三维模型从OSGB格式转换为3DTILES格式的转换速度和数据质量&#xff0c;可以从以下几个方面进行优化&#xff1a; 1、选用高效的转换工具&#xff1a;选择高效的转换工具是提高转换速度和数据质量的关键。目前市…

.NET中比肩System.Text.Json序列化反序列化组件MessagePack

简介 官方定义&#xff1a;MessagePack是一种高效的二进制序列化格式。它允许您像JSON一样在多个语言之间交换数据。但是它更快并且更小。 MessagePack是一种开源的序列化反序列化组件&#xff0c;可支持JAVA&#xff0c;C#等主流语言。在 C# 中使用 MessagePack&#xff0c…

javaScript:cropperjs是一款非常强大却又简单的图片裁剪工具

cropperjs是一款非常强大却又简单的图片裁剪工具&#xff0c;它可以进行非常灵活的配置&#xff0c;支持手机端使用&#xff0c;支持包括IE9以上的现代浏览器。&#xff08;关键是使用方法简单&#xff0c;几行代码就可以搞定&#xff09; 官方github文档&#xff1a;GitHub -…

深入理解计算机系统--理解编译器编译的过程

前言 大家在学习C语言的时候&#xff0c;相信对编译器这个词并不会感到陌生。我们也会知道编译器编译的过程是&#xff1a;预处理-》编译-》汇编-》链接。这篇文章主要介绍这四个过程中&#xff0c;编译器究竟做了那些工作&#xff0c;它是如何让一份高级程序转换成机器语言的…