Linux:计算机的层状结构

1.冯诺依曼体系结构

我们常见的计算机,如笔记本、台式机。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系结构。

CPU:运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的。

输入设备:键盘、鼠标、网卡等。

输出设备:显示器、网卡、打印机等。

存储器:存储器指的是内存,它的特点是掉电易失。

SSD固态硬盘或磁盘在冯诺依曼体系结构中它们不是存储器,它们是输入或者是输出设备

设备是用总线连接的,被集成在了主板上。将设备连接起来的目的是为了数据流动(本质就是设备之间数据的来回拷贝,拷贝的整体速度是决定了计算机的效率指标)。

输入设备和输出设备它们的效率是比较慢的,cpu的速度又非常的快,如果中间没有了存储器这样的设备,那么计算机的整体速度就取决于输入或输出设备,为了解决这种问题,于是在硬件上加入了存储器。


存储器比输入或输出设备要快,比CPU慢,输入设备就将数据放到存储器中,CPU在存储器中去读取执行,将结果放入到存储器,存储器在转交给输出设备,这样一来计算器的整体速度就变为了以存储器为主

当CPU在忙的时候,输入设备将数据放入到存储器中(这个工作是预先加载),当CPU不忙的时候直接到存储器中读取数据,将处理好的结果放入到存储器中(这个工作是缓存),输出设备直接在存储器中去读取,这样一来计算机的效率就变得很高。


2.操作系统是如何管理底层硬件的?

第一个被加载的软件是操作系统。操作系统是一个软件,它的工作是对软件资源和硬件资源进行管理

计算机的层状结构图:

计算机的软硬件结构是层状的。最底层是硬件,硬件有网卡,硬盘,键盘,显示器,CPU等等,这些硬件底层构成并不是随便放的,都是以冯诺依曼体系结构来进行组织的。


操作系统和底层硬件之间还有一个驱动程序,驱动程序是一个软件,专门去控制对应的软件,例如网卡驱动控制的是网卡,网卡的读,写,状态,开和关等相关操作接口,都在网卡驱动里,操作系统直接去调用网卡驱动就能控制底层硬件的网卡(几乎每一种底层硬件都有自己的驱动程序)。

在计算机的层状结构图中我们先从往下去研究,来学习操作系统是如何管理底层硬件的。

操作系统类似于现实生活中的领导,领导的主要工作是管理自己底下的员工,而管理的核心就是去做出正确的决策。底层硬件类似于现实生活中的普通员工,它们的主要工作是做执行,执行领导安排的任务。驱动程序类似于现实生活中的组长,它们的主要工作是保证管理决策落地,催促小组成员完成任务(操作系统做决策,底层硬件去执行,驱动程序保证决策落地)。

下面就以校园生活为例:

校长---------操作系统

辅导员----------驱动程序

学生-----------底层硬件


在学校中,校长是管理者,学生是被管理者,大多数的学生连校长的面都没有见过,但是各方面都被安排的明明白白的,例如:该在什么教室上什么课,住在哪一间寝室,是否可以拿到奖学金和助学金等等。所以管理者和被管理者根本不需要见面,管理的本质不在于对人做管理,而在于对人的信息(数据)做管理,例如:校长拿到一个学生的信息(数据),该学生各科成绩优秀,且是学生会的主席,对学校有重大贡献,校长就可以做出决策,让该学生拿到助学金。管理者核心是做决策,根据数据来做决策


管理者和被管理者面都没有见过是如何拿到信息(数据)的呢,校长和学生没有见过面,但是校长却能知道学生的信息(数据),原因是因为辅导员,辅导员将学生的信息(数据)上交到了校长那里,同时辅导员还要保证管理决策落地,如果校长想组织一场运动会,不需要挨个去通知学生,只需要告诉辅导员,辅导员就会去通知学生。


管理者在面对大量的被管理者的时候,数据量是必然非常大的,因为对人的管理需要转化成对数据的管理,数据量非常大的时候(学生非常的多),校长该如何去管理???

假设校长在没有升职前是一个C语言的老师,他是一个懂编程的校长,在面对大量学生的信息(数据)时就想到了数据结构的链表,根据学生的信息(数据)去创建一个节点,例如:

将根据学生的信息(数据)所创建的节点以链表的形式链接起来,每新来一个学生就新增一个节点,将被开除的学生或者是毕业的学生就释放掉对应的节点,还可以以身高、成绩为键值进行排序来找出身高最高的学生或成绩最好的学生进行做出决策,这样一来对学生的管理就变成了对链表的增删查改。对管理的一个计算机的建模的过程可以简化为六个字:先描述,在组织。我们在C语言上描述一个事物只能用结构体来描述,先描述就是用结构体去描述对应的事物,比如校长用结构体去描述一个学生的基本信息,然后在使用链表将用结构体来描述的事物进行组织起来,这样一来校长对学生的管理就变为了对数据结构中链表的增删查改。

底层硬件虽然有很多,不同,但是硬件都有它的名称,状态,操作方法,对应的属性。作系统对底层硬件的管理也是先描述,在组织,先将底层硬件使用结构体抽象的描述出来,例如:

再将用结构体抽象描述起来硬件使用链表的形式组织起来。从此往后,操作系统对底层硬件的管理就变为了对数据结构链表的增删查改,例如:操作系统想找一个网卡,就可以根据网卡的名称来遍历一遍链表,然后再根据它的驱动做出管理,如:发送数据,关闭网卡。如果一个设备突然坏掉了,操作系统在链表中将这个坏掉的设备节点释放掉。

操作系统不仅要管理底层硬件同时也需要将驱动程序给管理起来,管理的方法也是先描述,再组织。使用结构体将驱动程序描述出来,里面的属性有:驱动的名称,驱动的类别,驱动的方法,驱动的状态,驱动的版本等等....,然后再给每一个驱动程序创建一个结构体对象,再使用数据结构组织起来,如链表。之后操作系统对驱动程序的管理就变为了对链表的增删查改。

总结:

操作系统的管理工作:先描述,再组织

3.系统调用接口

计算机的层状结构图:

在前面说过,操作系统是一个软件,它的主要工作是管理好软硬件资源对上层应用软件提供良好的运行环境。判断一款操作系统好不好主要是看这三点:稳定(软硬件资源管理的非常好,不会经常出现蓝屏死机现象)、高效(软硬件资源管理的代码算法部分写的非常良好)、安全(用户的数据不会泄露出去)。


为什么要有系统调用接口???举个例子:在现实生活的银行,如果我们要去银行中存钱或取钱,银行肯定不会让我们跑到仓库里自己去放钱或取钱,万一有人要存5000,实际上只在仓库里放了一块钱,还顺带在仓库里拿了一部分钱,所以银行会担心群众中有坏人,它不会将自己全面暴露出来,但是为了给我们提供服务,银行就设置了柜台(人工服务),ATM机,让我们去存钱或者是取钱,这样一来,银行就保证了自己的安全,也为群众提供了应有的服务。

同样也是如此,我们要去硬盘中读取数据,操作系统肯定不会让我们直接去遍历它管理硬盘那一个数据结构中的某个字段,万一我们把其他人的数据也拿去了怎么办,所以操作系统不能将自己全面暴露出来,这样做不安全。为了解决这个问题,所以操作系统和用户之间有了系统调用接口这一层,系统调用接口是操作系统提供的一批接口,只允许用户通过系统调用接口来访问操作系统内部。


Linux操作系统是用C语言实现的(有少部分汇编),所以系统调用接口其实就是用C语言实现的函数,它是操作系统提供的系统调用函数。有些函数是有输入、输出的,所谓的输入其实就是用户想将数据交给操作系统,输出就是通过接口函数将数据拿给用户。

操作系统给上层用户提供的两方面的功能:1.数据方面的支持(如:用户想拿到文件数据、系统当中有多少进程等),2.功能方面的支持(如:用户想将数据通过网卡发送到网络,将数据写入到磁盘等)。


总结:任何人都不能直接去访问操作系统内部的数据,必须通过操作系统提供的接口函数才能去访问

用户不能直接去访问操作系统内部的数据,能不能直接绕过操作系统去控制底层硬件???答案是不能的,假设可以,如果用户一直在控制着网卡,网卡就会处于非常忙的状态,这时操作系统有个任务需要使用网卡,发现网卡一直被用户给控制着,这个任务就无法进行下去,那么操作系统的管理工作还做不做了。所以用户不能越级去控制底层硬件,必须通过系统提供的系统调用接口才行。

重新去理解printf函数和scanf函数

在学习C语言的时候,我们肯定使用printf函数和scanf函数。以printf函数为例,printf打印的消息是在显示器上显示的,显示器是一个硬件,肯定是被操作系统管理起来的,printf是C语言提供的标准输出函数,它有能力直接在显示器上打印内容吗??答案是不能的,用户不能越级去控制底层硬件,虽然我们不知道printf是怎么实现的,但是它的内部肯定封装并且调用了系统调用接口函数才能向显示器上打印内容。scanf同样也是如此,必须通过系统调用接口函数才能读取到用户在键盘上输入的数据。


不仅是C语言,其他语言也是如此,只要是影响到底层的硬件就必须通过系统调用接口函数才能去访问硬件。

虽然系统调用接口本来就是给用户准备的,但是要对操作系统有一定的了解才能把系统调用使用的好因为系统调用的参数和返回值必须得对操作系统有一定的认知,如果不懂的话使用系统调用接口会非常难受,所以就有人对系统调用接口进行了封装,形成了lib(库),提供给用户进行开发操作,减少使用者使用成本。

所以我们虽然没有使用过系统调用,但是通过学习计算机语言时也间接使用了,例如C语言将访问显示器和键盘的系统调用接口封装成了printf和scanf函数,所以才有了C标准库这样的概念。

系统调用和库函数之间的关系!!

系统调用是操作系统提供,库函数是用户提供(如C标准库),它们之间的关系是上下层的关系。并不是所有的库函数都会去调用系统调用,只要是库函数调用了系统调用它们的关系就是上下层的关系(库函数在上,系统调用在下)。

4.总结

我们通过学习冯诺依曼体系结构了解了计算机的组成结构,在通过计算机的层状结构图来学习操作系统是如何管理底层硬件的。

所以为什么要有操作系统的原因以及操作系统为什么要进行软硬件资源进行管理的原因就是因为:操作系统要对下管理好软硬件资源,对上要将自己的功能进行打包,形成系统调用接口,给上层的用户提供服务,可以让用户直接调用系统调用接口,也可以让用户直接使用各种库函数,为了让用户更好的去操作,所以在系统调用接口之上就有了shell外壳,lib(库),指令,用户就能更好的去进行指令操作、开发操作、管理操作

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

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

相关文章

LangGraph(四)——加入人机交互控制

目录 1. 引言2. 添加Human Assistance工具3. 编译状态图4. 提示聊天机器人5. 恢复执行参考 1. 引言 智能体可能不可靠,甚至需要人工输入才能完成任务。同样,对于某些操作,你可能需要在运行前获得人工批准,以保证一切按预期运行。 …

数据结构【AVL树】

AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树,通…

JavaScript【5】DOM模型

1.概述: DOM (Document Object Model):当页面被加载时,浏览器会创建页面的文档对象模型,即dom对象;dom对象会被结构化为对象树,如一个HTML文档会被分为head,body等部分,而每个部分又…

STM32烧录程序正常,但是运行异常

一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动(BOOT01,BOOT10),程序在掉电后无法保存,导致复位后无法正常运行。应确保BOOT00(从Flash启动)15。…

汽车二自由度系统模型以及电动助力转向系统模型

汽车二自由度系统模型与电动助力转向系统(EPS)的详细建模方案,包含理论推导、MATLAB/Simulink实现代码及参数说明: 一、二自由度汽车模型 1. 模型描述 包含以下两个自由度: 横向运动(侧向加速度&#xf…

git提交库常用词

新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。这…

LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作

LLM智能体(LLM agents)是能够自主行动以实现特定目标的AI系统。在实际应用中,智能体能够将用户请求拆解为多个步骤,利用知识库或API获取数据,最终整合出答案。这让智能体相比于传统独立聊天机器人拥有更强大的能力——…

[PMIC]PMIC重要知识点总结

PMIC重要知识点总结 摘要:PMIC (Power Management Integrated Circuit) 是现代电子设备中至关重要的组件,负责电源管理,包括电压调节、电源转换、电池管理和功耗优化等。PMIC 中的数字部分主要涉及控制逻辑、状态机、寄存器配置、通信接口&am…

PYTHON训练营DAY28

类 (一)题目1:定义圆(Circle)类 要求: 包含属性:半径 radius。包含方法: calculate_area():计算圆的面积(公式:πr)。calculate_circ…

机器学习-人与机器生数据的区分模型测试 -数据筛选

内容继续机器学习-人与机器生数据的区分模型测试 使用随机森林的弱学习树来筛选相对稳定的特征数据 # 随机森林筛选特征 X data.drop([city, target], axis1) # 去除修改前的城市名称列和目标变量列 y data[target] X_train, X_test, y_train, y_test train_test_split(X…

Data whale LLM universe

使用LLM API开发应用 基本概念 Prompt Prompt 最初指的是自然语言处理研究人员为下游任务设计的一种任务专属的输入模板。 Temperature 使用Temperature参数控制LLM生成结果的随机性和创造性,一般取值设置在0~1之间,当取值接近1的时候预测的随机性较…

Azure 应用的托管身份与服务主体

Microsoft Entra ID -- 前称 Azure Active Directory -- 提供强大的身份验证和授权功能。托管身份和服务主体通过限制凭据暴露的风险来帮助确保对 Azure 资源的访问安全。 托管身份为Azure原生应用程序自动管理身份,而服务主体则非常适合需要访问Azure资源的外部应…

16 C 语言布尔类型与 sizeof 运算符详解:布尔类型的三种声明方式、执行时间、赋值规则

1 布尔类型 1.1 布尔类型概述 布尔类型用于表示逻辑上的真(true)和假(false)两种状态,是编程中条件判断和逻辑运算的基础。在 C 语言中,布尔值的表示方式随着标准的发展而不断完善。 1.2 布尔类型的三种声…

【C++详解】string各种接口如何使用保姆级攻略

文章目录 一、string介绍二、string使用构造函数析构函数赋值运算符重载string的遍历修改方法1、下标[]2、迭代器3、范围for 迭代器使用详解const迭代器反向迭代器(reverse) Capacity(容量相关)size/lengthmax_sizecapacityclear/emptyshrink_to_fit(缩容)reserve(扩…

回调函数应用示例

回调函数是一种通过函数指针(或引用)调用的函数,它在特定事件或条件发生时被另一个函数调用。回调函数的核心思想是将函数作为参数传递,以便在适当的时候执行自定义逻辑,常用于异步编程、事件驱动架构等场景。 业务场景…

linux标准库头文件解析

linuxc标准库 C 标准库&#xff08;C Standard Library&#xff09;包含了一组头文件&#xff0c;这些头文件提供了许多函数和宏&#xff0c;用于处理输入输出、字符串操作、数学计算、内存管理等常见编程任务。。 头文件功能简介<stdio.h>标准输入输出库&#xff0c;包含…

Unbuntu 命令

Ubuntu 命令速查表​ ​分类​​命令​​功能描述​​示例/常用选项​​​​文件与目录​ls列出目录内容ls -a&#xff08;显示隐藏文件&#xff09;; ls -lh&#xff08;详细列表易读大小&#xff09; cd切换目录cd ~&#xff08;主目录&#xff09;; cd ..&#xff08;上级…

怎么在excel单元格1-5行中在原来内容前面加上固定一个字?

环境&#xff1a; WPS 2024 问题描述&#xff1a; 怎么在excel单元格1-5行中在原来内容前面加上固定一个字&#xff1f; 解决方案&#xff1a; 1.在Excel中&#xff0c;如果您想在单元格的内容前面添加一个固定的字&#xff0c;可以通过以下几种方法实现&#xff1a; 方法…

Linux zip、unzip 压缩和解压

zip 命令用于压缩文件&#xff0c;压缩后的文件后缀名为 .zip 。 对应的解压命令是 unzip 。 测试用的目录结构如下&#xff0c; userzn:~/test$ tree . ├── folder1 │ ├── folder111 │ │ └── file1.txt │ └── main1.c ├── folder2 │ ├── …