为什么要学操作系统?
觉醒“编程力量”!
给你有关编程的全部!
什么是操作系统?
Operating System: A body of software, in fact, that is responsible for
making it easy to run programs (even allowing you to seemingly run many
at the same time), allowing programs to share memory, enabling programs
to interact with devices, and other fun stuff like that. (OSTEP)
操作系统何以至此?
- 计算机(硬件)
- 程序(软件)
- 操作系统(管理软件的软件)
这里学习的是狭义的操作系统
发展历史
1940s:无操作系统
真空管实现逻辑门,内存使用延迟线(一维),输入输出:打孔纸带/指示灯
1946.2.14,ENIAC诞生
1950s:
晶体管实现更快更小的逻辑门,内存使用磁芯(二维)
1953,中断机制
1957,Fortran诞生
管理多个程序依次排队运行的库函数和调度器
操作系统的概念开始形成
操作 (operate) 任务 (jobs) 的系统 (system)
“批处理系统” = 程序的自动切换 (换卡) + 库函数 API
Disk Operating Systems (DOS)
操作系统中开始出现 “设备”、“文件”、“任务” 等对象和 API
1960s:
集成电路,总线出现
- 更快的处理器
- 更快更大的内存;虚拟存储出现
- 可同时载入多个程序且不用“换卡”
- 更丰富的IO设备,完善的中断/异常机制
更多的高级语言和编译器出现
COBOL(1960), APL(1962), BASIC(1965)
Multics(MIT, 1965) 现代操作系统诞生
能载入多个程序到内存且灵活调度他们的管理程序,包括程序可以调用的API
同时将多个程序载入内存是一项巨大的能力
有了进程 (process) 的概念
进程在执行 I/O 时,可以将 CPU 让给另一个进程
在多个地址空间隔离的程序之间切换
虚拟存储使一个程序出 bug 不会 crash 整个系统
操作系统中自然地增加进程管理 API
程序之间的切换变为定时切换
基于中断机制
1970s:
集成电路空前发展,“计算机”已经和现在的无太大差异
CISC指令集,中断,IO,异常,内存管理单元(MMU),网络
个人计算机,超级计算机
PASCAL(1970), C(1972)
分时系统走向成熟,UNIX 诞生并走向完善,奠定了现代操作系统的形态。
- 1973: 信号 API、管道 (对象)、grep (应用程序)
- 1983: BSD socket (对象)
- 1984: procfs (对象)……
- UNIX 衍生出的大家族
- 1BSD (1977), GNU (1983), MacOS (1984), AIX (1986), Minix (1987), Windows (1985), Linux 0.01 (1991), Windows NT (1993), Debian (1996), Windows XP (2002), Ubuntu (2004), iOS (2007), Android (2008), Windows 10 (2015), ……
今天的OS:
通过 “虚拟化” 硬件资源为程序运行提供服务的软件。
空前复杂的系统之一
- 更复杂的处理器和内存
- 非对称多处理器 (ARM big.LITTLE; Intel P/E-cores)
- Non-uniform Memory Access (NUMA)
- 更多的硬件机制 Intel-VT/AMD-V, TrustZone/
SGX, TSX, …
- 更多的设备和资源
- 网卡、SSD、GPU、FPGA…
- 复杂的应用需求和应用环境
- 服务器、个人电脑、智能手机、手表、手环、IoT/微控制器……
理解操作系统:三个根本问题
操作系统服务谁?
- 程序 = 状态机
- 课程涉及:多线程 Linux 应用程序
(设计/应用视角) 操作系统为程序提供什么服务?
- 操作系统 = 对象 + API
- 课程涉及:POSIX + 部分 Linux 特性
(实现/硬件视角) 如何实现操作系统提供的服务?
- 操作系统 = C 程序
- 完成初始化后就成为 interrupt/trap/fault handler
- 课程涉及:xv6, 自制迷你操作系统