当前位置: 首页 > news >正文

【JavaEE】计算机是如何工作的

计算机是如何工作的

  • 冯诺依曼体系
  • 操作系统
    • 操作系统的概念与定位
    • 进程和任务
    • 操作系统对进程的管理
      • PCB 的相关信息

冯诺依曼体系

现代的大多数计算机, 都遵循冯诺依曼体系
在这里插入图片描述

  • CPU 中央处理器: 进行算术运算和逻辑判断
  • 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
  • 输入设备: 用户给计算机发号施令的设备
  • 输出设备: 计算机个用户汇报结果的设备.

CPU 内存 磁盘的比较

  • 存储空间上
    • CPU << 内存 < 磁盘
  • 读取速率上
    • CPU >> 内存 > 磁盘

寄存器 和 内存

  • 寄存器是CPU的一部分;
  • 寄存器, 和内存与磁盘相比, 存储空间更小, 访问速度更快, 成本更高, 掉电后数据丢失。
  • 寄存器的速度和内存的速度的差距是极大的,3~4个级别
  • 寄存器的用途,就是辅助 CPU 完成指令的执行;一条指令,不仅仅是指,指令本身,同时还有操作数,操作数就是要在寄存器中保存的

由于 寄存器 和内存之间速度和空间上差异太大了,难以协调工作,CPU往往又引入了“缓存”来调和 寄存器 和 内存之间的速度。

CPU 上要进行一系列运算,在运算过程中,要反复使用到一组内存中的数据,这些数据频繁使用,需要频繁访问内存,同时这些数据又比较多,在寄存器里又存不下,就可以放到缓存中了。

缓存的存储空阿金介于 寄存器 和 内存 之间

由于寄存器和内存之间,差距太大了,搞了一个缓存,还不太够用,后来又搞了一个。

在这里插入图片描述

操作系统

操作系统的概念与定位

  • 操作系统是一个软件, 是一个搞管理的软件

    1. 对下,要管理好各种硬件设备
    2. 对上, 要给各种软件提供好一个稳定的运行环境
    • 例如: CPU, 内存, 硬盘, 各种IO设备 … 他们都是需要相互配合才能进行良好的工作的, 操作系统这个软件, 就是总指挥!
  • 计算机如何给我们解决实际问题的?

    • 依靠一些软件, 软件能够在操作系统上运行
      • 硬件千差万别,如果每个写软件的人, 都需要考虑硬件的差别和兼容性, 这个事情门槛就非常搞了, 操作系统, 就把硬件屏蔽起来, 对软件这个里提供出一组API(系统调用), 让软件来进行调用
    • 因此, 操作系统 和 JDBC 这个层面上干的是类似的工作

进程和任务

  • 运行起来的程序叫做进程
    • 程序就是一个可以执行的文件, 只是磁盘上的一个东西
    • 如果双击程序, 此时操作系统, 就会把可执行文件中的数据和指令, 加载到内存中, 并且让 CPU 去执行这里的指令, 完成一系列的相关的工作. 运行起来的(动态的程序) 就是进程了
  • 进程能够干活, 说明进程能够消耗一定的硬件资源.
    • 可执行程序, 只是占用了硬盘空间; 而进程, 会消耗 CPU资源, 内存资源, 硬盘, 网络带宽…
  • 进程是系统分配硬盘资源的基本单位

操作系统对进程的管理

管理的概念

  • 为什么需要管理进程?
    • 一台正在运行的计算机, 一定会存在很多的进程正在运行;
    • 东西多了, 那很定就是需要进行管理, 才能让各个进程发挥自己的能力, 并将这些能力有效的组织起来, 高效的完成指定的工作
  • 如何进行有效的管理?
    • 管理不是"面面俱到" 不是"手把手", 这样会不仅累, 还低效
    • 高效管理的两大步骤: 先描述, 在组织
        1. 先描述: 提取要管理对象的基本信息与属性, 使用结构体或者类将其描述起来
        1. 在组织: 选用合适的数据结构, 对于新来的对象, 就通过 add 方法, 将新来的对象添加到数据结构中, 此时对于对象的管理, 就转化成对数据结构的增删改查操作了。

操作系统对进程的管理的组织过程

  1. 描述: 会用使用一个专门的结构体, 来记录一个进程里面的各个属性
    • PCB (进程控制块) --> 通用叫法, 各种系统里面描述的进程部分都可以称为PCB
      • 在Linux中PCB, 源码中是一个 task_struct 结构体
  2. 组织: 会使用一系列的数据机构, 把多个进程进行一个有效的组织, 随时方便进行遍历, 查找, 汇总数据 …
    • 通常是使用双链表这样的方式来进行组织的 – 这个是对Linux来说的
    • 当使用双链表来组织的时候:
      • a) 查看进程的列表, 本质就是在遍历这个链表
      • b) 创建一个进程, 就是创建了一个 PCB结构体,并且插入到链表上
      • c) 销毁一个进程, 本质就是把这个PCB结构体从链表上删除并释放

PCB 的相关信息

  1. pid 进程的标识
    • 同一个系统上, 统一时刻中, 每个进程的 pid 一定都是不同的
  2. 内存指针
    • 表示了该进程, 对于的内存资源是什么样的
    • 主要存储的就是从 exe 可执行文件中加载过来的指令(二进制的指令, 都是在程序员开发这个程序的时候, 最终编译生成的结果,也就是程序员写代码的逻辑) 和 数据
      • 指令相当于剧本, 进程就相当于表演的舞台
    • 还需要保存一些运行过程中的中间结果之类的的数据
  3. 文件描述符表
    • 和磁盘资源相关了
    • 磁盘是硬件, 应用程序一般是没法直接接触到 “硬件” 这一层的.
    • 实际上是操作系统抽象"文件"这样的概念, 程序操作的是文件, 文件实际上是存储在磁盘上的
    • 每个进程就会一个 “文件描述符表” 来记录 当前这个进程在使用哪些文件
      • 操作系统在打开一个文件, 就会产生一个 “文件描述表”(就像文件的身份表示一样, 当然只是在进程内部生效的)
      • 同时会使用文件描述符表(类似数组), 包文件描述符组织起来

CPU 与 进程 之间的联系

  • 进程是需要在CPU上来执行指令的
    • 每个进程, 要想执行里面的指令, 完成对应的任务, 都需要在 CPU 上执行!

    • 问题提出: 一台机器上, 进程同一时刻, 有百八十个, 但CPU只有一个? 怎么办?

      • 轮着用就可以了, 进程的调度
  • CPU的发展历程
    • CPU一开始是单核的, 只能运行同时一个进程在上面运行
    • 摩尔定律: 芯片的集成程度会成倍增长, 算力会提供一倍, 成本会减半
    • 但是随着时间的增长, 摩尔定律就失效了, 因为芯片再小, 经典物理学就失效了, 量子物理学此时就生效了 – 所以芯片的继承程度不会一直增加
    • 集成程度失效了, 那就靠数量来凑 – 多核CPU
    • 又提出来超线程概念: 一个CPU可以同时跑两个进程
    • 现在的CPU就是多核多线程 – 例如六核十二线程

CPU虽然可以让多个进程同时在一起跑来了, 但是还是不能满足所有进程, 因为CPU是有限的, 进程的数量远大与CPU的数量, 解决方法就是轮着来, 以下是解决方案:

  1. 并行: 同一时刻, 两个进程, 同时运行在两个 CPU 逻辑核心上
  2. 并发: 两个进程, 在同一个舞台上, 轮着上
  • 由于 CPU 切换进程速度极快, 微观上, 这两进程是串行执行的; 宏观上, 看起来就是这两个进程在 “同时” 执行的
  • 操作系统, 在调度这些进程的时候, 可能是按照并行的方式来调度, 也可能按照并发的方式来调度, 在应用程序这一层, 感知不到~
  • 由于感知不到是哪种方式调度, 并且这两种的调度方式, 宏观上的体现效果都是一样的, 通常也会用 “并发” 这个词来代指 “并行” 和 “并发”
  1. PCB 中关于进程调度相关的属性(这些属性也就描述了 进程 对于的 CPU 资源的使用情况) – 需要重点掌握
    1. 状态
    • 就绪状态: 一个进程已经随时做好了在CPU上执行的的准备
      • 就绪状态的意思是: 可能在CPU上跑, 也可能没有在CPU上, 而是已经做好了被CPU调度的准备
    • 阻塞状态 / 睡眠状态 : 有时候, 进程没有准备好呗调度到CPU上
    • 状态是可以相互转换的
    • 进程还有许多状态, 但是就绪和阻塞是最重要的两种状态
    1. 优先级
    • 系统给进程进行调度的时候, 也是不完全公平的, 也会根据优先级的不同, 来决定事件的分配权衡 – 这样就可以把系统资源调配给更重要的进程上了
    1. 上下文
    • 因为进程是轮着上的 – 所以一次执行, 大概率是无法完成指定的任务的, 这就需要保证下次上 CPU运行的时候, 能够找到上次运行的位置, 继续向后运行

    • 就好像存档 读档一样

    • 对于操作系统来说, 所记录的上下文是啥? 就是该进程在执行过程中, CPU寄存器中对应的数据
      • 这些寄存器, 有的是存一些中间结果, 有的是存一些特定含义的数据(比如下一条指令时在哪里, 比如当前的函数调用关系…)
      • 这些寄存器中的数据就需要在进程离开 CPU之间, 都保存好
      • 保存到对应进程的 PCB 的上下文字段中(内存中)
      • 下次该进程回到 CPU 执行, 就可以把PCB中的上下文里的数据恢复到对应的寄存器中, 这个时候就是和上次执行的状态一模一样了
    1. 记账信息
    • 相当于一个统计信息, 会统计每个进程在 CPU 上都执行了多久, 执行了多少指令.
    • 是对于进程调度工作的一个"兜底"
    • 用来调整如何分配给进程的调度时间

进程地址空间(虚拟地址空间)

  • 进程地址空间提出的原因
    • 每个进程都需要分配到系统资源, 内存也需要分配给进程; 如果内存直接分配给进程, 此时别的进程就可能看到其他进程的相关信息,并将其修改, 导致其他的进程崩溃;

    • 并且, 直接分配内存空间, 会存在分配地址范围的不同, 且是未知的, 每个进程就需要对不同的地址进行不同的处理, 这样的代码编写会变得复杂.

    • 所以为了解决上述的问题, 在进程和内存之间提出了一个进程地址空间的概念

  • 进程地址空间的解决原理:
    • 对于非法访问地址空间的问题: 进程现在只能找进程地址空间上的地址, 操作系统在对该进程地址空间上的地址进行判断, 如果是该进程的–也就是合法的, 那操作系统在通过该虚拟地址找到所对应的物理内存的地址, 如果虚拟地址是非法的, 那么操作系统就不会允许该进程使用该地址, 并直接向该进程发送中断信号.
    • 对于地址不统一, 编写代码复杂的问题: 每个进程得到都是用同样的进程地址空间, 进程地址空间设计的时候是一样的, 所以每一个进程看到自己的进程地址空间, 结构上都是一样的, 所以代码就可以统一对该进程地址空间进行编码, 对应实际物理内存空间就交给操作系统来分配了

进程间通信

  • 进程地址空间将进程独立开来, 每个进程只能看到自己的资源, 无法看到别人的资源, 也就无法影响别的进程, 但是, 两个进程也就无法进行信息交流了
  • 但是, 有时候, 我们需要两个进程之间进行通信 – 所以, 我们就提出了进程间通信的概念
  • 进程间通信核心: 让两个不同的进程看到同一份资源!
  • 进程间通信方案:
      1. 基于文件
      1. 基于网络

相关文章:

【JavaEE】计算机是如何工作的

计算机是如何工作的 冯诺依曼体系操作系统操作系统的概念与定位进程和任务操作系统对进程的管理PCB 的相关信息 冯诺依曼体系 现代的大多数计算机, 都遵循冯诺依曼体系 CPU 中央处理器: 进行算术运算和逻辑判断存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入…...

12JVM基础

五、JVM 17、JVM基础 说一下堆栈的区别&#xff1f; 功能方面&#xff1a;堆是用来存放对象的&#xff0c;栈是用来执行程序的。 共享性&#xff1a;堆是线程共享的&#xff0c;栈是线程私有的。 空间大小&#xff1a;堆大小远远大于栈。队列和栈是什么&#xff1f;有什么区别…...

07 创建型模式-单例模式

1.单例模式介绍 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一&#xff0c;此模式保证 某个类在运行期间&#xff0c;只有一个实例对外提供服务&#xff0c;而这个类被称为单例类。 2.使用单例模式要做的两件事 保证一个类只有一个实例…...

RunnerGo 支持UI自动化的测试平台

RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selenium浏览器自动化方案构建&#xff0c;内嵌高度可复用的测试脚本&#xff0c;测试团队无需复杂的代码编写即可开展低代码的自动化…...

LLM ReAct: 将推理和行为相结合的通用范式 学习记录

LLM ReAct 什么是ReAct? LLM ReAct 是一种将推理和行为相结合的通用范式,可以让大型语言模型(LLM)根据逻辑推理(Reason),构建完整系列行动(Act),从而达成期望目标。LLM ReAct 可以应用于多种语言和决策任务,例如问答、事实验证、交互式决策等,提高了 LLM 的效率、…...

聊聊分布式架构08——SpringBoot开启微服务时代

目录 微服务架构时代 快速入门 入门详解 SpringBoot的自动配置 石器时代&#xff1a;XML配置bean 青铜时代&#xff1a;SpringConfig 铁器时代&#xff1a;AutoConfigurationImportSelector 手写简单Starter SpringApplication启动原理 微服务架构时代 Spring Boot的…...

Vue项目中集成TinyMCE富文本编辑器(图片批量上传等)

TinyMCE富文本在Vue中的使用 关于TinyMCE 实现效果 安装使用TinyMCE 第一步 第二步 1.官网申请Your Tiny API Key&#xff0c;并且配置访问域名&#xff1a; 2.使用css隐藏(这个就不讲了&#xff0c;不推荐使用) 3.全部由本地加载(推荐) 第三步(汉化包) 第四步(封装组…...

前端数据可视化之【title、legend、tooltip、toolbox 】配置项

目录 &#x1f31f;Echarts配置项&#x1f31f;Echarts配置项之 title组件&#x1f31f;Echarts配置项之 legend组件&#x1f31f;Echarts配置项之 tooltip组件&#x1f31f;Echarts配置项之 toolbox组件&#x1f31f;写在最后 &#x1f31f;Echarts配置项 ECharts开源来自百度…...

microcom串口调试工具使用

microcom串口助手使用介绍 microcom是一个在终端中使用的串口助手&#xff0c;类似平常使用SSCOM一样的东西&#xff0c;不过是在终端中使用而已。 使用的是busybox构建的文件系统 microcom源码路径&#xff1a;busybox/miscutils/microcom.c microcom 参数&#xff1a; [r…...

深入了解Golang:基本语法与核心特性解析

1. 引言 Golang&#xff08;Go&#xff09;是谷歌开发的一门开源编程语言&#xff0c;于2007年首次公开亮相&#xff0c;随后在2012年正式发布。Golang以其简洁、高效和可靠的设计而备受开发者青睐。作为一门编译型语言&#xff0c;Golang具有静态类型和垃圾回收功能&#xff…...

短视频矩阵系统源码---php搭建

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; &#xff08;1&#xff09;数据概览&#x…...

mysql 查询表字段名,注释 , 以及sql拼接查询出的内容

#sql查询字段名&#xff0c;注释操作拼接 #查询字段名和注释 select COLUMN_NAME,COLUMN_COMMENT from information_schema.COLUMNS where table_name 表名 and table_schema 库名 order by ordinal_position #查询整个内容 select * from information_schema.COLUMNS wh…...

【JavaEE】_Servlet API

目录 1. HttpServlet 1.1 init方法 1.2 destroy方法 1.3 service方法 1.4 Servlet的生命周期 1.5 代码示例 1.5.1 使用postman构造请求 1.5.2 使用ajax构造请求 2. HttpServletRequest 2.1 核心方法 2.2 代码示例1&#xff1a;打印请求信息 3. 前端给后端传参 3.1…...

macOS下matplotlib如何显示中文字体?

一般要显示中文会使用&#xff1a; plt.rcParams[font.sans-serif][SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]False #用来正常显示负号不过在macOS下通常会显示方块字&#xff1a; 解决方案&#xff1a; 把上面两句注释掉&#xff0c;更换为&#xf…...

7-Zip怎么设置字典大小 单词大小 固实数据大小,把大文件9.35G压缩成小1.56G

环境: Win10 专业版 7-Zip v23.01 问题描述: 7-Zip怎么设置字典大小 单词大小 固实数据大小,把大文件9.28G压缩成小1.56G 解决方案: 要在7-Zip中设置字典大小、单词大小和固实数据大小,可以按照以下步骤进行操作: 打开7-Zip文件管理器,并导航到你要压缩的文件所在的…...

使用CPR库和Python编写程序

以下是一个使用CPR库和Python编写的爬虫程序&#xff0c;用于爬取。此程序使用了proxy的代码。 import requests from cpr import CPR ​ def get_proxy():url "https://www.duoip.cn/get_proxy"headers {"User-Agent": "Mozilla/5.0 (Windows NT …...

axios 请求的缓存封装

前言 咱们的网站或者程序&#xff0c;每一个页面和操作都需要请求后端接口来获取响应和渲染页面&#xff0c;抛开post请求方式的接口不说&#xff0c;部分get请求得到的数据&#xff0c;短时间内不会更新&#xff0c;或者短时间得到的响应数据不会变化&#xff0c;这个时候就可…...

Oracle性能调优实践中的几点心得

很多的时侯&#xff0c;做OracleDBA的我们&#xff0c;当应用管理员向我们通告现在应用很慢、数据库很慢的时侯&#xff0c;我们到数据库时做几个示例的Select也发现同样的问题时&#xff0c;有些时侯我们会无从下手&#xff0c;因为我们认为数据库的各种命种率都是满足Oracle文…...

勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒的威胁不断升级&#xff0c;其中.halo勒索病毒引起了广泛关注。本文91数据恢复将深入研究.halo勒索病毒的特点&#xff0c;探讨如何有效地恢复被其加密的数据文件&#xff0c;并分享预防这一威胁的关键措施。 .halo勒索…...

大厂秋招真题【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组

文章目录 【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组题目描述与示例题目描述输入描述输出描述示例输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 【前缀和】美团20230826秋招T5-平均数为k的最长连续子数组 题目描…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...