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

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题

  • 1.冯诺依曼体系
  • 2.CPU是怎么构成的
  • 3.指令表
  • 4.CPU执行代码的方式
  • 5.CPU小结:
  • 6.编程语言和操作系统
  • 7. 进程/任务(Process/Task)
  • 8.进程在系统中是如何管理的
  • 9. CPU分配 -- 进程调度
  • 10.内存分配 -- 内存管理
  • 11.进程间通信

1.冯诺依曼体系

  • CPU中央处理器:进行算术运算和逻辑判断。
  • 存储器:分为外存和内存,用于存储数据(二进制存储)
  • 输入设备:用户给计算机发送指令的设备
  • 输出设备:计算机给用户汇报结果的设备
    在这里插入图片描述针对存储空间访问速度:硬盘>内存>>CPU
    针对数据访问速度:CPU>>内存>硬盘

2.CPU是怎么构成的

门电路 => 半加速 => 全加速 => 加法器 => ALU运算器(ALU是计算机中进行算数,逻辑运算的核心部件,是计算机的数学大脑)。
CPU以及其他的内存、硬盘等重要的设备都是由 门电路构成的。

3.指令表

  • 指令(instruction) | 功能说明4位opcode | 操作的地址或者寄存器
  • LOAD_A : 从RAM 的指定地址,将数据加载到A 寄存器。0010; 4 位RAM 地址
  • LOAD_B :从RAM 的指定地址,将数据加载到B 寄存器0001 ;4 位RAM 地址
  • STORE_A:将数据从A 寄存器写入RAM 的指定地址,0100; 4 位RAM 地址
  • ADD:计算两个指定寄存器的数据的和,并将结果放入第二个寄存器
    1000; 2 位的寄存器ID,2 位的寄存器ID

寄存器:是CPU上存储数据的单元。CPU上能直接存的数据比较少,这些寄存器主要是为了支持CPU完成一些计算,保存中间结果的。

4.CPU执行代码的方式

在这里插入图片描述
上面一段指令,其实就是内存中的一段数据;写好的代码最终要运行的话都需要让操作系统,先把写好并编译好的指令加载到内存中,然后CPU才能执行

  1. 假如从0号地址开始执行程序:CPU就会从0号地址读取数据,到CPU寄存器里,并且对这个指令进行解析(即查指令表,看指令的具体操作)
    在这里插入图片描述前4位(0010)是opcode参数(即查指令表):LOAD A:从内存中读取数据到A寄存器中。后4位(1110)是内存地址,十进制的14。

  2. CPU 接着从内存中,读取指令并解析:

在这里插入图片描述0001:LOAD B,1111:就是15号内存地址。
在这里插入图片描述

  1. CPU接着从3地址读取指令:在这里插入图片描述1000:为add,01为B,00为A,A寄存器的编号是00,B的编号是01,而这些都是指令表里提前约定好的。把**这两个寄存器的内容进行相加,结果保存到第二个操作数(A)的寄存器中
    在这里插入图片描述
  2. CPU接着读取3号地址的指令,在这里插入图片描述** 0100:STORE A,1101:13地址;把A寄存器中的值,写入到13这个地址上。**

5.CPU小结:

  1. CPU要执行的指令,是在内存中的(冯诺依曼结构的基本设定让执行单元和存储单元进行了 解耦合
  2. ** CPU想要执行指令,必须先读取指令,再解析指令,然后才能执行指令**
  3. 取指令需要从内存中读取指令到CPU的寄存器中(上面CPU读取解析和执行指令没有体现出存储指令的寄存器,只体现了AB用来计算数据的寄存器);因为读取内存操作相对于CPU执行计算,开销大很多,所以读取指令的操作,是非常耗时的,因此,CPU通过缓存,流水线等技术来优化这里的效率。
  4. CPU解析指令的时候,需要用到指令表,而不同架构的CPU支持的指令表不同(x86和arm等是不同的);指令表细节已经写死到CPU中了,CPU是可以很容易识别的
  5. 指令在执行过程中,可能会带有一些操作数,不同的指令,操作数的个数含义都有所不同
  6. CPU重要的参数,主频:表示的含义就可以近似看成一秒中之内,CPU能够执行的指令个数

6.编程语言和操作系统

  • 编程语言:高级语言经过编译、链接 =》汇编语言 经过汇编 =》机器语言

高级语言的一条语句往往对应多条指令才能完成

  • 操作系统:是一组做计算机资源管理的软件的统称。
  • 计算机系统的分层视图:

在这里插入图片描述

7. 进程/任务(Process/Task)

  • 进程就是操作系统提供的一种“软件资源”比如我们电脑正在运行的程序,就可以称为是”任务“,也叫进程,而我们现在所用的系统,都属于多任务操作系统,即同一时刻可以运行多个任务。
  • 而单任务操作系统,同一时刻只能运行一个程序,比如以前的山寨机,单任务系统就是没有后台运行,要执行另一个程序,就需要先退出前一个程序
  • 每个任务在执行过程中,都需要消耗一定的硬件资源,计算机中的每个进程在运行的时候,都需要给他分配一定的系统资源进程是系统分配资源的基本单位

8.进程在系统中是如何管理的

操作系统的进程管理:

  1. 先描述,即使用类/结构体这样的方式,把实体属性给列出来,表进程信息的结构体,PCB(进程控制块,Process Control Block),PCB是操作系统中的通用概念,比如Windows上表进程的结构和Linux也都可以称为PCB。
  2. 再组织,即使用一定的数据结构,把这些结构体/对象串到一起。在Linux中,使用链表这样的数据结构来把若干个task_struct串起来。

PCB中的一些核心属性

  1. pid,进程的身份标识。此处通过一个简单的不重复的整数来进行区分的,系统会保证,同一个机器上,同一个时刻,每个进程pid都是唯一的。
  2. 内存指针,描述了进程使用,内存资源的详细情况。进程运行过程中,需要消耗一些系统资源的,其中内存就是一种重要的资源。而整个系统中,内存这么多,并不是可以随意使用的,只有先从系统这里申请,系统给你分配一块才能使用。每个内存,都必须使用自己申请到的内存
  3. 列如双击一个exe,就会运行进程,这个过程中,就是系统先把exe这个文件的内容(包含了指令和数据,先加载到内存中)然后再创建进程,让进程开始执行。
  4. 文件描述符表:描述了这个进程所涉及的硬盘相关的资源。存储器 = 内存+外存(硬盘、软盘、光盘、U盘。。),操作系统,不管什么盘都是按照”文件“的方式来进行操作的。一个进程想要操作文件,需要先打开文件,即让进程在文件描述符表中分配一个表项(构造一个结构体)表示这个文件的相关信息

注意:进程,是系统分配资源的基本单位
一个进程,消耗CPU资源:就好比CPU是个大舞台,进程要执行的指令,就是演员;一个CPU可能有一个核心,也可能有多个核心,每个核心都是舞台,演员进行表演登上舞台才能表演,同一时刻,一个舞台,只能有一个演员,让多个演员轮流登台,即引出分时复用。即某电脑的CPU有16个逻辑核心,系统上的进程不止16个,其他进程分不到CPU资源,通过分时复用(并发)

  • 分时复用当CPU核心只有一个,先执行进程1的代码,执行一会后,让进程1下来,执行进程2的代码,以此类推
  • 并发:多核CPU下,四个不同的进程在各自舞台上执行,同时执行,称为并行执行。每个核心仍要分时复发。当代的计算机执行过程中,往往是并行+并发同时存在。而两个进程是并发执行还是并行执行要看系统的调度。

9. CPU分配 – 进程调度

PCB中就需要提供一些属性来支持系统完成对这些进程的调度。

  • 状态:描述进程的是否能够去CPU上执行 。有时候某个进程不方便,比如通过Scanner等待用户输入内容。
    1.就绪状态:随时准备好去CPU上执行。2,阻塞状态:这个进程不方便去CPU上执行,调度不了该进程(如进程等待IO,来自控制台等设备的输入输出),。
  • 优先级多个进程等待系统调度,调度的先后不一样。如电脑运行了游戏和qq,此时游戏的优先级大于qq。
  • 记账信息针对每个进程,占据了多少CPU的时间,进行一个统计,会根据这个统计结果来进一步的调整调度的策略。因此需要在下一轮的调度下进行调整,确保每个进程都不至于出现完全捞不着CPU的情况。
  • 上下文支撑进程调度的重要属性,相当于游戏里面的存档和读档。每个进程在运行过程中,就会有很多的中间结果,在CPU的寄存器中。1.存档因此,就需要在进程调度出CPU之前,把当前寄存器中的这些信息,给单独保存到一个地方。2.存档在该进程下次去CPU执行的时候,再把这些寄存器里的信息给恢复回来
  • 所谓的保存上下文就是:把CPU的关键寄存器中的数据,保存到内存中(PCB的上下文属性中)
  • 恢复上下文把内存中的关键寄存器中的数据,加载到CPU的对应寄存器

10.内存分配 – 内存管理

每个进程的内存,是彼此独立的,互不干扰的

  • 通常情况下,进程A不能直接访问进程B的内存;为了系统的稳定性,如果某个进程代码出bug出错的,只是影响到自己这个进程,不会影响到其他进程,这种情况也称为进程的独立性。而如果系统上的一个进程崩溃,会影响了其他进程,那将非常恐怖。

11.进程间通信

虽然有进程的独立性,但是有时候也需要,多个进程相互配合,完成某个工作

  • 进程间通信和进程的‘独立性’ 并不冲突,系统提供一些 公共的空间(多个进程可以访问到的),让两个进程借助这个公共空间来交互数据
  • 进程通信的方式
  1. 管道
  2. 共享内存
  3. 文件
  4. 网络
  5. 信号量
  6. 信号
    其中,在Java中主要使用的进程通信方式:文件和网络。网络,是可以支持同一个主机的不同进程,也能支持不同主机的不同进程适用性更高

相关文章:

【JavaEE初阶 -- 计算机核心工作机制】

这里写目录标题 1.冯诺依曼体系2.CPU是怎么构成的3.指令表4.CPU执行代码的方式5.CPU小结:6.编程语言和操作系统7. 进程/任务(Process/Task)8.进程在系统中是如何管理的9. CPU分配 -- 进程调度10.内存分配 -- 内存管理11.进程间通信 1.冯诺依曼…...

springcloud:3.6测试信号量隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用:http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…...

AI化未来:智能科技的新纪元

AI化未来:智能科技的新纪元 我们正处在一个前所未有的科技革新时期,人工智能(AI)的发展正日益渗透到我们生活的方方面面,预示着AI化未来的到来。这是一场前所未有的科技革命,其深度和广度超越了历史上的任…...

Unity 整体界面淡入淡出效果

在Unity中,如果我们要实现控制多个组件同时淡出,同时淡入的效果,可以使用DOTween插件实现。 如图,一个页面中带有背景,一张图片,一个文本,一个滑动条。 要实现以上界面的整体淡入淡出&#xff…...

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…...

JavaScript中的包装类型详解

JavaScript中的包装类型详解 在 JavaScript 中&#xff0c;我们有基本类型和对象类型两种数据类型。基本类型包括 String&#xff0c;Number&#xff0c;Boolean&#xff0c;null&#xff0c;undefined 和 Symbol。然而&#xff0c;当我们需要在这些基本类型上调用方法时&…...

如何向各大媒体网站投稿 海外媒体发稿平台有哪些

在数字化时代&#xff0c;各大媒体网站是企业推广和个人展示的重要平台。通过在媒体网站上发布文章&#xff0c;可以有效地扩大影响力和提升知名度。但是&#xff0c;如何投稿到各大媒体网站呢&#xff1f;以下是一些常用的方法和步骤。 1. 研究目标媒体 在投稿之前&#xff0…...

基于SpringBoot的论坛系统(附项目源码+论文)

摘要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#xf…...

堆以及堆的实现

文章目录 堆的概念堆的实现HeapPushHeapPop HeapTop HeapSize HeapEmpty堆的应用 堆的概念 堆是一颗完全二叉树每个结点的值都小于子结点的值&#xff0c;这颗二叉树为小根堆每个结点的值都大于子结点的值&#xff0c;这颗二叉树为大根堆堆的定义如下&#xff1a;n个元素的序列…...

使用RabbitMQ实现延时消息自动取消的简单案例

一、流程图 二、导包 <!--消息队列 AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 三、配置文件 #消息队列 …...

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端&#xff0c;现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的&#xff0c; ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…...

电脑中已经有多个模组压缩文件,如何通过小火星露谷管理器批量安装

如果已经下载了很多的星露谷模组压缩文件&#xff08;zip包&#xff09;&#xff0c;可以通过【添加模组】功能&#xff0c;将模组批量解压到Mods文件夹中。 名词解释 为了避免这篇文章的内容看不懂&#xff0c;先解释两个名词。 直装型模组&#xff1a;直接解压到Mods就能生…...

[Linux]如何理解kernel、shell、bash

文章目录 概念总览kernelshell&bash 概念总览 内核(kernel) &#xff0c;外壳(shell) &#xff0c;bash kernel kernel是指操作系统中的核心部分&#xff0c;用户一般是不能直接使用kernel的。它主要负责管理硬件资源和提供系统服务&#xff0c;如内存管理、进程管理、文件…...

C++:Vector的使用

一、vector的介绍 vector的文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以…...

Redis之事务(详细解析)

请直接看原文:不能回滚的Redis事务还能用吗 - 知乎 (zhihu.com) ------------------------------------------------------------------------------------------------------------------------------ 1、Redis事务的概念&#xff1a; Redis 事务的本质是一组命令的集合。…...

Java项目:39 springboot007大学生租房平台的设计与实现

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统有管理员、房东和用户 【主要功能】 1、后台&#xff1a;房源管理、信息审批管理、订单信息管理、房东管理、用户管理 2、前台&#xff1…...

安卓内存信息查看

目录 前言一、Android查看内存相关信息的方法1.1 通过 adb shell 获取内存信息1.2 通过编程方式获取内存信息1.3 adb shell 获取应用程序内存使用情况1.4 free指令 二、总结 前言 一、Android查看内存相关信息的方法 1.1 通过 adb shell 获取内存信息 C:\Users\henry.xue>…...

Positional Encoding 位置编码

Positional Encoding 位置编码 flyfish Transformer模型没有使用循环神经网络&#xff0c;无法从序列中学习到位置信息&#xff0c;并且它是并行结构&#xff0c;不是按位置来处理序列的&#xff0c;所以为输入序列加入了位置编码&#xff0c;将每个词的位置加入到了词向量中…...

MySql、Navicat 软件安装 + Navicat简单操作(建数据库,表)

一、MySql、Navicat 软件安装 及正常使用 MySql下载&#xff0b;安装&#xff1a; 检查安装情况&#xff1a; 配置环境变量&#xff1a; 搞定了&#xff01;&#xff01;&#xff01; 可以登陆试哈哈哈 连接navicat 开始创建数据库 二、 商品种类表 - commoditytype int …...

逆向案例五、爬取b站评论,表单MD5加密

1.便捷写爬虫网站&#xff1a; Convert curl commands to code 使用流程&#xff1a;又点击想要抓的包&#xff0c;复制URL&#xff08;base&#xff09;格式复制 在上面链接中粘贴即可 2.找到含有评论的包&#xff08;即main?oid)&#xff1a;观察表单发现两处参数在变化&…...

010-原型链

原型链 1、概念2、原理3、new 操作符原理4、应用 1、概念 原型链&#xff1a;javascript的继承机制&#xff0c;是指获取JavaScript对象的属性会顺着其_proto_的指向寻找&#xff0c;直至找到Object.prototype上。 2、原理 &#x1f4a1; Tips&#xff1a;构造函数 Fn&#…...

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…...

Red Hat系统升级内核版本

查看当前内核版本 uneme -r yum list kernel升级内核 yum update -y kernel检查升级后的内核版本 uneme -r yum list kernel升级系统中已安装的软件包到最新版本&#xff08;过程时间较长&#xff09; 目前只升级了系统内核&#xff0c;系统相关的安装包还是老的&#xff0…...

Java集合set之HashSet、LinkedHashSet、TreeSet的区别?

Java的集合中主要由List&#xff0c;Set&#xff0c;Queue&#xff0c;Map构成&#xff0c;Set特点&#xff1a;存取无序&#xff0c;不可以存放重复的元素&#xff0c;不可以用下标对元素进行操作。 HashSet 作为Set容器的代表子类&#xff0c;HashSet经常被用到&#xff0c…...

全方位碾压chatGPT4的全球最强模型Claude 3发布!速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...

upload-Labs靶场“11-15”关通关教程

君衍. 一、第十一关 %00截断GET上传1、源码分析2、%00截断GET上传 二、第十二关 %00截断POST上传1、源码分析2、%00截断POST上传 三、第十三关 文件头检测绕过1、源码分析2、文件头检测绕过 四、第十四关 图片检测绕过上传1、源码分析2、图片马绕过上传 五、第十五关 图片检测绕…...

linux-rpm命令

rpm命令管理程序包&#xff1a;安装、升级、卸载、查询和校验 1、忽略依赖关系安装/卸载包 安装&#xff1a;rpm -Uvh 软件包名 --nodeps 卸载&#xff1a;rpm -e 软件包名 --nodes&#xff01;&#xff01;&#xff01;&#xff01;慎用&#xff01;&#xff01;&#xff01…...

如何利用python实现自己的modbus-tcp库

如果你想使用纯Socket编程来实现Modbus TCP通讯,而不是依赖于Modbus库,你需要理解Modbus TCP协议的细节,并能够手动构建和解析Modbus消息。以下是一个简单的示例,展示了如何使用Python的socket库来实现Modbus TCP通讯: 了解Modbus TCP协议: Modbus TCP协议使用TCP作为底层…...

linux系统-----------搭建LNMP 架构

PHP(Hypertext Preprocessor 超文本预处理器)是通用服务器端脚本编程语言&#xff0c;主要用于web开发实现动态web页面&#xff0c;也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时&#xff0c;php还提供了一个命令行接口&#xff0c;因此&#xff0c;其也可…...

C++中boost库的安装及使用(Windows)

Boost库的安装及使用 引言使用现有的boost库安装及使用引言 C++开发中经常会用到boost库,本文记录一下Windows上boost在visual studio2019上的使用。 Boost库是一个跨平台的C++库集合,旨在为C++开发者提供一系列高质量的通用功能。不同的Visual Studio(VS)版本并不要求安…...