虚拟化CPU
- 示例程序
(base) matytan@matytandeMacBook-Pro ch2 % gcc -o cpu cpu.c -Wall
(base) matytan@matytandeMacBook-Pro ch2 % ./cpu A
#多个程序一起跑
(base) matytan@matytandeMacBook-Pro ch2 % ./cpu A &; ./cpu B &; ./cpu C &; ./cpu D &
[1] 92105
[2] 92106
[3] 92107
[4] 92108
(base) matytan@matytandeMacBook-Pro ch2 % A
B
C
- 只有一个cpu,如何做到4个程序同时跑?==虚拟化CPU,如何虚拟化?
- 抽象为进程
- 进程调度
虚拟化内存
(base) matytan@matytandeMacBook-Pro ch2 % ./mem 1 &;./mem 1
[1] 97588
(pid:97588) addr of p: 7ff7bdc6a388
(pid:97588) addr stored in p: 6000023f0040
(pid:97589) addr of p: 7ff7bd83f388
(pid:97589) addr stored in p: 600002ff8040
(pid:97588) value of p: 2
(pid:97589) value of p: 2
(pid:97588) value of p: 3
(pid:97589) value of p: 3
两个不同进程的地址竟然一样!同时独立更新了值,每个正在运行的都有自己的私有内存,不与其他正在运行的程序共享相同文件
- 这就是虚拟内存
- 每个进程独立的虚拟地址空间
- 分段
- 分页
并发
多线程~
- 指令如何执行,这会影响并发的正确性(以下三条指令并不是原子操作!任意顺序皆有可能)
- 计数器值从内存加载到寄存器
- 递增计数器
- 将值保存回内存
- 因此程序两个线程处理计数器递增如果不使用某些措施,会导致最后结果并不正确
持久性
- 文件系统
设计目标
操作系统它取得CPU、内存或磁盘等物理资源(resources),并对它们进行虚拟化(virtualize)。它处理与并发(concurrency)有关的麻烦且棘手的问题。它持久地(persistently)存储文件,从而使它们长期安全。
- 获取资源
- 虚拟化资源
- 处理并发执行的问题
- 持久化文件
三个目标:
建立抽象
抽象使得编写一个大型程序成为可能,将其划分为小而且容易理解的部分,用C这样的高级语言编写这样的程序不用考虑汇编,用汇编写代码不用考虑逻辑门,用逻辑门来构建处理器不用太多考虑晶体管。
高性能的操作系统
虚拟化和让系统易于使用是非常值得的,但不会不计成本。因此,我们必须努力提供虚拟化和其他操作系统功能,同时没有过多的开销。这些开销会以多种形式出现:额外时间(更多指令)和额外空间(内存或磁盘上)。如果有可能,我们会寻求解决方案,尽量减少一种或两种。但是,完美并非总是可以实现的,我们会注意到这一点,并且(在适当的情况下)容忍它。
提供系统和应用,应用和应用之间的保护,即隔离
保护是操作系统基本原理之一的核心,这就是隔离(isolation)。让进程彼此隔离是保护的关键,因此决定了OS必须执行的大部分任务。
简单历史
-
早期操作系统:一些库
-
超越库:保护
系统调用和过程调用之间的关键区别在于,系统调用将控制转移(跳转)到OS中,同时提高硬件特权级别(hardware privilege level)。
-
多道程序时代
-
摩登时代
个人计算机