CS162笔记(操作系统)
由于我最近在学习学校开设的操作系统课程,想对此有更深入的了解,所以选择了cs162。一来是学习国内外对于学习的两种思维模式,二来是鞭策自己尽早习惯英文环境。鉴于英文授课对很多新手来说并不友好,我在此做出关键内容的整理和课件的搬运与翻译。
这里推荐两个资源
【CS162精翻·英文原声】伯克利大学《计算机操作系统》(2020)_哔哩哔哩_bilibili
这个CSDN上的笔记是所有字幕整理成了文字,我习惯先阅读我要学习的部分,然后再去看一遍视频,接着做笔记的时候再次阅读(仅供参考)
总课程有二十五章,每章约90min左右,当然我想想要吃透是需要3h的。我会在一月内尽量完成这门课的学习。(立flag)
一、什么是操作系统
1.时间-引入

“不知何故,系统会在这些规定的时间内运行,其中有一些神奇的事”
经典计算机时延对照表
| 操作 | 英文原文 | 时延(纳秒 ns) | 直观量级 |
|---|---|---|---|
| L1 缓存访问 | L1 cache reference | 0.5 ns | 纳秒级(CPU 内部最快) |
| 分支预测错误 | Branch mispredict | 5 ns | 纳秒级 |
| L2 缓存访问 | L2 cache reference | 7 ns | 纳秒级 |
| 互斥锁加锁 / 解锁 | Mutex lock/unlock | 25 ns | 纳秒级 |
| 主存访问 | Main memory reference | 100 ns | 百纳秒级 |
| 用 Zippy 压缩 1KB 数据 | Compress 1K bytes with Zippy | 3,000 ns | 微秒级(3µs) |
| 在 1Gbps 网络发送 2KB 数据 | Send 2K bytes over 1 Gbps network | 20,000 ns | 微秒级(20µs) |
| 从内存顺序读取 1MB | Read 1 MB sequentially from memory | 250,000 ns | 百微秒级(0.25ms) |
| 同数据中心内往返 | Round trip within same datacenter | 500,000 ns | 半毫秒级(0.5ms) |
| 磁盘寻道 | Disk seek | 10,000,000 ns | 10 毫秒级 |
| 从磁盘顺序读取 1MB | Read 1 MB sequentially from disk | 20,000,000 ns | 20 毫秒级 |
| 数据包往返加州→荷兰→加州 | Send packet CA→Netherlands→CA | 150,000,000 ns | 150 毫秒级 |
从半纳秒或皮秒级别的CAF引用,到跨越全球传输所需的毫秒,甚至在某些情况下是秒级时间。**而操作系统是实现这一切的关键。**因为如果没有它,你实际上是无法使用这些东西的。操作系统,它几乎为应用程序和程序员提供了统一的抽象,尽管硬件各不相同。(这是我的理解:我们知道随着底层技术的进步,现在有各种各样的设备,电脑就有各种品牌。而对于不同的设备安装软件时,我们需要不管什么设备都可以正确的运行软件,在其中起到作用的就是操作系统)后文kubi提到“底层实际上是硬件,操作系统是介于应用程序(这些是你想要完成的任务)和复杂杂乱的底层硬件之间的一个层。”
从作用上来说,“它使你能够管理在多个应用程序之间共享的资源,同时还能够处理安全问题。而一些关键的构建模块,我们将在本学期深入讨论的内容,诸如进程、线程、并发、调度、协调、所有这些内容、地址空间、保护和安全等。”
二、搜索-举例

“在这节课上,你可以近距离观察到这些构建模块如何实际被实现,如何将它们整合在一起。举个例子,你拿出手机,搜索一些内容。其实,发生的是:
手机会连接到DNS服务,DNS是层级化的,因此可能有多个服务器连接以获取响应。它的作用是将你可读的人类服务名称转化为IP地址,之后可以用来通过互联网不断跳转到某个地方。
可能是一个数据中心,你将在入口点遇到负载均衡器。你完全没有意识到,负载均衡器会选择下一个跳点来转发这个信息。然后,也许有一些定制的服务器在忙于执行你的搜索或寻找信息。
找到你感兴趣的信息。可能会生成一些广告,并且其他的合成也会发生在最终网页上,生成一个包含你结果的页面,也许还有一些广告,然后这些结果会通过同样的路径回传,通常是通过互联网返回到手机。这件你每天都会利用的简单事情,实际上有很多非常有趣的环节。”
什么是DNS?
DNS(domain name system),也就是域名系统,把你能看懂的网址(比如 baidu.com)翻译成电脑能看懂的 IP 地址(比如 180.101.49.11)。是一个全球分布式、层级化的数据库,实现域名 ↔ IP 地址 相互转换
- 层级(树状):根域名服务器,顶级域服务器,权威域名服务器(每一层只负责自己的部分)
- 分布式:没有一台机器存全世界所有域名,每台服务器只负责一小部分,查询时一层层问过去
- 缓存(cache):查过一次就记住,下次直接返回(极大提高速度,DNS高性能的关键)
- 网络协议实现:DNS用UDP53端口实现,快,无连接,适合小查询,大型请求会切TCP
什么是负载均衡器
**LB(Load Balancer)**它站在用户和一堆服务器中间,把请求均匀分给多台服务器,不让任何一台忙死、其他闲死。
当搜索东西的请求到达数据中心,第一个遇到的就是负载均衡器,它要看后面哪台服务器最闲然后把你的搜索请求转发给它,等服务器算完结果再传回给你。
理解了这两个概念,你是否已然窥见这个系统的精妙并且惊叹呢。
kubi说:“我也从中感到惊奇。我喜欢系统,并且我认为像这样的一个大系统能够正常运作,实在是太神奇了。”
这份热爱和求知欲感染到了不同时空的我,为之感同身受。
惊叹的同时,他抛出了两个问题。如果你理解了DNS的结构,我想你能回答出。
那么多DNS服务器是如何保持数据一致的
- 结构稳定:它永远是树形结构,每一层只管自己的,保证了全局一致
- 动态一致:如果管理员修改DNS记录,首先更新权威服务器,然后通知上级刷新,再逐级穿鼻哦
- TTL同步:每台服务器其实不是实时同步的,全网一卡DNS就费了。事实上每条 DNS 记录都有一个过期时间。,每条 DNS 记录都有一个过期时间。
为什么不可能入侵DNS
- 物理上:服务器分布在全球,你需要同时攻破全球不同国家、不同运营商的机器,这在物理上几乎不可能
- 逻辑上:DNS是分层隔离的
- 技术上:DNS本身有防火墙,DNS 主要用 53 端口,外部攻击很难绕过。
回到之前的问题,什么是操作系统,kubi提到现在还没有一个被普遍解释的定义,但给出了一种理论
**“操作系统有一个叫做内核的部分,通常是计算机上始终运行的唯一程序,它像是操作系统的核心,可能其他的东西要么是随操作系统一起发布的系统程序,要么就是应用程序。”**在后文他会继续讲