阿里三面--shell终端敲入命令计算机都做了什么?

本文参考:

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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网民工蒋大钊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值