Overview
学习操作系统的目的
你体内的“编程力量”尚未完全觉醒
《操作系统》给你有关“编程”的全部
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的计算机
跨时代、非凡的天才设计,但很简单(还不如我们数电实验课做的CPU复杂呢):
电子计算机的实现:
1940s的程序
ENIAC程序是用物理线路"hard-wire"的
最早成功运行的一系列程序:打印平方数、素数表、计算弹道…
1940s的操作系统
没有操作系统
能把程序放上去就很了不起了
1950s的计算机
更快更小的逻辑门(晶体管)、更大的内存(磁芯)、丰富的I/O设备
1950s的程序
可以执行更复杂的任务,包括通用的计算任务
一行代码,一张卡片
1950s的操作系统
管理多个程序依次排队运行的库函数和调度器。
写程序、跑程序都是非常费事的(比如你写了个死循环.…)
操作系统的概念开始形成
1960s的计算机
集成电路、总线出现
更快的处理器
更快、更大的内存;虚拟存储出现
更丰富的I/O设备;完善的中断/异常机制
1960s的程序
更多的高级语言和编译器出现
计算机科学家们已经在今天难以想象的计算力下开发惊奇的程序
1960s的操作系统
能载入多个程序到内存且灵活调度它们的管理程序,包括程序可以调用的API。
同时将多个程序载入内存是一项巨大的能力
有了进程 (process))的概念
进程在执行VO时,可以将CPU让给另一个进程
在多个地址空间隔离的程序之间切换
虚拟存储使一个程序出bug不会 crash整个系统
操作系统中自然地增加进程管理API
既然操作系统已经可以在程序之间切换,为什么不让它们定时切换呢?
基于中断(例如时钟)机制
1970s+的计算机
集成电路空前发展,个人电脑兴起,”计算机“已与今日无大异
1970s+的程序
PASCAL(1970),C(1972),…
1970s+的操作系统
分时系统走向成熟,UNIX诞生并走向完善,奠定了现代操作系统的形态
通过"虚拟化”硬件资源为程序运行提供服务的软件。
空前复杂的系统之一
更复杂的处理器和内存
非对称多处理器( ARM big LITTLE; Intel P/ E-cores)
Non-uniform Memory Access(NUMA)
更多的硬件机制 Intel-VT/AMD-V, TrustZone/SGX,TSX,
更多的设备和资源
复杂的应用需求和应用环境
理解操作系统:三个根本问题
操作系统服务谁
程序 = 状态机
涉及: 多线程 Linux应用程序
(设计/应用视角)操作系统为程序提供什么服务?
(实现/硬件视角)如何实现操作系统提供的服务?
计算机专业学生必须具备的核心素质
1.是一个合格的操作系统用户
2.不惧怕写代码
感到Linux/ Power Shell很难用?
1.没有建立信心、没有理解基本逻辑
2.没有找对材料( Baidu v.s. Google/Bing/ Github/ Stackoverflow)
3.没有用对工具(man v.s. tldr;该用IDE就别vim)
学会写代码
写代码 = 创造有趣的东西
Talk is Cheap. Show Me the Code
应用视角/操作系统设计:操作系统 = 对象 + API
硬件视角/操作系统实现:操作系统 = C程序
最重要的:Get Your Hands Dirty
参考视频