Shell


在说操作系统的时候,我们说到过一张图:

这产生了两个新问题:

  1. 我们输入指令,然后系统执行指令,我们是直接与操作系统对话吗?
  2. 系统调用接口和用户操作接口有什么区别?

别急,分开来谈: 


shell

在不同的操作系统里,我们发送指令的方式也不同。
在Linux里,我们用命令行以字符的方式发送指令;在Windows下,我们以鼠标双击的方式发送命令。

同时,安装同一个操作系统的时候,却会分为不同的版本。
比如同样是Linux操作系统,安装的时候却要选择CentOS,Ubuntu;
Windows要选择Windows10,Windows11。
难道,这些都是不同的操作系统吗?当然不是,微软公司不可能闲着蛋疼每年去把操作系统重新给你写一遍,CentOS和Ubuntu也没有权力修改Linux核心代码,这些不同的版本都被称为操作系统的外壳,即为shell。

外壳

你是一个皇帝。

你手下还有几位宰相,与你共同管理国家大事: 

你们的任务,是管理国家的资源分配,还有人才权限的管理

你们每日在宫中负责大大小小的事物就好了,但是百姓们考虑的就多了——
在靠近边疆的一位平民哪天说自己想征用一块土地,建起一座粮仓。他想请求皇上的同意,让皇上前来当地自然不妥,于是便跑入宫中上奏:

当土地建好以后,其他平民一看,便纷纷效仿。于是一个小皇宫里:

而且,突然有天来了个异域来客:

完全不理会外界消息也不行,让所有人直接面刺皇帝也不妥,于是,你想到了一个好办法—— 

你在所有地方,设立了一个办事处;然后在皇宫附近,设立了一个机关事务处。当所有平民有事物交给皇上批准时,就先交给当地的办事处;而办事处收到了消息,就交给机关事务处,机关事务处汇总了全国各地的消息;机关事务处收到了消息,就先把各地的语言方言翻译成皇上可以看得懂的语言,然后简略消息,最后再交给皇上。
于是,皇上只需要看着送上来的奏折,便可以管理全国,而不需要再与百姓们面对面交流了。

所以,机关事务处是干什么的?收集全国各地的消息,把所有消息语言翻译并简略,交给皇上批阅,然后把批阅的消息再翻译成当地的语言,给当地的办事处回应。

操作系统是干什么的?检查权限,分配内存,管理内存。 

但是,如果我们人人都直接与操作系统直接对话,只会让操作系统龙颜大怒

  • 你们不同人的指令习惯不同,我怎么知道你们要干嘛
  • 你们隔这乱按,我寻思半天不知道你想说啥,最后才知道你给我把指令打错了
  • 你们十万个人都来求我操作系统,我操作系统分分钟挂给你看 

所以,在操作系统和用户之间,则必须有一个机关事务处,作为沟通用户和操纵系统的桥梁,这个机关事务处,就叫操作系统的外壳shell

当用户发出指令的时候,并非向操作系统发出指令,而是向着shell发送指令。shell收到指令,并不会立即传递给操作系统,而是:

  1.  先解析指令,看指令的格式是否正确
  2.  再分析指令,看指令是想让完成什么任务
  3.  再分工指令,看哪些必须要操作系统完成,哪些shell自己就可以完成。
  4.  最后分离出操作系统需要做的任务,比如分配内存,修改权限,将这些任务翻译成操作系统可以看得懂的语言,呈递给操作系统实现。

于是,shell过滤掉了所有无效指令,并且将有效的指令简化,只让操作系统执行其需要执行的部分。有了shell的存在,操作系统的负担就能减轻很多 


系统调用

在不同的系统中,系统调用也不同。
一个很简单的例子,Linux是文字框类的操作系统,而Windows是图案可视化类的操作系统,自然Windows对很多显示的工作和Linux有着很大的区别。当我们想在屏幕上打印一串数字,在Linux中要调用print接口,而在Windows里则又是另一套做法

虽然两个不同的逻辑,在各自的操作系统里都很完美,但是对后来的程序员,就非常不友好了。 

最早产生这个问题,是在不同的芯片中。不同芯片实现相同功能,因为接口完全由厂商生产,没办法统一,所以代码天差地别。但是,不可能把所有芯片对应的代码都写一遍吧,所以此时产生了一个卡密:

C语言,就像秦王一样,统一了所有的接口。

语言调用

在之前C语言的代码里,都是会分.h文件和.c文件的。现在看来,这些都很多余,而且我们并不知道分开的意义,但是我们设想:

在诞生C语言的时候,C语言只给出.h文件,即只告诉你一个C语言应该有哪些函数,并且说明这些函数应该实现哪些功能。但是,光只有一个.h文件,完全做不到程序的运行,必须要.c文件实现.h文件中的所有函数,这些函数才可以正常被调用。

.c中的函数是C语言诞生就有的吗?不是,是操作系统自己去实现的。比如,C语言只给出一个stdio.h: 

//stdio.h

void printf(char* s,...);
//这个函数应该格式化打印数据,参数是巴拉巴拉,返回值是巴拉巴拉

然后C语言就不管了。

操作系统在诞生的时候,首先将自己的系统调用全部实现完全,然后再来看C语言交给自己的任务,要用自己的系统调用,去实现C语言给出的函数:

//stdio.c

//我要用自己的系统调用,去实现C语言给我的要被完成的函数
void printf(char* s,...)
{
	print();//自己的系统调用,打印数据
	fflash();//自己的系统调用,刷新缓冲区
	...// 干一些其他事完善一下
}

所有C语言给出的函数库,操作系统都要自己实现一遍。

这样做有什么意义?

  1. 程序员在写代码的时候,就可以绕过系统调用,直接写C语言的函数,不需要学习每个系统的系统调用
  2. 程序员在写代码的时候,就不需要每个操作系统都写一份对应的代码,而全部统一成C语言了
  3. 程序员在看代码的时候,程序就更加规范了。

所以,系统调用和语言调用有什么区别?

  • 系统调用是实现各自功能的命令,相当于方言;
  • 而语言调用是统一所有系统功能的语句,相当于国际语言。

相关推荐

  1. <span style='color:red;'>Shell</span>

    Shell

    2024-07-17 09:22:43      24 阅读
  2. Spark—shell,Hbase—shell

    2024-07-17 09:22:43       45 阅读
  3. Shell学习——Shell运算符

    2024-07-17 09:22:43       43 阅读
  4. linux shell

    2024-07-17 09:22:43       39 阅读
  5. 【Linux】Shell

    2024-07-17 09:22:43       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 09:22:43       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 09:22:43       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 09:22:43       58 阅读
  4. Python语言-面向对象

    2024-07-17 09:22:43       69 阅读

热门阅读

  1. 01.Verilog基础语法

    2024-07-17 09:22:43       21 阅读
  2. 音视频开发入门教程(1)如何安装FFmpeg?共210节

    2024-07-17 09:22:43       20 阅读
  3. HTTP缓存/强缓存/协商缓存

    2024-07-17 09:22:43       21 阅读
  4. 69、Flink 的 DataStream Connector 之 Kafka 连接器详解

    2024-07-17 09:22:43       20 阅读
  5. Google 优化(SEO):提升网站曝光率的关键策略

    2024-07-17 09:22:43       24 阅读
  6. 自然语言处理中的本体/分类/同义相似

    2024-07-17 09:22:43       26 阅读
  7. Ubuntu串口调试单片机

    2024-07-17 09:22:43       24 阅读
  8. Hadoop中的YARN组件

    2024-07-17 09:22:43       19 阅读
  9. LeetCode --- 2129. Capitalize the Title 解题报告

    2024-07-17 09:22:43       18 阅读
  10. 达梦数据库-学习

    2024-07-17 09:22:43       26 阅读