[Java EE] 计算机工作原理与操作系统简明概要

news/2024/5/17 20:29:16

1. 计算机工作原理

1.1 生活中常见的计算机

计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"),都是计算机.

服务器
智能手表

1.2 冯诺依曼体系

现代的大多数计算机都遵守冯诺依曼体系结构.
在这里插入图片描述
简述上述过程就是:输入设备为存储器(内存和外存)输入数据,存储器向CPU发号施令,提醒CPU处理数据,CPU则会把存储设备中的数据读取过来,进行一系列处理,再放入存储设备中.之后通过存储设备输出到输出设备中.
下面我们介绍各个部件的主要功能:

  • CPU中央处理器: 主要进行二进制算数运算和逻辑判断.
  • 存储器: 分为内存和外存,用于存储数据(使用二进制方式存储)
  • 输入设备: 给计算机发号施令的设备.
  • 输出设备: 计算机向用户汇报结果的设备.
    针对存储空间:
    硬盘>内存>>CPU
    针对数据访问速度:
    CPU>>内存>硬盘

1.3 CPU指标与核心

我们可以把CPU看做一个打工人:

  1. CPU的两个指标:
    • CPU占用率:
      描述CPU干活时间栈总时间的比例.我们可以通过任务管理器来看到它.比如CPU上班上8个小时,干4个小时的活,CPU占用率为50%.

在这里插入图片描述

  • CPU频率:
    1秒钟,CPU处理或者执行了多少个指令.

在这里插入图片描述
2. 多核CPU
我们如今在市面上见到的计算机大多数都不是单核CPU,一个CPU中存在多个核心.
我们经常说的CPU几核,这指的是物理核心,CPU多少线程,指的是逻辑核心.下面我们以intel5-13500HX芯片来举例:
在这里插入图片描述
引入多核CPU的目的:
引入多核CPU的核心,本质上就相当于==“干活的人多了”==,只不过把这些人集中在了一个房间中,这就可以让任务的完成更高效.我们以后编程的核心就是:如何把多个任务拆分成多个部分交给不同的核心来完成."多线程"编程就是针对任务分配来考虑的软件编程,避免一核有难,多核围观的尴尬.这便是我们以后要研究的重点.
3. CPU的不同架构类型

  • x86架构类型(如Intel,AMD生产的芯片大多数是x86CPU)
  • arm架构类型(如Apple A17仿生芯片,骁龙888等用于移动设备的芯片大多数都是armCPU)
  • x86的优点就是性能较高,但功耗较高,而arm恰恰相反.

1.4 指令

所谓指令,即指导CPU进行工作的命令,主要有操作码+被操作数组成。
其中操作码⽤来表⽰要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等.
冯诺依曼体系结构规定:
一个程序,指令和数据要在储存器中保存,CPU如果需要执行,都需要自动从存储器中去取指令和数据.即指令要先加载到内存中,才可以被CPU读取并执行.
eg:一个Java程序 -->.java -->编译 --> .class字节码文件 -->jvm -->到达内存 --> 翻译 -->CPU识别.

计算机中CPU的指令识别也有一定的规则,所以我们引入了指令表:
在这里插入图片描述
每个CPU被设计出来之后,都会提供这样一个指令表.这个指令表中的opcode对应的是内存数据中的操作码.就是告诉CPU要怎么做的二进制指令.操作的地址或寄存器就是告诉CPU从哪里取出被操作数(数据)并存储到哪里.

1.5 CPU的基本工作流程(重点)

  1. 读指令
    把内存中的指令数据读取到CPU的寄存器中
  2. 解析指令
    CPU通过指令表来解析当前指令要求它干啥
  3. 执行指令

注:寄存器是CPU用来保存数据的地方,一般有A,B,PC,IR四个,其中IR用来读取内存中的指令,PC用来读取内存中的地址.IR可通过PC提供的内存地址来从内存中取出指令来解析.,AB寄存器都是用来存储数据的.
下面来用图来形象地表示上述过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
总结:

  • CPU中的PC寄存器,是决定要执行那条指令的关键
  • 指令是有动作+操作对象组成的.
  • CPU眼中只有指令,没有其他概念.

2. 操作系统

操作系统是⼀组做计算机资源管理的软件的统称。⽬前常⻅的操作系统有:Windows系列、Unix系
列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。它们可以让计算机按照一定的规则进行执行,并管理好这个计算机上所有的硬件与软件资源,这是操作系统诞生的初心.
操作系统: 这个家没我都得散.

2.1 操作系统的定位

在这里插入图片描述
注:上述操作系统,可以看做操作系统内核.

那么操作系统是如何完成一个功能的呢?操作系统内核为应用程序提供了API,应用程序通过调用操作系统内核的API,来告诉操作系统内核这个进程并创建,之后操作系统内核通过与中央处理器的驱动程序,来在处理器中完成调用指令与数据.

这么说来有些抽象,我们通过银行柜台取钱的例子来解释:

  1. 应用程序相当于一个来取钱的人
  2. API相当于存折
  3. 取钱的人(应用程序)把存折(API)递给银行柜台的员工(操作系统),之后柜台员工(操作系统)从保险柜(处理器)中把钱取出来递给取钱的人(应用程序).

2.2 进程与任务

注意:下面谈到的进程都是只包含一个线程的进程
进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运⾏过程;同时,在操作系统内部,进程⼜是操作系统进⾏资源分配的基本单位
系统资源分配情况可通过系统资源管理器来查看:
在这里插入图片描述
但是上述的操作系统中的进程又非常多,我们就要考虑如何管理的问题了.

  1. 操作系统通过进程控制块抽象(PCB Process Control Block)来描述一个进程,PCB其实就是java中的一个类,操作系统底层的一个结构体成员.
  2. 操作系统通过一定的数据结构来把这些PCB有序地组织起来,如线性表(一般是链表),搜索树.方便增删查改.

那么这个结构体变量中有包含哪些信息呢:

  1. pid: 进程的id标识符.

  2. 内存指针: 这是一组指针组,告诉OS,该进程的指令位于内存中的地址以及进程依赖数据的地址.

  3. 文件描述符表: 一个进程在运行的时候要操作的文件,PCB会通过顺序表的数据结构来记录当前进程都打开了哪些文件.

  4. 支持进程调度的属性:
    要想解释明白这个属性,我们要先解释什么是进程调度:

    假设有100个进程,CPU虽然有多个核心,假设为16个,只能同时处理16个进程,这16个进程是完全同时执行,我们把他称为并行,但是如果想要执行100个,显然全部并行是远远不够的,这是CPU就会把总执行时间切为若干个小段,在这一小段的时间中,对进程频繁切换,我们称为并发执行.只不过时间非常短,人类感觉不到切换.
    所以,进程的调度从微观上来讲分为两种:1. 并行: 在时间上完全同时执行. 2. 并发: 在时间上串行,但是在宏观上也是同时执行.
    所以上述调度从宏观上来谈,统称并发.

    之后我们再来谈PCB中的第四个属性:

    1. 状态: 进程分为两种状态:就绪状态和阻塞状态.就绪状态就是随叫随到,阻塞状态的进程指令与数据暂时无法再CPU上执行.
    2. 优先级: 那个进程优先级高,就优先调用哪个进程.
    3. 上下文: 进程在CPU执行中,会产生许多的中间结果,进程在切换出CPU前,就需要把中间结果保存到PCB的上下文中,我们称为存档,下次进程回到CPU上时,就要把之前的存档回复回来,我们称为读档.
    4. 记账信息: OS要避免某个进程一直吃不到资源,所以就要进行统计,给分配的比较少的进程多分配一点.

    举例:渣女小故事
    一个女生同时被3个男生追:
    A男生:有钱多金
    B男生:颜值高,长得帅
    C男生: 开心果,会给女生提供情绪价值( 舔狗 )
    A男生比较有钱多金,所以经常出差,在平时,他可以随叫随到,是就绪状态,但是在他出差的时候,就不会随叫随到,进入阻塞状态
    C男生可以提供精神食粮,其实就是会舔,女生认为精神上的安慰更实在,所以C的优先级会更高,C分配的时间就会相对较多
    有一天,A男生的妈妈过生日,C男生打算去海边玩,然后女生就打算对男生A说,我买了一条红围巾,打算对C说,我买了一身性感的泳衣,由于小姐姐泡的男人太多了,看错A和C男生法的信息了,一不小心把A和C给整叉了,这就尴尬了.(C:你去海滩戴围巾??? , A:你给我妈妈买了一身性感的泳衣???)可见上下文的重要性.
    哎呀~~,把咱们的B小朋友给掉了,给咱们B小朋友多分配一点时间吧,所以记账信息也会起到一定的作用.
    在这里插入图片描述


http://www.mrgr.cn/p/05683427

相关文章

如何在MobaXterm上使用rz命令

1、首先输入命令和想下载的文件,如下图: 2、按住ctrl鼠标右键,选择如下选项: 上传命令是rz,选择Receive...... 下载命令是sz,选择Send...... 3、我这里是要把Linux上的文件下载到我的本地window磁盘&…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本,在我们自己的环境中跑了下,第一次跑的结果如下: 运行完上面跑出的split脚本后,还是存在jumbo块,第二次跑出的结果: 从上面结果可以…

顺序表 (头删 尾删 清空)

//头删 | 1 #include "head.h" | 1 #ifndef ww87 void head_del(p lp) | 2 int main(int argc, const char *argv[]) …

C#自增运算符详解:++i与i++的区别及应用场景

概述:在C#中,++i和i++都是自增运算符,其中++i先增加值再返回,而i++先返回值再增加。应用场景根据需求选择,前缀适合先增后用,后缀适合先用后增。详细示例提供清晰的代码演示这两者的操作时机和实际应用。 在C#中,++i 和 i++ 都是自增运算符,但它们在操作上有细微的差异…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮,没有一个属于自己的组件库,那岂不是狮子没有了牙齿,士兵没有了武器,姑娘没有了大宝SOD蜜,你没有了我.... 言归正传,下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录 1. 前文回顾 1.1 简单背后的复杂 1.2 复杂性的来源 2. 关键代码 2.1 功能概述 2.2 关系梳理 2.3 理解构造函数二 2.4 理解HLS_CONSTEXPR 2.5 理解const volatile 3. 探究ap_int<8> c&#xff1b;经历了什么 4. 在调试中查看 1. 前文回顾 在《Vitis HLS…

项目7-音乐播放器1+BCrypt加密

1.创建项目 1.1 引入依赖 1.2 yml相关配置 application.yml spring:profiles:active: prod mybatis:mapper-locations: classpath:mapper/**Mapper.xmlconfiguration:map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdO…

牛客Linux高并发服务器开发学习第一天

Linux开发环境搭建 安装Xshell 7远程连接虚拟机的Ubuntu 安装Xftp 7可以传输文件(暂时还没使用) 安装VMware Tools可以直接从Windows系统向虚拟机Linux系统拖拽文件实现文件交互。 安装CScode可以远程连接Linux系统进行代码的编写。&#xff08;Windows系统与Linxu系统公钥…

【蓝桥杯】2024年第15届真题题目

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进 行一次握手&#xff08;且仅有一次&a…

iOS开发如何更改xcode中的Apple ID

在Xcode中更改Apple ID是一项常见的任务&#xff0c;尤其是当你需要切换到另一个开发者账号或者团队时。下面是一个简单的步骤指南&#xff0c;帮助你更改Xcode中的Apple ID&#xff1a; 步骤一&#xff1a;退出当前的Apple ID 1.打开Xcode应用程序。 2.在菜单栏中&#xff0c;…

云正在使 IT 受益,但对业务却没有好处

云具有巨大的商业价值&#xff01;这是云提供商及其盟友在每次云计算会议上高喊的战斗口号。 您永远不会听到我说“云”始终是正确的解决方案&#xff0c;或者就此而言&#xff0c;是错误的解决方案。 在作为云专家 20 多年的时间里&#xff0c;从来没有盲目追随云计算先驱或…

Python学习从0开始——项目一day01爬虫(二)

Python学习从0开始——项目一day01爬虫&#xff08;二&#xff09; 一、解析response数据二、json转换三、文件保存四、存储json对象五、完整代码 上一篇 一、解析response数据 在已经知道我们获取图片的最终URL存在于请求响应response中&#xff0c;下一步的重点就放在解析re…

[lesson35]函数对象分析

函数对象分析 客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 存在的问题 函数一旦开始调用就无法重来 静态局部变量处于函数内部&#xff0c;外界无法改变函数为全局函数&#xff0c;是唯一的&#xff0c;无法多次独…

【YOLOv9】使用yolov9训练自己的数据集/验证 /推理 /参数分析

完胜V8的SOTA模型Yolov9(论文阅读笔记)内容 点击即可跳转 当今的YOLO系列武林盟主YOLOV9&#xff1a; YOLOv9的优秀表现&#xff1a; 环境&#xff1a; ubuntu20.04&#xff0c;无GPU&#xff0c;使用anaconda3创建的虚拟环境yolov9。 环境安装&#xff1a; conda create -n …

FlinkSQL 实时同步 MySQL

本文主要介绍了使用 FlinkSQL 实现 MySQL 数据的实时同步。准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 fli…

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑 多线程的问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&#xff0c;因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…

FlinkSQL 实时数据同步

准备工作MySQL 数据库(version: 5.7.25),注意,MySQL 数据库版本必须大于 5.6,否则不支持。开启 MySQL 的 log-bin: [mysqld] # Binary Logging. log-bin=mysql-bin server-id=1Flink (version : 1.15.4)添加 flink-connector-jdbc-1.15.4.jar 和 flink-sql-connector-mys…

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后&#xff0c;在解决方案管理器中有五个项目&#xff0c;分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目&#xff0c;除PlantsVsZombies外&#xff0c;其他四个…

FFmpeg: 自实现ijkplayer播放器--06封装打开和关闭stream

文章目录 流程图stream openstream close流程图 stream open 初始化SDL以允许⾳频输出;初始化帧Frame队列初始化包Packet队列初始化时钟Clock初始化音量创建解复用读取线程read_thread创建视频刷新线程video_refresh_threadint FFPlayer::stream_open(const char

3、Git之常用命令

3.1、速查表命令 作用git config --global user.name 用户名 设置用户签名(昵称)git config --global user.email 邮箱 设置用户签名(邮箱)git init 初始化本地库git status 查看本地库状态git add 文件名 添加到暂存区git commit -m "日志信息" 文件名 提交到本…