计算机是如何工作的


😊😊😊本篇主要介绍一些计算机的核心工作机制后,打破计算机的神秘感,并且有利于理解我们平时编程时的一些行为、动作。

一台计算机是如何组成的

现代的计算机, 大多遵守 冯诺依曼体系结构

冯诺依曼体系结构

CPU 中央处理器

1.CPU 中央处理器: 进行算术运算逻辑判断.
(cpu最重要的指标是主频和核心数)
主频:通俗来说就会说一秒钟cpu可以执行多少条指令。现在cpu的主频是根据当前的人物的负载程度动态变化的(指令cpu上可以执行的最小任务单元)
核心数:
物理核心:cpu焊上去的核心
逻辑核心:现在cpu有一个“超线程技术”,可以让一个核心顶两个
最开始cpu都是单个核心的。
核心可以理解为一个能完成完整计算功能的整体,有很多计算单元构成

存储器

2.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
内存:速度快,空间小,成本高,掉电数据丢失
外存:速度慢,空间大,成本低,掉电数据不丢失
(近些年也研发出来新的存储介质,同时具备内存和外存的特性)

输入设备和输出设备

3.输入设备: 用户给计算机发号施令的设备.

4.输出设备: 计算机向用户汇报结果的设备.

针对存储空间 硬盘 > 内存 >> CPU 针对数据访问速度 CPU >> 内存 > 硬盘

指令

指令就是cpu上可以执行的最小任务单元。 所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。
其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄 存器编号等。
指令本身也是一个数字,用二进制形式保存在内存的某个区域中。 一个CPU设计的时候,就会提供一些可以进行的操作(支持哪些指令)
比如加法指令,读取指令,写入内存指令,条件判断/跳转指令,堆栈操作指令…

操作系统

有Windows, macOS 和开源的 Linux 、 华为鸿蒙系统等等 这些操作系统本质都是搞管理的软件

1.对下管理所有的硬件设备

操作系统毕竟是一个软件,不可能认识市面上所有的硬件设备
所有硬件厂商在生产硬件的时候同时要开发一个驱动程序,专属与这个硬件设备,让操作系统通过这个驱动程序完成对硬件设备的控制

2.对上要给软件提供稳定的运行环境

进程的隔离性,一个计算机上可以同时运行多个程序,这些程序各自独立,互不干扰,如果一个程序出现bug,不会影响其他程序。

一个操作系统=内核+配套的应用程序
内核是操作系统最核心的功能,硬件的驱动程序都是在操作系统内核中执行的

进程process

一个已经跑起来的程序就叫进程 每个进程执行都需要消耗一定的系统资源 每个进程都是资源分配的基本单位

那么进程在系统中如何管理呢?

从两个角度来说

描述

使用类/结构体,把一个被管理的对象的各个属性都表示出来 系统中有一个专门的结构体(操作系统内核使用C/C++写的)描述进程的属性
这个结构体统称为 进程控制块****PCB(pcb在linux中叫task_struct)

1.pid

进程的身份标,识每个进程都会有一个pid, 同一时刻,不同进程的pid不同

2.内存指针

描述进程持有的 内存资源 是啥样的
每个进程运行的时候,都会分配一定的内存空间,具体在哪里,以及分配的内存空间中有哪些部分,每个部分都是干啥的,有这么一组指针来进行区分
例如:最典型的是,进程的内存空间需要有专门的区域存储执行的指令,以及指令依赖的数据,同时要存放一些运行时产生的临时数据(C语言的程序中,写的一些exe代码,双击exe文件,系统就会读取执行文件的内容加载到内存中,cpu才能从内存中读取指令进一步执行指令,程序运行过程产生的一些临时数据也要有专门的空间存贮)

进程持有的cpu资源如何体现呢??

3.文件描述符表

描述进程持有的 硬盘资源 是啥样的 类似与顺序表的结构,有恒多元素,和硬盘资源有关
一个进程也需要涉及到硬盘操作,就需要按照文件的方式来操作。 当前这个进程关联了哪些文件,都是通过文件描述符表表示

引入:
那么进程持有的cpu资源如何体现
主要通过 进程的状态,进程的优先级,进程的上下文,进程的记账信息来体现
下面为了更通俗的理解这些状态引入一个小例子
假如我有三个好朋友都很喜欢我 A很有钱 B很聪明 C对我很好
我如果想同时和这三个人保持好的关系,就需要合理规划时间

4. 进程的状态

就绪状态:进程时刻准备好去CPU执行 就绪状态的两种情况: 进程正在CPU上执行 进程虽然没在CPU上执行,但是时刻准备着去CPU上执行

默认情况下这三个人,呼之即来,挥之即去的状态就是就绪状态

阻塞状态:某个进程,由于某种执行条件不具备,就导致这个进程暂时无法参与cpu的调度(比如进程等待用户输入)

有一天A要出差一个月,显然这段时间A没办法来和我玩A就处于阻塞状态
进程的状态还有很多,暂时不做进一步讨论

5. 进程的优先级

操作系统在调度进程的时候并非一视同仁,有些进程优先级高的进程会优先调度

我在排时间的时候分配给ABC的时间并不相等
A我最喜欢,分时间最多,B其次,C最少

6.上下文

进程从CPU离开之前,需要保持现场,把当前寄存器的状态,都记录到内存中
等到下次回到CPU上执行时,就把保存在内存的这些寄存器的值,恢复回去,进程就会沿着上次执行的位置继续执行

有一天我和A约会,A说,下个月我们去三亚度假吧。我说好啊好啊~~
第二天,和B约会,B说下个月,他妈妈过生日,不知道买啥礼物,想让我帮他挑挑。我说好啊好啊~
针对A,我要准备的是去度假需要的东西
针对B,我要准备一个生日礼物
为了避免下次见面记混,我要准备一个小本本,把每次具体和那些人约会,有哪些事情没搞完需要下次继续搞,记录下来,在下次见面前温习一下

7.记账信息

通过优先级机制,对不同的进程分配不同权重的资源
有时候会出现极端情况,所有的资源都给某一个进程,其他进程一点没捞着
比如我一周四天给A,三天给B,如果我一直不搭理C,C对我的热情也会降低,可能就不和我玩了
因此,我就需要统计一段时间给ABC分配的总天数,如果发现C特别少,就需要适当补偿

记账信息,会记录当前进程持有的CPU情况(在CPU上执行了多久)就可以作为操作系统调度进程的参考依据

组织

系统使用数据结构(类似双向链表的结构),把这些表现出来的对象,组织起来,为了后续的增删查改。

虚拟地址空间

早期的操作系统,程序分配的内存空间就是 物理内存
在这里插入图片描述

比如我自己写了一个代码,这个代码写出来bug,内存越界访问,B进程越界访问A的进程,就把A的内存写坏了,导致A的进程出现问题

操作系统要给进程提供稳定的运行环境,于是操作系统就引入了 虚拟地址空间

操作系统引入虚拟地址空间 的概念,不是直接分配物理内存了,而是分配虚拟的内存空间,操作系统对于内存有进行了一层抽象

在这里插入图片描述

进程A和B看到的内存是抽象之后的虚拟内存
A操作某个内存地址告诉系统,系统再把这个虚拟地址翻译位物理地址(有一个类似hash表这样的结构,称为页表)在操作物理地址

操作系统要进行校验和检查,就需要看当前这个虚拟地址是否能顺利完成翻译,如果给定的虚拟地址是非法的,是一个越界访问的地址,系统就可以及时发现,并对当前进程进行处理,就不会波及到其他进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值