图灵机=存储器+执行器
执行器包含临时存储器即寄存器,控制单元解释并执行指令,算术运算单元
程序员眼中的内存:大数组,以字节为单位
CPU:32/64位宽,含寄存器(多种类别)、控制单元、逻辑运算单元
一次操纵小于32位数的时候,性能与64位CPU差别不大;但二者的寻址空间差异则比较大
总线:通信线路,分为地址/数据/控制总线。
一条总线用高低电平表示01,想要一次获得64位地址则需要64条地址总线,这表示了线路位宽,CPU位宽最好大于线路位宽
输入输出设备会使用控制总线和CPU交互
程序执行过程:根据pc通过地址总线向内存请求数据,通过数据总线接收数据,存到指令寄存器,pc自增字长;解释指令,存储类指令交给cu,算术类交给alu执行。这一个周期被称为CPU的指令执行周期
a = 1 + 2执行过程:编译程序为机器指令后执行机器指令;加载1到寄存器,加载2到寄存器,两个寄存器相加结果放到寄存器,存储结果到内存。这里的寄存器和地址由编译器指定,cpu是无情的执行机器
指令:不同种类的CPU能识别不同的指令,特定CPU指令的集合被称为指令集
以MIPS指令为例,它有R(register)、I(immediate)、J(jump)三种指令:
现代CPU采用流水线技术加快指令执行,即:取指令、解析指令、执行指令、存储数据,这是一个四级流水线。这一个完整的周期被称为指令周期
从功能
的角度分,指令可以分为:数据传输、运算、跳转、信号、闲置五种类型
GHz
这个参数,代表每秒产生的脉冲信号次数,即时钟频率
;每一次脉冲信号高低电平的转换代表新周期的开始,称为时钟周期
。时钟频率越高,时钟周期就越短,基本操作的执行速度也就越快。
对于程序的执行时间,我们用这个公式来衡量:时钟周期数 * 时钟周期时间
,它可以进一步细化为:指令数 * 平均指令周期数 CPI * 时钟周期时间
优化程序的执行速度可以从这三个方面下手:
超频
可以降低时钟周期时间,提高速度流水线
技术,让一条指令需要的 CPU 时钟周期数尽可能的少编译器
优化存储器分为易失性存储器和非易失性存储器,区别在于断电后数据是否会丢失
速度直观比较:
实际:
4
个字节; 64 位 CPU 中大多数寄存器可以存储 8
个字节。半个时钟周期
,一般不到1ns。2 GHz 主频的CPU,时钟周期为0.5ns,寄存器访问时间为0.25nsSRAM
:Static Random-Access Memory,支持随机访问 & 有电才有数据,所以叫静态随机存储器存储密度不高
、电路简单,所以访问速度飞快2~4 个时钟周期
,大小在 几十到几百KB
可以通过以下命令查看 linux 数据和指令缓存的大小:
10~20 个时钟周期
,通常大小在几百 KB 到几 MB
20~60个时钟周期
,通常大小在几 MB 到几十 MB
不等1bit数据用一个晶体管+一个电容
存储,电容漏电所以需要定时刷新200~300 个时钟周期
10~1000
倍。10W
倍左右由于 SSD 的价格快接近机械硬盘了,因此机械硬盘已经逐渐被 SSD 替代了。
相邻
的存储器设备打交道。缓存
,充分利用了局部性
linux 中的进程和线程都用 struct task
表示,区别在于线程共享了进程已创建的资源
,使用的资源更少,所以也叫 轻量级进程
。task 是调度的单位
任务有三种调度类,每个调度类型都有自己的任务队列
:
ddl和realtime组合起来有三种策略:
fair 类任务分为普通任务和后台任务两种调度策略:
CFS 即 Completely Fair Scheduling,在一段时间内,所有的任务运行时间一样
。但会优先调度优先级
高的任务,相应的,优先级高的任务每次运行的时间 vruntime
较少
我们根据 权重值
计算 vruntime:
权重值不等于优先级,内核中有一个 nice
值和权重值的转换表,nice 越低的权重越大,优先级越高,vruntime 越少,越先调度
每个CPU有自己的运行队列,根据调度类的不同分为三个运行队列,其中CFS调度队列用红黑树表示,其他两个都是普通的队列。
这几个调度类也分优先级:Deadline > Realtime > Fair,优先执行实时任务
可以通过调整nice值的方式实现,毕竟nice越少,vruntime越少,优先级越高
普通任务优先级可以调整的范围为:-20~19
,其中0为默认优先级。优先级会被映射到99139,这是普通任务的优先级范围,实时任务的优先级实际在098:
若想获得更高的优先级则需要更改调度策略
: