计算机工作原理(程序猿必备的计算机常识)

目录

  • 一、计算机工作原理
    • 1.冯诺依曼体系
    • 2. CPU执行指令的过程
  • 二、操作系统
  • 三、进程的概念
  • 四、进程的管理
  • 五、进程的调度

一、计算机工作原理

1.冯诺依曼体系

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

CPU: 中央处理器,进行算术运算和逻辑判断,一个计算机中最核心的部分

衡量CPU的重要指标(当然远远不止这两个啦):

  1. 核心数:可以简单理解为一个核就是一个人干活,多核就是多个人干活
  2. 频率:CPU的运算速度,可以简单理解为一秒钟执行的指令个数

这两个值越高说明CPU越好

存储器:

  • 内存(咱们平时说的内存、运行内存):存储空间小,访问速度快,成本高,掉电后数据丢失

  • 外存(硬盘,软盘,光盘,U盘):存储空间大,访问速度慢,成本低,掉电后数据保留

输入设备: 用户给计算机发号施令的设备,如鼠标、键盘等

输出设备: 计算机给用户汇报结果的设备,如显示屏等

存储空间大小:硬盘>内存>CPU

数据访问速度:CPU>>内存>硬盘

2. CPU执行指令的过程

指令相当于你告诉计算机做什么,指令表简化版本

指令功能opcode操作的地址或寄存器
LOAD_A从RAM(内存)的指定地址,将数据加载到寄存器A中0010RAM(内存)地址(4bit)
LOAD_B从RAM(内存)的指定地址,将数据加载到寄存器B中0001RAM(内存)地址(4bit)
STORE_A将数据从寄存器A中写入指定地址中0100RAM(内存)地址(4bit)
ADD计算两个寄存器数据的和,并将结果放在第二个寄存器中10002位寄存器ID、2位寄存器ID

指令一共有8个bit位,前4位opcode表示操作码,后4位表示操作数也就是要操作的地址或者寄存器。

关于CPU的寄存器:

我们的计算机存储数据主要是依靠内存和硬盘,而CPU在进行运算的时候,首先会把数据从内存中读取到CPU中的寄存器当中,寄存器就是CPU内部存储数据的部分,寄存器的存储空间比内存小,访问速度比内存快,成本高,断电后数据会丢失。

CPU执行指令的过程:

  1. 读取指令:CPU从内存中读取到指定内容,将指令保存到专门的寄存器中
  2. 解析指令:对照指令表,解析指令要执行的操作和对应的操作数
  3. 执行指令:执行指令对应的操作

运行可执行文件(exe)时,操作系统会把exe文件加载到内存中,而exe文件中会包含程序运行的指令和数据
CPU中存在着一个特殊的寄存器:程序计数器,计数器保存了接下来要从哪个内存开始执行指令(初始值在exe文件被加载到内存中就会自动设置好),计数器初始值为0,开始时从0号地址开始执行指令,每执行完一次指令,计数器默认+1,但是遇到跳转类语句(函数调用、if语句、while语句等),会被设为其他值
举个例子(简略版):有一个程序的内存信息如下

地址数据
000101110
100011111
210000100
301001101
400000000
500000000
600000000
700000000
800000000
900000000
1000000000
1100000000
1200000000
1300000000
1400000011
1500001110

步骤:
1)读取指令:程序计数器为0,读取0号内存地址的内容,

2)解析指令:操作码为0010,操作数为1110,对照指令表为LOAD_A,也就是将1110(10进制为14)这个地址的数据,读取到寄存器A当中

3)执行指令:把14地址的内存的数据读取出来,放到寄存器A中,如图:
在这里插入图片描述

执行完毕,程序计数器+1,程序计数器的值变为1,

继续执行地址为1的指令

1)读取指令:读取地址为1的指令

2)解析指令:操作码0001, 操作数1111(二进制为15),对照指令表为LOAD_B,也就是将地址为1111的内存中的数据加载到寄存器B中

3)执行指令:将地址为1111的内存中的数据加载到寄存器B中,如图
在这里插入图片描述

程序计数器+1,变成2

执行地址为2的指令:

1)读取指令:读取地址为2的指令

2)解析指令:操作码1000, 操作数0100(二进制为15),对照指令表为ADD,此时操作数分成两部分,表示两个寄存器00表示寄存器A,01表示寄存器B

3)执行指令:3+14=17,将17存入寄存器B中,如图
在这里插入图片描述

计数器+1->3

执行地址为3的指令:

1)读取指令:读取地址为3的指令

2)解析指令:操作码0100, 操作数1101(二进制为15),对照指令表为SOTRE_A

3)执行指令:将寄存器A的数据(00010001)写入到地址1101中

计数器+1->4

地址为4的数据为全0,程序结束

二、操作系统

操作系统 = 内核+配套的应用程序

常见的操作系统:Windows、Linux、MacOS、Android、IOS

内核的功能就是:

1、管理硬件设备:硬件厂商会提供相应的驱动程序,操作系统通过驱动程序间接操作硬件设备

2、给软件提供稳定的运行环境,现在的操作系统上一般会同时运行很多程序,操作系统会确保当某个程序出问题了,不会影响别的程序执行(例如,你在写代码正在听网易云音乐,当你的代码出bug了,你的网易云音乐不会停止)

操作系统会给应用程序提供API(接口),让应用程序调用,完成不同的功能

三、进程的概念

进程process(也叫任务task),就是正在执行的应用程序

应用程序有两种状态:

1、未运行:此时是一个躺在硬盘上的exe文件

2、运行中:exe文件会被加载到内存中,并且cpu执行了里面的指令

任务资源管理器中可以查看:
在这里插入图片描述

执行进程里的指令需要硬件资源,如下
在这里插入图片描述

进程是操作系统进行资源分配的基本单位。

四、进程的管理

简单版本理解:

两个方面:

1、描述:通过C语言的结构体或者C++、Java语言中的类,把一个进程的各种属性描述出来

2、组织:通过某些数据结构(比如链表),把上面的结构体一个一个串起来,并进一步的进行各种增删查改

创建一个进程,就相当于创建了一个结构体,并且插入到链表中;销毁(结束)进程也就是把该进程从链表上删除;查看进程,就是在遍历链表

结构体中包含的关键内容

  1. PID 进程的标识符:同一时刻,一台机器上一个PID就表示了一个进程,一台机器上PID不会重复,操作系统可以通过PID找到对应的进程
  2. 一组内存指针:通过这些指针,可以知道进程的指令和数据在哪里(操作系统运行一个可执行程序时,会把exe文件中的指令和数据加载到内存中,这些指针保存着这些地址)
  3. 文件描述符表(顺序表/数组):描述了进程打开了硬盘中的哪些文件
  4. 进程状态
  5. 进程优先级
  6. 进程上下文
  7. 进程的记账信息

以上4、5、6、7共同决定了进程的调度,我们单独下文介绍

五、进程的调度

计算机同时存在多个要执行的进程,CPU的每个核心可以执行一个进程(也就是执行里面的指令),但是一台机器CPU拥有的核心数量有限,但是却要执行几乎上百个进程,怎么办?

进程调度解决了以上问题:分时复用

某个时刻CPU运行进程1(其他进程先等着),运行一段时间后,CPU去运行进程2,过一会又运行进程3,以此类推,因为CPU运算速度快,上述切换的速度也快,我们看着就像是多个进程在同时执行,这也叫并发执行

多核心的CPU每个核心之间微观上也能同时执行不同的进程,叫并行执行

现在一般把并发和并行统称为并发,并发编程

下面这些属性,就是用于支持并发执行这个调度过程

  1. 进程状态,包括以下5个

    新建状态:当一个进程被创建,但是未分配内存资源,此时这个进程就处于新建状态;

    就绪状态:可以随时被调度到CPU上执行指令的;

    运行状态:CPU正在执行某个进程的指令,这个进程就处于运行状态;

    阻塞状态:无法被调度到CPU上进行执行(因为要进行其他操作,例如写代码时使用Scanner等待用户输入,如果不去输入,程序会一直卡在这);

    终止状态:表示该进程完成了它的执行,与此同时该进程占用的系统资源也被回收

  2. 进程优先级:进程调度时,有的进程先执行,有的进程后执行,这就是优先级

  3. 进程上下文:分时复用,一个进程执行一段时间,就要从CPU上调度走,过一段时间又回来,此时需要沿着上次执行的结果继续执行,这个进程离开时,之前执行的中间结果会被相应的寄存器保存起来,用于下次使用,寄存器中保存起来的就叫进程的上下文。可以理解为:打游戏的存档~~当你游戏玩累了,不想玩了,此时可以存档,等下次你再想玩的时候直接读档即可

  4. 进程的记账信息:在有优先级的前提下,不同的进程利用的系统资源是不一样的,操作系统会统计每个进程在CPU上执行的时间、内存使用情况等,根据这个记账信息,操作系统会进一步调整调度策略,做出优化,确保资源足够让每个进程正常执行

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

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

相关文章

《已解决》F12显示已在程序中暂停

首先打开F12-->源代码 最后一步:

Java web应用性能分析之【java进程问题分析工具】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 前面大概讲了java进程问题分析流程,这里再小结一下分析工具,后面也会小结一下java进程问题分析定位。 1.分析工具 1.1.linux命令工具 参考:Java web应用性能分析之【Linux服务器性…

项目中MySQL数据库设计(尚庭公寓)

数据库设计 1 数据库设计理论 1.1 数据库模型 数据库设计中最常采用的模型为实体(Entity)关系(Relationship)模型,简称ER模型。其核心思想是将现实世界中的复杂数据表示为一组实体,并描述这些实体之间的…

计算机视觉与模式识别实验1-3 图像滤波

文章目录 🧡🧡实验流程🧡🧡1. 对图像加入椒盐噪声,并用均值滤波进行过滤2.对图像加入高斯噪声,并用高斯滤波进行过滤3.对图像加入任意噪声,并用中值滤波进行过滤4.读入一张灰度图像,…

2.6 Docker部署多个前端项目

2.6 Docker部署多个项目 三. 部署前端项目 1.将前端项目打包到同一目录下(tcm-ui) 2. 部署nginx容器 docker run --namenginx -p 9090:9090 -p 9091:9091 -d nginx3. 复制nginx.conf文件到主机目录 docker cp nginx:/etc/nginx/nginx.conf /root/ja…

[学习笔记](b站视频)PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】(ing)

视频来源:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】 前面P1-P5属于环境安装,略过。 5-6.Pytorch加载数据初认识 数据文件: hymenoptera_data # read_data.py文件from torch.utils.data import Dataset …

数据结构与算法05-链表

介绍 基于结点的数据结构拥有独特的存取方式,因此在某些时候具有性能上的优势。 本章我们会探讨链表,它是最简单的一种基于结点的数据结构,而且也是后续内容的基础。 你会发现,虽然链表和数组看上去差不多,但在性能上…

Go 1.23新特性前瞻

2024年5月22日,Go 1.23版本[1]功能特性正式冻结,后续将只改bug,不增加新feature。 对Go团队来说,这意味着开始了Go 1.23rc1的冲刺,对我们普通Gopher而言,这意味着是时候对Go 1.23新增的功能做一些前瞻了&am…

SAP PP学习笔记15 - MTS(Make-to-Stock) 按库存生产(策略11,策略30)

上一章学习了MTS(Make-to-Stock)按库存生产(策略10)。 SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要-CSDN博客 本章继续讲MTS(Make-t…

革新风暴来袭:报事报修系统小程序如何重塑报事报修体验?

随着数字化、智能化的发展,已经应用在我们日常生活和工作的方方面面。那么,你还在为物业报修而头疼吗?想象一下,家里的水管突然爆裂,你急忙联系物业,时常面临物业电话忙音、接听后才进行登记繁琐的报修单、…

Vue.js 与 TypeScript(1) :项目配置、props标注类型、emits标注类型

像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误。这减少了生产环境中的运行时错误,也让我们在重构大型项目的时候更有信心。通过 IDE 中基于类型的自动补全,TypeScript 还改善了开发体验和效率。 一、项目配置 在使用 npm cr…

2024后端服务架构升级

文章目录 背景改造方案新架构图技术选型思考 服务拆分公共组件设计自部署算法服务排期计划 全球多活改造背景架构图分布式ID 背景 1、xx业务经过多轮的业务决策和调整,存在非常多技术包袱,带了不好的用户体验和极高的维护成本 2、多套机房部署&#xf…

简单、免费、强大的高效率截图工具神器——Snipaste(下载安装+常用快捷键教学)

一、简介 Snipaste是一款功能强大的截图和贴图工具,它允许用户快速截取屏幕上的任意区域,并将截图以浮窗形式显示在屏幕上。用户可以自由调整浮窗的位置和大小,甚至将浮窗设置为半透明,以便在查看屏幕内容时不会遮挡视线。此外&a…

[数据结构]字典树

概念: 字典树是一种数据结构,常用于统计,排序和保存大量的字符串(但不仅限于字符串)。主要思想是利用字符串的公共前缀来节约存储空间。 实现原理: 在开发的过程中如果需要使用字典树,不必自己…

图的创建和遍历

孤勇者探险(图的遍历) 作者 YJ 单位 西南石油大学 一款名为“孤勇者探险”的游戏,游戏中共有若干个小岛,每个岛上均有怪兽,闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分(每个岛的积分根据难度可能不相…

【recast-navigation-js】使用three.js辅助绘制Agent

目录 说在前面使用Tweakpane添加CrowAgent其他 说在前面 操作系统&#xff1a;windows 11浏览器&#xff1a;edge版本 124.0.2478.97recast-navigation-js版本&#xff1a;0.29.0golang版本&#xff1a;1.21.5 使用Tweakpane fps面板interface FPSGraph extends BladeApi<B…

JAVA流程控制--For循环

1.虽然所有循环都可以用while或do...while表示&#xff0c;但Java提供了另外一种语句——for循环&#xff0c;使一些循环结构变得简单 2.for循环语句是支持迭代的一种通用结构&#xff0c;是最有效&#xff0c;最灵活的循环&#xff0c;结构 3.for循环执行的次数是在…

单元测试的心法分享

大家好&#xff0c;我是G探险者&#xff01; 今天我们简单聊聊单元测试的哪些事儿~ 两天时间我玩明白了单元测试的套路。 这里我分享一下思路。 在我眼里单元测试室什么&#xff1f; 请看这张草图&#xff1a; 单元测试主要关注单个代码单元&#xff08;通常是类或方法&am…

Docker成功启动Rabbitmq却访问不了管理页面问题解决

目录 启动步骤&#xff1a; 无法访问问题总结&#xff1a; 启动步骤&#xff1a; 拉取镜像&#xff1a; docker pull rabbitmq 运行&#xff1a; docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq进入容器&#xff1a; docker exec -it 容器id /bin/…

python基础知识点总结(第二节判断与循环)

一、判断语句 1、if判断语句 ~if语句的基本格式 if 要判断的条件&#xff1a; 条件成立时&#xff0c;要做的事情 ~if语句的注意事项&#xff1a; 判断语句的结果一定要是布尔类型不要忘记判断条件后的&#xff1a;冒号归属于if语句的代码块&#xff0c;需要在前方填…