草庐IT

【Linux】冯诺依曼体系结构和操作系统概念

Corwttaml 2023-08-25 原文

文章目录


🎪 冯诺依曼体系结构

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

🚀1.体系概述

现代计算机发展所遵循的基本结构形式始终是冯·诺依曼机结构。这种结构特点是“程序存储,共享数据,顺序执行”,需要 CPU 从存储器取出指令和数据进行相应的计算。

  • 输入设备:包含键盘,话筒,摄像头,网卡,磁盘(I)

  • 存储器:包含内存(寄存器、高速缓冲存储器以及主存储器,操作系统关机数据不复存在)和外存(硬盘,软盘,CD,磁带,操作系统关机数据也可保存)

  • CPU:包含运算器(数据流计算交换)和控制器(接收指令和发出控制指令)

  • 输出设备:包含显示器,磁盘,网卡,声卡声响

比如我们上qq聊天,我们需要把聊天内容通过键盘输入给计算机(通过键盘这种输入设备),然后消息发出,显示到对方屏幕上(这时对方显示器就是输出设备)

而且它们的运行速度也有很大差异,在市面上可以几百块钱可以买到512G或者1T的硬盘,而内存只能买到8G或者12G的,显然同等存储空间下内存比硬盘要贵很多,那么同等地,它的速度也会比硬盘或者外设快很多。

而越昂贵,它的速度也就越块,运行速度:CPU >> 内存 >> 外设

🚀2.CPU和内存的数据交换

既然前面说了CPU速度是最快的,那么为什么还要存在内存呢,直接把CPU连到外设是不是会大大提升效率?

答案是否定的,举个例子来说,CPU工作的速度是纳秒级,而内存是微秒级,最后外设是毫秒级,如果CPU直接跟外设打交道,那么将是纳秒跟微秒的对比,CPU造价最贵,自然速度也就最快,那么它的时间将是很昂贵的,一个外设输入就会占用很多CPU的时间,这就跟木桶原理是一样的

木桶所能盛放的最大水量取决于最短的那块木板,而不是最长的那块,所以CPU如果直接跟外设打交道,那么计算机的运行速度完全取决于外设的速度,而CPU那么快的速度显然是浪费掉了,这时便引入了内存。

内存的访问速度比外设快,但是又比CPU慢,CPU可以直接从内存中拿到数据,放进CPU计算的同时,DMA可以把外设的东西调到内存,下次CPU就可以直接从内存中拿取数据。

这就是为什么我们打开一个程序的时候,需要先把数据加载到内存中,然后再交给CPU运行,因为这是体系结构决定的

结论:在数据层面,CPU一般不和外设沟通,而是只和内存打交道

🚀3.体系结构中数据的流动

我们下面模拟一下qq消息在两台主机中的传递:

数据先由张三的键盘输入"晚安",然后该消息被刷新到我们自己的显示器上,然后点击发送,这期间由DMA将数据调入内存,内存中数据在调入CPU进行加密,然后将加密后的数据返回给网卡,网卡在通过网络进行输出给另一台主机,另一台主机的网卡(此时网卡为输入设备)接收到数据,将数据给CPU进行解密,最后显示到对方李四的显示器上。

结论:在数据层面上,外设一般不直接和CPU打交道,而是和内存打交道

🎪 操作系统概念理解

在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。从计算机用户的角度来说,计算机操作系统体现为其提供的各项服务;从程序员的角度来说,其主要是指用户登录的界面或者接口;如果从设计人员的角度来说,就是指各式各样模块和单元之间的联系。事实上,全新操作系统的设计和改良的关键工作就是对体系结构的设计,经过几十年以来的发展,计算机操作系统已经由一开始的简单控制循环体发展成为较为复杂的分布式操作系统,再加上计算机用户需求的愈发多样化,计算机操作系统已经成为既复杂而又庞大的计算机软件系统之一

🚀1.简述

操作系统(OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等

操作系统包含:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库, shell程序等等)

🚀2.设计目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

🚀3.定位

  • 一款进行软硬件资源管理的软件

🚀4.理解

我们应该如何理解操作系统对硬件做管理呢?比如在IT公司中,有boss,还很多个团队,每个团队有队长和队员,我们可以拿boss - 队长 - 队员来解释。

在每个IT公司中,boss会做决策,比如开发某款产品,然后他会把任务下发给对应的团队,团队队长便会根据这个来组织队员进行软件的开发:

在以上的描述中:

  • boss:决策(管理者)
  • 队长:决策被执行
  • 队员:参与执行(被管理者)

在上述例子中我们看到,boss是不需要跟队员直接沟通达到执行决策的目的的,也就是:1.管理者和被管理者是不需要直接沟通的

那既然管理者和别管理者不需要直接沟通,那怎么做到管理的呢?我们想像一下,如果IT公司的员工订了一份外卖,此时外卖小哥把外卖送到了员工的办公桌上,那么他进入了公司大楼,但他是公司的员工吗?显然不是,要被定义为公司员工,得在公司电脑上能查到该员工的信息才行,不是进入公司大楼的就是该公司员工。同样的,假如说一个员工被炒鱿鱼了,他人离开公司就行了吗?显然不是,该公司需要删除这个员工的信息才行。所以说管理的本质是:2.对被管理对象的数据做管理

那么boss怎么拿到员工数据呢?这就需要每个团队的队长反馈队员数据给boss,boss才能拿到员工数据。也就是3.管理者通过一种媒介(这里是队长)拿到被管理者数据

所以说我们操作系统也是如此:

操作系统通过硬件驱动实现对硬件进行管理。

🚀5.管理的本质

正如我们上文所说,队长把队员数据交给boss,那么boss怎么看呢,一个大的IT公司至少有几百上千人,boss如果想查找业绩最低的人员开除,那岂不是得找很久?于是boss就想了一个办法:把所有队员的数据用一个类描述出来,比如叫Programmer,这个类里面有成员姓名(name),年龄(age),业绩(achievement)等基本信息,这就叫数据的描述然后每个人员的信息我们便可以清楚的看到:


如果我们要查找人员信息呢,我们得用一种数据结构来组织每个人员的基本信息
比如boss想用二叉树来组织:

此时我们只需要遍历这棵二叉树即可实现对员工信息的查找,操作系统也是,比如进程管理,操作系统会用PCB来描述进程的结构,又比如内存管理,操作系统会用页表来管理内存

总之,管理就是先描述,在组织,这句话会贯穿我们Linux的整个学习过程

🚀6.系统调用

操作系统的作用是对下提供管理好软硬件资源,、对上给用户提供良好(安全,高效,稳定,功能丰富)的良好环境,“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。会使处理器从用户态进入核心态

我们所熟知的系统调用有:

  • GUI(图形化界面)
  • shell和命令行
  • C函数(stdio.h)

有关【Linux】冯诺依曼体系结构和操作系统概念的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  7. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  8. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  9. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  10. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

随机推荐