知识回顾
冯·诺依曼体系结构
- 只用北桥的话性能好,但需要集成封装,可扩展性差,且北桥造价高。
- 只用南桥的话可扩展性好,造价更低,但是性能不够好。
- 北桥更新换代更快。
- 智能手机也符合冯·诺依曼体系结构。
结构特点
可编程、计算和存储分离
- 采用指令和数据存储在一起的结构
- 存储器是按地址访问、线性编址的空间
- 指令由操作码和地址码组成:MOV AX, 2
- 指令在CPU的运算单元处理
- 控制流由指令流产生
新的体系结构
背景:云原生和软件定义的出现。
- 智能网卡:在网卡内进行计算
- 存内计算:把CPU和内存进行整合
- RDMA:远程直接数据存取,通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响
计算机指令
- CPU是执行各种计算机指令的逻辑机器
- 计算机指令也被称为机器语言,由一串0和1组成
- 不同架构的CPU能听懂的语言不太一致,每种CPU均有其支持的计算机指令集
- 指令执行的流程:硬盘→内存←→CPU
内存布局
- BP(基址指针寄存器):与SS配合使用,指向栈底
- SP(堆栈指针寄存器):与SS配合使用,指向栈顶
- SI(源变址寄存器):存放相对于DS段的偏移量
- IP(指令指针寄存器):与CS配合使用,跟踪程序的执行过程
8086 vs 80386
- 8086:采用实模式(物理内存一一映射),直接左偏移,存在安全隐患,且寻址的范围较小
- 80386:采用保护模式(引入虚拟内存),使用段选择子寄存器,较为安全,寻址范围较大
内存操作
函数调用
- 参数入栈:将参数从右向左依次压入系统栈中
- 返回地址入栈: 将当前代码区调用指令的下一条指令地址压入栈中, 供函数返回时继续执行
- 代码区跳转: 处理器从当前代码区跳转到被调用函数的入口处
- 栈帧调整
(1)保存当前栈帧状态值,已备后面恢复本栈帧时使用:BP入栈
(2)将当前栈帧切换到新栈帧:将SP值装入BP,更新栈帧底部
(3)给新栈帧分配空间:把SP减去所需空间的大小,抬高栈顶
函数返回
- 保存返回值,将函数的返回值保存在寄存器AX
- 弹出当前帧,恢复上一个栈帧
(1)将当前栈帧底部保存的前栈帧BP值弹入BP寄存器,恢复出上一个栈帧
(2)将函数返回地址弹给IP寄存器 - 跳转:按照CS:IP跳回调用函数中继续执行
函数调用和返回实例
int static add(int a, int b){
0: 55 push rbp
1: 48 89 e5 mov rbp,rsp
4: 89 7d fc mov DWORD PTR [rbp-0x4], edi
7: 89 75 f8 mov DWORD PTR [rbp-0x8], esi
a: 8b 55 fc mov edx, DWORD PTR [rbp-0x4]
d: 8b 45 f8 mov eax, DWORD PTR [rbp-0x8]
10: 01 d0 add eax, edx
}
12: 5d pop rbp # 这里把红色的rbp赋值给rbp
13: c3 ret
0000000000000014 <main>:int main(){
14: 55 push rbp
15: 48 89 e5 mov rbp,rsp
18: 48 83 ec 10 sub rsp,0x10 # 开辟栈空间
1c: c7 45 fc 05 00 00 00 mov DWORD PTR [rbp-0x4], 0x5
23: c7 45 f8 0a 00 00 00 mov DWORD PTR [rbp-0x8], 0xa
2a: 8b 55 f8 mov edx, DWORD PTR [rbp-0x8]
2d: 8b 45 fc mov eax, DWORD PTR [rbp-0x4]
30: 89 d6 mov esi, edx
32: 89 c7 mov edi, eax # 这四步看起来冗余,实际上提高了性能
34: e8 c7 ff ff ff call 0 <add> # 函数声明必须在调用之前,否则不知道call哪里
# 内存中看不出来函数返回值类型,因此只有函数返回值不同的不是函数重载
39: 89 45 f4 mov DWORD PTR [rbp-0xc], eax
3c: b8 00 00 00 00 mov eax,0x0
}
41: c9 leave
42: c3 ret
CPU执行指令流程
操作系统概述
操作系统的特征
- 并发(Concurrence):同时存在多个运行的进程(多道程序), 需要OS管理和调度
- 共享(Sharing)
- 互斥共享: 某种资源(e.g., CPU)某时刻只能被一个进程独享
- 同时访问: 允许在一段时间内由多个进程交替访问(e.g., 磁盘)
- 虚拟(Virtual)
- 利用多道程序设计技术, 让每个进程和每个用户觉得
- 有一个处理器(CPU) 专门为他服务
- 异步(Asynchronism):进程执行不是一贯到底, 而是走走停停且执行速度不可预知
操作系统的功能
- 计算机系统资源的管理者
- 用户与计算机硬件系统之间的接口
操作系统的分类
单道操作系统
- 多个进程按照先来先服务的方式顺序执行(排队系统)
- 内存中只有一个进程运行且它需要执行完毕(独占内存) 👉 工业系统中能够保持鲁棒性和安全性
- 运行时, 高速CPU进程要等待低速I/O完成, 限制系统吞吐量 👉 南桥比北桥慢,北桥需要等南桥加载完数据,性能低
多道操作系统
- 内存中同时存放多个相互独立的进程 👉 靠操作系统来调度:谁实际使用CPU,和文件系统之间的连接(换页等)
- 宏观上并行(先后开始各自的运行, 但都未运行完毕)
- 微观上串行(轮流占有CPU)
- 资源利用率和系统吞吐量均增大
- CPU、内存、I/O设备资源分配问题复杂
- 大量进程和数据组织和存放的安全性和一致性问题
分时操作系统
- 分时技术: 处理器的运行时间分成很短的时间片
- 按时间片轮流把处理器分配给各个用户或进程使用
- 存在系统延时,适用于银行系统、购票系统等
实时操作系统
- 计算机系统接收到程序请求后会立即处理, 并在严格的时限内处理完成该程序
- 可靠性和实时性保证较难
- 一般需要专门设计, 普适性较差
- 是未来发展的趋势,例如手机系统
操作系统的体系结构
宏内核
将操作系统的主要功能模块作为整体运行在核心态, 以此来为应用程序提供高性能服务
- 模块间信息共享→ 性能优势明显
- 程序服务需求增加、接口形式更复杂→功能耦合度高、模块化程度下降, 内核设计庞大且复杂
微内核
解决操作系统的内核代码难以维护问题,即将内核最基本功能(e.g., 进程、线程管理) 保留, 剩余功能移到用户态执行
- 降低了内核设计的复杂度
- 具有更好的分层和模块化接口
- 性能问题:频繁的在用户态和内核态切换
- 未来发展的方向