目录
计算机的组成:
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)
小结:
学习操作系统需要去理解其中的每个功能的含义, 而不是背诵, 融会贯通才是真的学会了
本篇博客简单的讲解了计算机组成和操作系统的一些知识
如有不足,望指正