【Linux】冯诺依曼体系结构与操作系统概念理解-3

简介: 【Linux】冯诺依曼体系结构与操作系统概念理解

5、系统调用与库函数【⭐】

经过上面一小节的叙述,知道了操作系统它会把软硬件管理得很好,争取不会出任何匹配,给用户一个良好的体验,那现在我想问一个问题:操作系统相信我们吗?

① 银行管理系统的设计💻

可能你对我这样的提问感到疑惑??操作系统为什么不相信我呢?接下去我通过一个银行的案例来讲解一下

  • 在中国有很多银行,例如:建设银行、农业银行、工商银行等等,若是你在一些金融相关的公司中从事过的话,那可能也会设计一些银行管理系统的项目开发,此时需要架构师去设计出整体的骨干框架,再将里面的内容一一完善

image.png

  • 那假设你现在作为一名架构师的话,你需要考虑整个银行的体系由哪些组成,例如最普通的电脑、服务器、各种办公软件,这可能是我们程序员平常接触较多的;除了这些之外还有一些其他的生态,比方说:桌椅板凳、员工宿舍之类的;那除了我们看得到的,也可能还有看不到的,例如:仓库、金库这些。上面的这些你都可以看作是我们上面所说到过的【硬件】,那既然是硬件的话就一定会有【硬件驱动】来对它们进行管理,例如:
  • IT部门就专门来管理电脑、服务器、各种办公软件;
  • 后勤部门专门来管理桌椅板凳、员工宿舍;
  • 安保部门专门来管理仓库、金库这些
  • 那既然有部门的话,就一定有员工去做一些日常的工作,像存款、借贷、接待、资金的流动和周转,你可以把它们看做是【软件】。那既可以管理硬件又可以管理软件的是什么呢?就是【操作系统】,对应银行这里的话也就是银行的行长。

image.png

  • 行长也是人,员工也是人,周边的则是物件,那人就一定可以管人,也可以管理物品,但是行长不会去做这些事,它所做的只是一些决策工作,具体的实施还是交给下面的员工来完成。例如IT部门的张主管反馈:银行的电脑和系统好久没有更换了,都是二十年前的,想要对这些东西做一个大更新↑ 这就要汇报给到上层领导,然后再交给银行行长做决策,最后当行长批准后再拨款然后去执行这些事情

这样,整个银行系统就被我们搭建起来了,以上的描述可以参考下图👇

image.png


💬在设计出一个银行管理系统后,我再来回答一下上面那个问题:操作系统相信我们吗?

  • 那我们还是可以以银行的场景为例,假设你手头上有500块钱,想要存到银行里去,假设现在没有网上银行这么便捷,只能到线下去办理,那请问银行会怎么给你存这笔钱💴呢?是把你带到一个仓库,和你说银行里的钱都存在这里了,你进去把自己钱放好,旁边的五百万( _ )和五吨黄金你不要去动它,放好了然后出来做个登记就可以了✍
  • 你认同我上面的说法吗?银行会让你这么做吗?答案是:当然不会!

那根据银行的案例相信你也可以回答这个问题了,操作系统会选择相信我们吗?

  • 操作系统给我们提供良好的服务,并不代表他会无条件地相信我。反之,它完全不相信我们!!!

② 初识系统调用与库函数

💬 那有同学说:这不是矛盾了吗?既然操作系统不相信我们,又怎么更好地去给我们提供服务呢?

  • 上面有说到过,操作系统为了满足用户需求,就会管理好各种软硬件,来为用户提供各种需求,但是呢它又不想用户随意地访问它内里的数据,怕一些有心人或者是电脑小白破坏了它内部的系统,因此它会提供给用户一个东西, 使得既可以满足用户的需求,又可以防止用户对自己的内容做任何修改,它就是 —— ==系统调用接口==

【概念】:由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口(来源 百度百科

光这么看看概念还是太抽象了,我们依旧可以通过银行的案例来进行理解🤔

  • 那对于银行来说,要如何做到既给用户办理好存、取钱的业务,又能保护好自己内部的安全,那就是【业务窗口】,银行会为每一个客户提供一个小窗口,我们通过排队拿号去各自的窗口做业务办理,在窗口内也会有对应的人员为我们受理

image.png

  • 那对应的我们上面所设计的银行系统就可以再完善一下,添加一些【窗口服务】,因为我们自己无法把钱直接存到银行里,所以我们就可以将这个需求通过窗口交给柜台人员,她会帮你去操作,进行内部的一些相互调用

image.png

  • 那有了银行的案例后我们就更好理解了,什么是操作系统的系统调用,那也就是操作系统在给我们提供良好服务的基础上又不让我们随意访问内部数据的一个接口
  • 系统:操作系统
  • 调用:操作系统设计的库函数
  • 这样就可以保证操作系统内部的封装性,又可以给用户提供特定的功能

image.png


💬 那有同学说:既然这么好的东西,可是这系统调用我怎么从来没用过呢?

  • 其实我们一直有在使用,只是你在使用的某些东西只是将系统调用这个接口进行了一个封装,你看不到而已,对于这个系统调用来说还是比较复杂的,因为有些东西我们完全看不懂,所以需要一些封装

光这么说还是比较抽象了,老规矩,上银行🏦

  • 现在开通了网上银行,基本一些小钱我们都可以通过网络的操作直接完成了,不需要花费时间跑到银行去,但是呢一些老头、老太太因为不会操作手机,因此只能到线下去办理业务,可有些东西他们还是看不太懂,因为可能不识字,所以就需要专门有人来进行引导,这个人可能就是大堂经理image.png
  • 经过我上面这一说相信你可以理解为什么我们不可以直接去调用系统调用了,把自己想象成那个老头,系统调用就是办理业务的窗口,因为你不识字,而且反应能力不行,所以需要有人来进行引导,那么你跟着这个人就可以了,这个人你就可以理解为系统调用的一个封装

所以在系统调用之上会再去进行一个封装,来帮助我们去进行操作,那要封装成什么呢?

  1. Windows下的图形化界面,只需要点击即可完成对应的操作

image.png2. Linux下的shell和工具集,只需输入指令即可完成对应的操作

image.png3. C语言中的stdio.h,只需包含一下这个头文件即可直接使用里面的库函数

image.png

上面这些都是对系统调用的一个封装,在Windows底下将系统调用封装为图形化界面,在Linux底下将系统调用封装为shell和指令集,在C语言中则是将系统调用封装为头文件

image.png

💬 那既然我们日常都在写一些代码,那么我们就来讲讲这个[stdio.h]为什么要封装起来

  • 回想我们平常在写C语言代码的时候,都会调用printf()scanf()这些库函数去进行输入输出,这些库函数里难免会访问操作系统,因为要从键盘中输入数据和向显示器打印数据,但是我们能绕过操作系统直接与这些硬件直接交互吗?答案是:不可以,上面说到过了,操作系统是不相信我们的,不过它要给我们提供服务,所以此时只能提供一些系统调用接口,==通过系统调用接口,就可以贯穿整个体系结构访问到我们的硬件==,把数据打印在显示器上
  • 在我们C/C++中,包含的一些库函数,可能也会涉及访问硬件的操作,比如打开、关闭文件,键盘的读取,显示器的输出,这其实就是【IO

所以我们要去进行这些IO操作的话就要包含stdio.h这个的头文件,里面的库函数里可能封装了一些系统调用的接口,可以帮助我们与操作系统去进行交互

💬 那有同学问:那我们现在哪里呢?

  • 对于我们开发者而言,还要再上一层,当系统调用被封装成了各种东西后,我们就可以使用这些东西去进行开发了,然后开发出来的各种APP,再给到用户进行使用
  • 语言是在操作系统之上的。我们日常笔记本、手机上使用的各种APP,都是建立在各种系统调用接口上的。有些可执行程序不能跨平台的原因之一是编译器编译的二进制指令不一样,还有一点就是调用的系统接口不一样

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/230f12efa25843a0b2a84670e069d53e~tplv-k3u1fbpfcp-jj-mark:3024:0:0:0:q75.awebp#?w=980&h=754&s=66715&e=jpg&b=fffefe


【总结一下】:

  • 初步认识了什么是系统调用,它是操作系统为了满足用户又为了保护自己而对于提供的接口,有了这个系统调用接口后,我们便可以进行二次开发,将这些晦涩难懂的系统调用封装起来,这样当用户在需要使用操作系统内部的一些功能时,可以通过这些二次开发出来的东西,去调用系统调用,从而访问到操作系统内部的一些功能,贯穿 整个体系结构,再访问到底层的硬件

③ 软硬件体系结构

还记得我最早展示的这张图吗,可能那个时候看不懂,不过现在学习了硬件、硬件驱动、操作系统、系统调用接口后,脑海中一定是非常清晰了

  • 可以看到,操作系统其实并不是位于最高层,而是位于中间层,它也是一个软件,不过是属于系统软件的一部分。对下,通过硬件驱动管理好底层的硬件;为使用操作系统的用户提供系统调用接口,但是因为这些系统调用过于复杂,所以,所以就会一些系统工程师去通过这些接口去进行二次开发,例如:可触及的图形化界面、即输即应的shell、包含有众多库函数的头文件等等
  • 有了上面这些后,我们在做开发时候就轻松多了,无需去考虑繁杂的操作系统以及晦涩难懂的各种系统调用,只需要通过操作这些二次开发的接口,完成高效率的开发,就可以很快地实现我们的项目需求,继而为用户提供更多的响应和服务

那操作系统通过响应上层用户的需求,通过系统调用接口向下对驱动发起指令,当驱动程序拿到这些指令后再交给硬件去执行,最后再把执行的结果反馈回来给操作系统,操作系统再通过用户调用的系统调用将结果反馈给用户。这便是一次用户操作在体系结构中数据的相关流动和内部的响应

image.png

如果你觉得上面这个太大太复杂了,我这里有一张简洁一点的体系结构轮廓,也可以帮助理解

  • 可以看到,最里面的其实就是操作系统的内核,那可以看作是上面那种图的中间部分,不考虑硬件部分,那么内核之外便是操作系统为外界提供的一些系统调用,【shell】和【公用函数库】便是对系统调用所进行的二次开发,那建立在这个二次开发的基础上我们就可以去通过系统调用访问到操作系统的内核,获取到对应的功能,继而完成我们的应用程序开发工作

image.png

好,概念比较多,但如果你能经过思考将这些都理顺了,那么你会对整个操作系统的软硬件体系结构非常得清楚

④ 深刻理解系统调用与库函数

==我通过几位同学的提问来再度带读者理解一下【系统调用与库函数】==

💬上面有提到过系统调用接口,它是接口还是系统调用啊?

  • 在说概念的时候有提到过,系统调用只是一个名称,它主要的应该还是被称作接口,是什么接口呢?是操作系统提供给我们的接口,这个接口可以使我们在调用一些OS提供的库函数时更好地访问到操作系统的内核,继而产生一个联通。但是操作系统它的接口有很多,有对软件提供的、也有对硬件提供的,不一定全都是为了让外界访问到自己的内核,也可以是一些进程控制信号、调用信息之类的
  • 所以系统调用就是接口,接口不一定是系统调用

💬 上面讲到的二次开发有点还没理解,它是怎么与底层的硬件进行交互的

  • 以Linux中的指令集为例,touch指令可以用来创建一个文件,把文件的相关信息和属性写在磁盘上,可实际上这条命令不是你想得那么简单,它在底层一定要调用操作系统的系统调用,然后由操作系统向驱动程序发起创建文件的相关指令,驱动程序就拿到这些指令交给硬件去执行,再把这些信息写到磁盘上。当写入操作完成后,磁盘再传递信息传递会驱动程序,驱动程序反馈给操作系统,操作系统再通过系统调用接口将结果反馈给用户。就这简简单单的一条命令就要贯穿了整个软硬件体系结构
  • 无论一个语言支持什么特性,无论是什么特性,它的底层必定封装了系统调用。例如我们使调用C语言中的printf把数据刷新到外设,因为显示器是输出设备,其实并不是我们做的,我们只是通过C语言的一个接口(库函数),C语言的printf内部又一定包含了操作系统的接口,然后将我们的数据经过操作系统,贯穿体系结构,把数据写到了硬件上,后边类同。。

💬 库和系统调用有什么关系?

  • 多数库函数就是对系统调用接口的封装,但不一定所有库函数都会封装系统调用接口。所以库函数和系统调用之间的关系是【上下层关系】,库可能调用系统调用,但不是所有的库都会调用系统调用

💬 我们为什么要使用库函数?

  • 别人的库设计好,调用系统调用,经过系统调用的组合来给我们提供功能更丰富的库函数,通过调用库函数可以大大地提高我们的开发效率,除了库函数之外还有像框架等等,就是为了让我们更快地做出东西,不需要去了解一些底层的原理

三、总结与提炼

最后来总结一下本文所学习的内容:book:

  • 首先我们了解到了冯诺依曼体系结构的组成,知道了它由运算器、控制器、存储器、输入设备和输出设备五大组件。对于前二者,我们一般统称为CPU,即中央处理器,它会处理用户从计算机外部输入到内部的数据和信息,但是二者的速度不匹配,CPU不会和外设直接打交道,此时就需要使用到内存作为中介,将外设中的数据暂时存放在内存中,当CPU空闲下来的时候就会伸手向内存所要数据来进行出来,并将处理完的结果通过输出设备反馈给外界
  • 理解了冯诺依曼系统结构,我们就谈到若是网络中的两台主机都遵循这个结构的话,那这个数据是如何进行流动的,很明显还是我们谈到的这个结构流程,读者只需要记住CPU只会向内存中去拿取数据即可

  • 在讲完硬件之后我们再来谈谈软件,谈到了【操作系统】这个概念,知道了它也是一款软件,不过却可以管理硬件和软件,那首先去我们看了操作系统如何对硬件做管理,通过了解“决策” 与 “执行”“管理者” 与 “被管理者”这个两个概念后,我们就清楚了管理的本质是【先描述,再组织】,通过学习编程语言,将一些重复的信息描述成具体的结构,在学习数据结构与算法后,再对这些描述后的信息进行组织并管理,就相当于我们前面所学的对链表进行增、删、查、改这些操作
  • 清楚了操作系统如何对硬进行管理后,我们进一步了解到在它们中间原来还有驱动程序的介入,就像校长为了管理好学生只能作出决策,但是还需要一个帮助执行决策的人,才可以更好地管理下面的东西
  • 有了这个思想后,我们就可以设计出一个基本的银行管理系统,就是基于操作系统、驱动程序和硬件三者,但是因为操作系统并不相信任何人,不过它又要给用户提供良好的服务,因此它会对外提供一些系统调用接口,使程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务,操作系统再向下对驱动程序发生指令,调用硬件,最后经过层层的返回,把最终的结果再由操作系统反馈给用户,这也就贯穿了整个软硬件体系结构

以上就是有关冯诺依曼体系结构与操作系统概念理解,本文概念居多,重在理解,当你深刻理解了这些后,再去学习操作系统的一些相关知识就可以做到融汇贯通:rose::rose::rose:

相关文章
|
21天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
46 1
|
22天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
23天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
21天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
22天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
24天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
26天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
28天前
|
人工智能 安全 Linux
Linux操作系统的演变与未来趋势###
本文深入探讨了Linux操作系统从诞生至今的发展历程,分析了其开源模式对技术创新和IT行业的影响,并展望了Linux在未来技术生态中的角色。通过历史回顾、现状分析和未来预测,本文旨在为读者提供一个关于Linux操作系统全面而深入的视角。 ###
|
28天前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
30 2
|
28天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
45 1