计算机是如何工作的

目录

计算机的组成: 

存储器:

CPU  中央处理单元

CPU主要厂商:

衡量CPU的好坏

指令:

操作系统

功能:

 操作系统 "内核"

进程/任务(重点)

进程在系统中是如何进行管理

PCB

进程的调度:

CPU寄存器:

虚拟地址空间

小结: 


计算机的组成: 

CPU, 存储器(内存 &  外存),  输入设备, 输出设备

存储器:

内存: 速度快, 空间小, 成本高, 掉电后数据丢失

外存: 速度慢, 空间大, 成本低, 掉电后数据不丢失

CPU  中央处理单元

人类当今科技巅峰之一, 但可以量产, 同时CPU更新很快, 所以很便宜

CPU主要厂商:

intel (针脚在主板上)  有代数, 13代i5, 12代i7之类的

i3表示入门级,  i5表示 普通版,  i7表示高端级,  i9表示旗舰版 数字越大越好

amd (针脚在CPU上)

CPU的更换代 遵循摩尔定律(不是高中化学的那个)

CPU这类芯片每隔18个月, 集成程度就能提高一倍, 计算效率接近提高一倍, 成本下降一半.

衡量CPU的好坏

1> 主频

2> 核心数

主频如图:

我的电脑上面的处理器, 2.60GHz 就是电脑的主频, 简单理解就是一秒CPU 可以执行16亿条(下限)指令. 现在CPU主频都是在时刻改变的(跟随当前任务的负载程度), 

核心数:

最开始CPU都是单核的(核心理解为一个能够完成计算机完整功能的整体, 是由很多计算单元构成的, 提高集成程度, 提升CPU的速度~~)

随着时代发展, 随着集成程度提高, 发现进一步提高越来越难了.

然后增加核心(一个不够, 多个来凑~~)

如图:

物理核心: 6个  (CPU焊上去的核心)

 逻辑核心: 12个 (现在CPU有一个"超线程技术", 让核心一个顶俩);

大小核技术: 大核一个顶俩, 小核一个顶一个 (平衡资源,减少发热, 提高性能)

CPU人类科技巅峰: 

造CPU最好的公司:

Intel, amd, 高通(做手机的CPU), 苹果(M2)

指令:

CPU上能够执行的任务的最小单元.

给CPU发布任务, 需要把任务拆分为非常细致的每一步后才能执行

例子:

让儿子下楼给我买包烟:

告诉cpu, 出门先往左方向走 ××× 步, 然后往右方向走 ××× 步, 然后直走 ××× 步, 然后按电梯1楼, 然后 左转 走××× 步, ........

一个CPU设计的时候, 会提供一些可以进行的操作(支持哪些指令?)

加法指令, 读取内存指令, 写入内存指令, 跳转指令, 函数调用指令, 堆栈操作指令....

这些都是由二进制的方式来表示的, 叫做机器语言 (不同架构的cpu的机器语言是不相同的)

不同的架构: 如  x86架构  x86_64(现在主要使用这种架构)   arm(手机上)

操作系统

日常中提到的  windows 10,   windows 11,   linux,   mac os,  android,  ios

这些操作系统 本质上都是用来搞管理的软件

功能:

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

如我们选择了一款鼠标, 然后我们插入直接使用, 这就需要硬件厂商开发一个驱动程序(软件),

让操作系统通过这个驱动程序完成对其的控制.

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

我们电脑上运行很多软件: 如QQ音乐, B站, 微信等, 一个电脑可以同时运行多个程序, 这些程序各自独立运行, 不会互相干扰. 如果某个程序出现bug, 会导致系统重启这种情况是很糟糕的.

 操作系统 "内核"

内核态, 用户态

一个程序在运行过程中, 可能在用户态工作, 也可能在内核态工作.

操作系统 = 内核(最核心的功能) + 配套的应用程序(如我们的文件管理之类的自带程序)

硬件的驱动程序, 都是在系统内核中执行的, 内核需要给很多的应用程序提供支持

Java中这些系统API都被jvm封装好了.

进程/任务(重点)

概念: 已经跑起来的程序.

例子: 比如电脑上启动QQ音乐在听歌, 这就叫进程, 但是没打开QQ,  exe程序静静的躺在那, 没启动这就不叫进程

 打开任务管理器可以看到电脑的进程

可以看到里面的信息, CPU, 内存, 磁盘, 网络等, 每个进程想要执行, 都需要消耗一定的系统资源(硬件资源).

每个进程都是系统资源分配的基本单位

进程在系统中是如何进行管理

两个角度:

1> 描述  使用类/结构体, 把被管理的一个对象, 各个属性都表示出来

2> 组织  使用数据结构, 把这些表示出来的对象, 串起来.

PCB

系统中专门有一个结构体(内核使用C/C++写的)描述进程的属性 统称为: "进程控制块" PCB

使用这个PCB描述进程的属性

一个进程可以使用一个或者多个PCB来表示.

系统中会使用类似于双向链表这样的数据结构组织多个PCB

上图看到的进程列表, 相当于遍历链表的每个节点

PCB里面的一些属性:

1> pid :

PCB中的进程的身份标识, 每个进程都会都一个pid, 同一时刻, 不同进程之间pid是不同的

2> 内存指针: (一组属性)

每个进程在运行的时候, 都会分配一定的内存空间, 这个进程, 内存空间具体在哪里, 以及分配的内存空间中有哪些部分, 每个部分都是干嘛的...需要有一组指针来区分

进程持有的内存资源

3> 文件描述符表 类似于顺序表, 有很多元素

和文件有关  =>  和硬盘有关

一个进程涉及到按文件的方式硬盘操作

当前进程关联到了那些文件, 能操作那些文件. 

进程持有的硬盘资源

进程的调度:

早期的操作系统,是一个单任务操作系统, 同一时刻只有一个进程能运行, 运行下一个进程, 就会退出上一个, 不需要考虑调度,现在不一样了.

一个进程要执行需要 CPU 来执行上面的指令

早期电脑单核 CPU , 同一时刻只能执行一个进程的指令,

如果: 把CPU比作舞台, 进程比作演员, 指令比作剧本, 剧本中有很多幕, 这种情况下如何实现多任务共同执行呢?

实现多任务共同执行: 这种情况叫做并发(分时复用) : 每个演员轮流上去, 每个演员执行一个剧本的一幕就下来让其他演员来表演, 只要演员轮换速度足够快, 就好像演员在同时表演一样. 

现代的 CPU 都是多核的, 有很多个舞台.

如果两个进程同时在两个CPU核心上, 微观上时"同时执行", 叫做并行, 一个 CPU 核心通过快速轮换调度的方式, 执行多个进程, 宏观上时"同时执行" , 微观上有先有后, 这种情况叫做"并发".

上述并发和并行, 是在系统内部完成调度, 我们不做区分

平时用"并发"来代指并行和并发

PCB中引入了一些属性, 用来支持操作系统实现 进程调度 的效果

1> 进程的状态

2> 进程的优先级

3> 进程的上下文

4> 进程的记账信息

举例:

我是妹子, 好看 & 有才华

我有三个追求者:

A有钱   (单纯最喜欢)

B帅      (提供精神需求)

C会舔  (提供情绪价值)

我都想要.但是要偷偷的(分时复用)

一周的时间表  123和A在一起, 45和B在一起 6和C在一起 , 周日休息

1> 进程的状态

这三个人随叫随到,  这种情况称为" 就绪状态 "

两种具体情况: 

1> 进程在 CPU 上执行

2> 没在CPU上执行, 但时刻准备着 (我周一没和B在一起, 但是叫B了, B立刻出现)

A出差了, 这段时间没法再一起, 成为:" 阻塞状态".

2> 进程的优先级

我最喜欢A, 分配时间最多, 其次是B, 最后是C

3>进程的上下文

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

就是存档和读档

一天 和A约会, A说下周去度假, 让我准备一下,

第二天, 和B约会, B说下个月妈妈过生日, 让我准备一个礼物

对A我准备一套性感泳衣

对B我准备一套首饰

之后A问我准备了什么,我说准备了一套首饰

B问我准备了什么, 我说准备了一套性感泳衣,

这样就穿帮了.

我需要在本子上记录这些状态, 哪些事没做完下次继续

4> 记账信息

记账信息会记录当前进程持有CPU的情况作为进程调度的参考依据

通过优先级机制, 可能出现极端情况, 把所有资源给了某个进程, 其他进程啥都没有

1周 4 天给A, 2 天给B 1天放假, C没有时间了....

这样C就可能去找其他人舔了, 我就需要给他适当的补偿

CPU寄存器:

CPU中有些寄存器只是用来保存运算的中间结果的.

还有些寄存器是有特定含义, 特定作用的

 1. 保存到当前执行到那些指令(程序计数器)  (简单认为是main方法,程序的入口)

是一个2/4/8字节的整数, 这个整数存的是一个内存地址, 指向程序下一套执行指定所在的位置

每次取完一条指令, 默认指向下一条.

2. 维护栈相关的寄存器

通过这一组(一般是两个) 维护当前程序的" 调用栈 "

栈是一块内存, 保存当前这个程序方法调用过程中, 一系列的关系.

3. 其他通用寄存器

保存计算的中间结果  10+20+30保存10+20的值

CPU里面的寄存器不多, 数据不多, 好保存, 好恢复, 直接打包到内存中

还有很多PCB属性支持进程的相关功能, 其他的不做展开了

虚拟地址空间

早期的操作系统, 程序运行时分配的内存就是物理内存

有A和B两个进程, 其中A进程内存访问越界了, B的内存写坏了, B崩溃了

因此引入了"虚拟地址空间"概念, 不是直接分配物理内存了, 而是分配虚拟的内存空间.

操作系统对于内存进行了一层抽象, 如图:

通过上述方式把进程之间隔离开了,但是如果想要多个进程互相配合, 此时就不好搞了,

现在引入新的机制来实现进程之间的通信

具体的实现方式很多: (核心思想一样: 都是借助一个公共空间)

1> 通过文件

2> 网络(socket)

小结: 

学习操作系统需要去理解其中的每个功能的含义, 而不是背诵, 融会贯通才是真的学会了

本篇博客简单的讲解了计算机组成和操作系统的一些知识

如有不足,望指正

  • 43
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值