【Linux系统】冯•诺依曼体系结构与操作系统

news2024/11/16 20:40:57

        本篇博客整理了操作系统相关的基础知识,先从硬件之冯•诺依曼体系结构,再结合软件之操作系统,旨在帮助读者理解计算机的软硬件资源,和操作系统的管理软硬件资源的手段。

目录

一、冯•诺依曼体系结构

1.计算机硬件设备

2.体系结构的再推导

3.内存的意义

4.计算机之间的数据交互

二、操作系统

1.计算机的层状结构

1.1-操作系统之下

 1.2-操作系统之上

2.先描述,再组织

2.1-如何管理

2.2-如何维护硬件信息


一、冯•诺依曼体系结构

        现在常见的计算机(如笔记本、台式机)和不常见的计算机(如服务器等),它们本质都是一堆硬件——cpu、内存、网卡、磁盘等的集合。但并不是说,把这些硬件随意放在一起就能够组成计算机,而是各硬件之间首先要具备协同能力,这就要求硬件与硬件之间要组织好,构建成一个系统,这样才能对外提供计算输出服务。

        数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯•诺依曼体系结构。

        冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。 ​

1.计算机硬件设备

  • 输入设备:鼠标、键盘、摄像头、磁盘、网卡等。

        为了给用户提供计算服务,就需要用户先把数据交给计算机。但计算机只认识二进制的0和1且通过各种电路信号来计算,而用户提供的数据一般是文字、图片、音频等,所以就需要有一些设备,能够把用户的数据转换成二进制,然后再交给计算机。于是这就决定了,用户是无法直接访问到内存、中央处理器等硬件的,而必须要经过输入设备来访问。例如通过键盘上输入一串字符“abcd”,对于用户而言,输入的是一个字符串,但对于计算机而言,用户输入的是一串0和1的序列。

  • 输出设备:显示器、音响、磁盘、网卡、显卡等。

        计算机运算完毕后,也只能输出二进制,为了将这些二进制结果转换成文字、图片等用户可以看懂的形式,就需要经过输出设备的处理。因此,输入、输出设备一般是用来进行人和计算机,计算机和计算机之间互相传递信息的外部设备。

  • 外存:光盘、U盘、磁盘、磁带、硬盘、软盘等。

        外存存储器的存储容量很大,是计算机存储数据的主力。计算机要从外存(例如硬盘)读取数据,会先将外存中的一部分数据加载到内存,再通过CPU调度输入设备来改写或通过CPU调度输出设备来查看。 

        外存、输入设备、输出设备统称为计算机的外设。

  • 中央处理器(CPU):运算器 + 控制器 + 寄存器。

        中央处理器(CPU)由运算器和控制器共同组成。在不考虑缓存的情况下,CPU只能对内存进行读写,不能访问外设(输入、输出设备)。

        其中,运算器是对用户输入的数据执行计算任务,分为算数运算和逻辑运算,前者就是加减乘除,后者就是真假判断;而控制器是对计算过程,即硬件流程进行控制,协调各组件与各单元间的工作;寄存器可用于传送和暂存数据,也可参与算术运算和逻辑运算,并保存运算结果。

  • 存储器(内存 )

        内存包含主存和高速缓存,是一种硬件级别的缓存空间,作为CPU和输入输出设备、外存之间的中转站,在冯•诺依曼体系结构中占据核心地位。存储数据的硬件随着存储容量越来越大,访问数据的速度会越来越慢,访问成本也会越来越高(存储金字塔理论),为了保证计算机的运算效率,冯诺依曼体系结构要求,数据必须先从输入设备写入内存,CPU再从内存读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入内存,再从内存中将结果刷新到输出设备。

  • 【补】总线

        冯诺依曼体系结构中涉及的五大模块——输入设备、存储器、运算设备、控制器、输出设备——都是独立的个体,有各自独立的功能。而这些独立的个体要共同组成一个计算机,就必须要将它们组织联系起来。输入设备需要把数据交给内存,CPU再从内存中读取数据进行运算,将运算结果再写入内存,内存最终再把数据交给输出设备。

        为了实现数据在五大模块间的流动,就需要把用“线”把各个硬件单元连接起来,这个“线”在计算机中就被称作总线。

        总线可分为系统总线和IO总线。前者是用于连接CPU和内存,后者是连接内存和外设(输入、输出设备)。

        有些总线在我们拆开计算机后可以直接看到,有些则是直接集成在硬件电路上。

2.体系结构的再推导

        数据在计算机中的运算,主要是一系列的算术运算和逻辑运算(运算器)。

        想要计算机为用户提供计算服务,首先需要用户将数据输入到计算机中,于是,计算机必须要有输入设备来接收用户的数据。

        当计算机计算完毕后,还需要将结果反馈给用户,于是,计算机必须要有输出设备来输出计算的结果。

        但是计算机中只有算术运算和逻辑运算是远远不够的,还需要有一种控制功能(控制器),来控制何时从输入设备获取数据、何时输出结果到输出设备等。拿一个C语言程序来类比,算术运算对应的是一系列的加减乘除,逻辑运算对应的是一系列的逻辑 & 和逻辑 | 等等,控制功能对应的是C语言条件判断、循环、各个函数的调用等等。

        而当需要运算的数据较多,以及运算后的结果较多,不能及时处理,此时就需要一种存储功能(寄存器),将要输入的数据和要输出的结果暂时存起来,等待处理。

        这个具有算术运算功能、逻辑运算功能、控制功能、一定容量的存储功能的模块就被称为中央处理器,简称CPU。

        在实际的操作中,用户输入的数据和需要获取的结果当下未必要交给CPU处理,可能在未来用到,至于在未来什么时候用到,还不清楚,但在这期间可能还会有新的不必及时处理的数据,于是就需要一种容量较大的存储功能(存储器)将数据先保存起来,以期在需要时使用。

 

3.内存的意义

        冯诺依曼体系结构要求:数据必须先从输入设备写入存储器,CPU再从存储器读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入存储器,再从存储器中将结果刷新到输出设备

        这是因为,在计算机体系结构中,不同部分的材料不同,它们的性能也不同,所以存储是分级的。

        其中,不同部分的访问速度是:CPU内的寄存器 > 存储器(内存) > 外设(外存、输入输出设备),且它们之间的关系不是大于,而是远大于。它们的访问速度并不在一个量级,例如CPU是纳秒级别的,内存是微秒级别的,而外设是毫秒级别的。由于CPU和外设之间的速度差距很大,如果将CPU与外设直接进行连接,就会在木桶效应的影响下,导致计算机整体的运算速度下降。

        如果CPU直接和外设连接,那么,就算CPU的运算速度再快,计算机整体的运算能力也会被外设的读取速度所限制。

        假设CPU需要一个数据,这个数据在输入设备和内存中都有,如果从输入设备中拿需要1毫秒,那么从存储器中拿就只需要1微秒;假设CPU需要传出一个数据,如果直接给输出设备的话,也是需要1毫秒,但给存储器的话只要1微秒。

        因此,为了降低木桶效应对计算机整体运行速度的影响,冯·诺依曼体系结构要求CPU只能和内存进行数据交互。

        内存除了读取速度较快以外,还起着第三方中介的作用。数据可以从输入设备预先加载到内存,等CPU空闲了,再直接到内存读取数据。CPU的运算和内存从外设中读取数据,是可以同时进行的,这使得计算机整体的运行速度大幅提升。

        而如果没有内存,外设与CPU直接相连,那此时外设就必须等CPU当前的运算结束后,才能继续将数据传给CPU以及继续从CPU中获取结果。

        此外,由于冯·诺依曼体系结构要求CPU只能和内存进行数据交互,一个程序要运行就必须先加载到内存。

        所有软件的设计,都必须遵循硬件结构的规律,硬件是整个计算机的下限,而软件是上限。基础决定上层,只要是硬件的要求,所有软件都必须要遵守。

        一个可执行程序(软件)一般是由一些源文件编译生成的,然后才能运行。而这些源文件和编译生成的可执行程序都是保存在外设(硬盘或磁盘等)上。运行可执行程序,就是让CPU来执行文件中的代码,对其中的数据进行运算,而根据冯·诺依曼体系结构的要求,CPU只能从内存中拿数据,因此,一个程序想要运行,就必须先加载到内存。

 【小结】

  • 冯·诺依曼体系结构要求,CPU只能和内存进行数据交互。
  • 内存的意义是,在存储分级和木桶效应的影响下,尽可能提升计算机的整体运行速度。
  • 冯·诺依曼体系结构保证了CPU的运算和IO可以同时进行。
  • 外设和CPU在数据层面不会直接交互,但是在信号控制阶段,CPU和外设是可以直接进行交互的。
  • 所有软件的设计,都必须遵循硬件结构的规律;一个程序要运行,就必须先加载到内存。

 

4.计算机之间的数据交互

        以“我”通过QQ与朋友进行通讯为例。

  1. 要用QQ软件进行通讯,首先“我”和朋友的电脑都需要联网。
  2. “我”和朋友的电脑都是冯·诺依曼体系结构,当“我”向朋友发了一句“在吗?”,“我”电脑中的键盘充当了输入设备,显示器和网卡充当了输出设备;而朋友电脑中的网卡因为从网上获取“在吗?”又将“在吗?”加载到内存,充当了输入设备,显示器充当了输出设备。
  3. 当“我”开始在键盘当中输入“在吗?”,键盘将“在吗?”加载到内存,此时“我”电脑的显示器也从内存中获取了“在吗?”进而显示在显示器上;而CPU从内存获取到“在吗?”并对其进行各种封装,然后再将其写回内存,好让网卡可以获取;“我:电脑的网卡获取“在吗?”后,会在网络中经过一系列处理。
  4. 朋友电脑的网卡会从网络中获取“我”发给他的“在吗?”,并将“在吗?”加载到内存中;CPU再从内存中获取“在吗?”并对其进行解包,然后将解包好的“在吗?”写回内存;最后,朋友电脑的显示器就可以从内存中获取“我”发的“在吗?”,并显示在显示器上让他看到。

二、操作系统

        上文中提到的很多硬件设备,如键盘、显示器、网卡、CPU等,都各有所职,发挥着各自的功能。但在实际中这是不够的,它们需要相互配合来共同完成任务,而这最好有一个角色能将它们管理起来,让它们在合适的时机有合适的分工——操作系统就是这样一个角色。

        简单来说,操作系统就是一款管理软硬件资源的软件,其中包括内核(进程管理、内存管理、文件管理、驱动管理)与其他程序(例如函数库、shell程序等等)这两个部分,既可以管理和调配好硬件资源,又可以为软件提供一个良好的执行环境。

        那么,操作系统是如何进行管理的呢?

1.计算机的层状结构

1.1-操作系统之下

        肉眼可见、触手可及的计算机硬件,看似是一个个独立且独特的部件,其实在底层互有联系,共同组成了冯·诺依曼体系结构。

         但如果只有这些底层硬件,对于完成计算机的任务来说是远远不够的。内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?——这些都需要一个角色来进行管理和调度,而这个角色就是操作系统。

         但实际上,操作系统并不是直接管理底层硬件的。
        这是因为,比如说操作系统直接在键盘中读取数据,只要键盘的读取方式发生改变,那么操作系统的内核源代码就需要重新编译,这样一来,操作系统的维护成本就太高了。

        为了降低操作系统的维护成本,操作系统与底层硬件之间增加了一层驱动程序。

        驱动程序的主要功能就是控制底层硬件,可以访问硬件的读写和当前的状态等等,和硬件直接打交道,完成了操作系统与底层硬件之间的解耦。例如,键盘有相应的键盘驱动,网卡有相应的网卡驱动,硬盘有相应的硬盘驱动等等。驱动一般是由硬件制造厂商提供,或是根据操作系统的相关模块进行开发的(比如网卡)。有了驱动,操作系统就只需操心何时读取数据,而不必操心数据是如何读取的了。

         既然实际是驱动程序在负责管理底层硬件,那操作系统又管理的是什么呢?——

  1. 内存管理:内存分配、内存共享、内存保护、内存扩容等。
  2. 驱动管理:对计算机设备的驱动程序进行分类、更新、删除等操作。
  3. 文件管理:对文件存储空间的管理、目录的管理、文件操作的管理、文件的保护等。
  4. 进程管理:主要是对进程的调度。

 1.2-操作系统之上

        操作系统之上就是用户层,用户就是在这一层使用命令行或图形化界面进行各种操作的。

        而实际上,用户也不是直接在操作系统上进行操作的。为了保护操作系统,保证稳定、安全、高效的程序执行环境,操作系统不允许用户对其直接进行操作,而是为用户一些接口,让用户间接在操作系统进行操作。这一系列接口被称为系统调用接口。

        但系统调用接口对于普通用户来说,上手成本又太高了,要直接系统调用接口,就必须要求用户对系统有一定了解。于是,为了降低上手成本,方便用户使用,系统调用接口之上又构建出了一系列用户操作接口。其实,在语言级别上使用的各种库函数,就是封装了系统调用接口的,例如C语言的printf()、scanf()等。

 【小结】库函数调用和系统调用

  • 站在开发的角度,操作系统对外可以视为一个整体,会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口,是操作系统的一部分。
  • 系统调用接口在使用上,功能比较基础,但对用户的要求很高,所以开发者对部分系统调用进行了适度封装,从而形成库,这样更有利于上层用户或开发者进行后续的开发。
  • 库函数调用和系统调用之间是调用和被调用的关系,库函数调用在上层,系统调用在下层。

 

2.先描述,再组织

        操作系统对下可以管理好硬件资源,对上可以为软件提供一个良好的执行环境,为用户提供一个良好的使用环境。那么,操作系统是如何进行管理的呢?——答案是先描述,再组织!

 

2.1-如何管理

        要理解操作系统是如何进行管理的,就得先正确理解管理。

        这里以校园管理为例。校长作为学校的管理者,学生作为学校里被管理对象,校长是如何管理学生的呢?

        如今,每个学校都有自己的教务系统,教务系统有学生的各种信息——姓名、学号、年级、绩点等等。

        假设某一天,学校要评选奖学金,校长作为管理者,只需在教务系统中依据每个学生的成绩排个序,就完成了对学生成绩的排名,然后根据这份排名就可以把奖学金发给排在前例的学生。

        又假设某一天,一名学生挂科的学分太多,需要留级处理,校长作为管理者,只需要更改这名学生在教务系统中的年级信息即可。

        在以上事例中,校长作为管理者在进行校园管理的时候,并没有与作为被管理对象的学生见面;而实际上,校长也不是直接在管理学生,而是在对教务系统中学生的信息进行增删改查的操作。也就是说:

  • 在管理过程中,管理者和被管理对象其实不必见面。
  • 管理本质是对被管理对象的属性的增删改查操作。

        那校长作为做决策的管理者,是如何知道学生的各种信息的呢?——从执行决策的执行者那里得知。而在学校里,辅导员就扮演执行者这一角色。比如说,校长需要知道学生们的假期去向——放假后什么时间离校,去哪里,怎么去——于是安排辅导员去收集学生的信息;辅导员收到校长的安排后,就开始执行,在vx群里通知学生,让学生填表,然后自己将表格收集起来交给校长。这样一来,校长就知道学生们的假期去向了。

  • 管理者和执行者的本质区别在于,管理者拥有决策权,而执行者是没有决策权的,只负责执行管理者的决策。

        回到计算机当中,来操作系统就相当于是校长,属于管理者;驱动程序就相当于是辅导员,属于执行者;硬件就相当于学生,属于被管理者——

计算机身份角色
操作系统校长管理者
驱动程序辅导员执行者
底层硬件学生被管理对象

        也就是说,操作系统是通过驱动程序来获取到硬件的各种信息,以实现对硬件的管理。比如,网卡在使用的过程中发生了故障,驱动程序就会把错误信息报告给操作系统;如果操作系统本身如果解决不了,就会把信息报告给用户,提示用户需要更换网卡。

 

2.2-如何维护硬件信息

        管理本质是对被管理对象的属性的增删改查操作,换句话说,操作系统管理底层硬件,本质是在维护硬件的信息。

【Tips】操作系统对底层的管理:

  • 先描述:用结构体定义被管理对象的属性;
  • 再组织:借助数据结构,将描述硬件属性的结构体组织起来。

        再以校园管理为例,先将作为被管理对象的学生的信息用结构体封装起来:

struct student 
{
    //学生的各种信息
    char name[10]; //姓名
    int id[20];    //学号
    int age;       //年龄
    int grade;     //年级
    int GPA;       //绩点
    //...
 
    struct student* next;
    struct student* prev;
};

         再借助数据结构,如链表,将封装学生信息的结构体组织起来:

        这样一来,对学生信息的增删改查,就变成了对一个链表的增删改查。

        回到计算机当中,同理,先将底层硬件的信息用结构体封装起来,再借助数据结构,如链表,将这些结构体组织起来:

【小结】 操作系统对底层硬件的管理,最终都会转换为对某种数据结构的增删查改(这同时也决定了操作系统中含有大量的数据结构)。

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

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

相关文章

mac自定义快捷键打开系统应用

最终效果是达成altg直接打开浏览器,解放双手、再也不需要移动鼠标双击打开应用啦!!!~ 1.commandspace输入自动操作 2.选择快速操作 3.选择使用工具、运行appleScrpit 4.输入打开浏览器代码 tell application "G…

Delta lake with Java--分区表

今天尝试一下将昨天的数据操作建立的表换成分区表,参考Delta Lake Up and Running做法用分区表的方式来更新数据。还要比较一下分区表的查询与非分区表的查询,结果显示分区表的查询速度要比非分区表要快。直接上代码: import io.delta.table…

使用memcache 和 redis 、 实现session 会话复制和保持

一、NoSQL介绍 NoSQL是对Not Only SQL、非传统关系型数据库的统称 NoSQL一词诞生于1998年,2009年这个词汇再次提出指非关系型、分布式、不提供ACID的数据库设计模式 随着互联网时代的数据爆发时增长、数据库技术发展的日新月异,要适应新的业务需求&am…

JavaWeb_请求响应_简单参数实体参数

一、SpringBoot方式接收携带简单参数的请求 简单参数:参数名与形参变量名相同,定义形参即可接收参数。并且在接收过程中,会进行自动的类型转换。 启动应用程序后,在postman中进行测试: 请求成功,响应回了O…

eve 导入linux

mkdir /opt/unetlab/addons/qemu/linux-centos7 cd /opt/unetlab/addons/qemu/linux-centos7 上传hda.qcow2 /opt/unetlab/wrappers/unl_wrapper -a fixpermissions Linux images - (eve-ng.net) Due to very high demand of this section and problems with how to crea…

# 在 Windows 命令提示符(cmd)中,可以通过以下方法设置长命令自动换行

在 Windows 命令提示符(cmd)中,可以通过以下方法设置长命令自动换行 1、点击 cmd 窗口左上角标题栏,选择【属性】。 2、在【属性】菜单中,依次点击【选项】,找到【编辑选项】下面的【自动换行】&#xff…

Vue CLI脚手架项目目录和运行流程介绍

目录 一、项目目录介绍 二、运行流程介绍 一、项目目录介绍 二、运行流程介绍 项目在启动时会先运行main.js main.js的核心代码如下 1.导入Vue import Vue from vue 2.导入App.vue import App from ./App.vue 3.实例化Vue,将App.vue渲染到index.html容器中 new Vue({r…

为什么说虚拟化技术是现代网络安全的重要组成部分?

虚拟化技术是一种对计算机资源的抽象和资源管理技术,将电脑的各种实体资源(CPU、内存、磁盘空间、网络适配器等)予以抽象、转换后呈现出来,并可供分割、组合为一个或多个电脑配置环境。今天德迅云安全带您了解为什么虚拟化技术能成…

dp 动态规划 力扣

64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输…

实时聊天系统设计

设计一个聊天系统最主要是保证消息能够及时可靠的从一端传入到另外一端,同时要支持对历史消息的查看。按照同时聊天人数聊天系统可以分,一对一(one on one)和群聊(group chat),按照消息传递的及…

.排序总讲.

在这里赘叙一下我对y总前四节所讲排序的分治思想以及递归的深度理解。 就以788.逆序对 这一题来讲(我认为这一题对于分治和递归的思想体现的淋淋尽致)。 题目: 给定一个长度为 n𝑛 的整数数列,请你计算数列中的逆序对…

C++进阶 | [2] 多态

摘要:多态的概念,多态的条件,虚函数的重写,抽象类,多态的原理,虚函数与虚函数表,与多态有关的问答题 1. Concept 多态的概念:通俗来说,就是多种形态,具体点就…

Redis(Jedis和SpringBoot整合Redis)

文章目录 1.Jedis1.介绍2.环境配置1.创建maven项目2.pom.xml引入依赖3.新建一个包并创建一个文件 3.Jedis远程连接到Redis1.Redis放到服务器可以连接的前提条件2.为Redis设置密码1.编辑配置文件2.找到 requirepass3.设置密码为root4.重启Redis,在shutdown的时候报错…

C语言写一个终端进度条

C语言写一个终端进度条 这个功能挺简单的,主要有以下两点: 如何获取终端宽度如何让字符在原地闪烁 如何获取终端宽度 这里用到了设备控制接口函数ioctl(),下面简单的介绍一下这个函数的用法: ioctl是一个在Unix和类Unix系统中…

[C语言]指针进阶详解

指针是C语言的精髓所以内容可能会比较多,需要我们认真学习 目录 1、字符指针 2、指针数组 3、数组指针 3.1数组指针的定义 3.2&数组名vs数组名 3.3数组指针的使用 4、数组传参和指针传参 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指…

如何使用SSH密钥克隆仓库

1.创建SSH Key 在用户目录下查看有没有.ssh目录。如果有且该.ssh目录下有id_rsa(私钥),和id_rse_pub(公钥)这俩文件,那么这一步就可以跳过。否则使用以下指令创建SSH Key ssh-keygen -t rsa -C "xxxqq.com" "xx…

【C语言】详解预处理

、 最好的时光,在路上;最好的生活,在别处。独自上路去看看这个世界,你终将与最好的自己相遇。💓💓💓 目录 •✨说在前面 🍋预定义符号 🍋 #define • 🌰1.#define定义常…

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法 过去有人曾对我说,“一个人爱上小溪,是因为没有见过大海。”而如今我终于可以说,“我已见过银河,但我仍只爱你一颗星。” 在Web开发和服务器管理中&#x…

3-qt综合实例-贪吃蛇的游戏程序

引言: 如题,本次实践课程主要讲解贪吃蛇游戏程序。 qt贪吃蛇项目内容: 一、功能需求 二、界面设计 各组件使用: 对象名 类 说明 Widget QWidge 主窗体 btnRank QPushButton 排行榜-按钮 groupBox QGroupBox 难…

C/C++开发,opencv-ml库学习,ml模块代码实现研究

目录 一、opencv-ml模块 1.1 ml简介 1.2 StatModel基类及通用函数 1.3 ml模块各算法基本应用 二、ml模块的实现原理 2.1 cv::ml::StatModel的train函数实现原理 2.2 cv::ml::StatModel的predict函数实现原理 2.3 cv::ml::StatModel的save函数和load函数 一、opencv-ml模…