操作系统学习路线

by 程序员鱼皮 知识星球

介绍

操作系统是管理计算机硬件与软件资源的计算机程序,是计算机系统中 最基本 的系统软件。

学习操作系统,一方面能帮助我们了解程序执行的原理、熟悉更多计算机的概念(比如内存、CPU、文件系统、磁盘);另一方面,操作系统中的结构设计、算法设计、解决问题的思路和方案都非常优秀,可以帮助我们开拓思路,从而在自己编写程序、设计算法时有了更多的选择和考量(比如死锁问题的处理)。

此外,操作系统也是 考研和面试的重点 ,如果是大学期间的小伙伴,在课堂上就要认真学习。

学习条件

  1. 至少学过一门编程语言(否则学操作系统时一些代码演示可能看不懂)
  2. 急着找工作的同学可以先不学,等面试前直接看一些题目即可

大纲

链接: https://pan.baidu.com/s/1GDkDBkJhe_j7sUiNV_qA3g

提取码: pkuk

知识

  1. 基本概念
  • 操作系统的作用
  • 操作系统的体系结构
    • 内核概念
  • 处理器状态
    • 用户态
    • 核心态
  • 系统调用
  • 中断和异常
  1. 进程管理
  • 进程与线程
    • 基本概念
    • 进程 / 线程状态及转换
  • CPU 进程调度算法
    • 先来先服务(FCFS)
    • 短作业优先(SJF)
    • 最短剩余时间优先(SRTN)
    • 高响应比优先(HRRN)
    • 时间片轮转
    • 优先级调度
    • 多级反馈队列
  • 进程同步与互斥
    • 信号量机制
    • 生产者 – 消费者模型
    • 读者 – 写者问题
    • 哲学家进餐问题
  • 进程通讯机制
  • 死锁
    • 死锁产生的条件
    • 死锁预防与避免
    • 死锁检测与恢复
  1. 内存管理
  • 基本概念
    • 内存
    • 内存管理
    • 地址空间
  • 覆盖与交换
  • 内存分配与回收
    • 连续内存分配
      • 单一连续分配
      • 内存碎片
      • 分区
        • 固定分区分配
        • 动态分区分配
    • 非连续内存分配
      • 分段存储管理
      • 分页存储管理
      • 页表
      • 二级页表
      • 多级页表
      • 反向页表
      • 地址变换机构
        • 基本
        • 基于快表
      • 段页式存储管理
    • 虚拟内存(非连续内存分配)
      • 基本概念
      • 局部性原理
      • 实现
        • 请求分段存储管理
        • 请求分页存储管理
        • 请求段页式存储管理
      • 页面置换算法
        • 最佳置换算法(OPT,理想置换算法)
        • 先进先出置换算法(FIFO)
        • 最近最久未使用置换算法(LRU)
        • 时钟置换算法(CLOCK)
        • 第二次机会算法
      • 页面分配策略
  1. 文件管理
  • 基本概念
    • 文件系统
    • 文件
      • 逻辑结构
      • 物理结构
    • 目录
    • 文件描述符
  • 文件操作
  1. 磁盘管理
  • 磁盘结构
  • 磁盘调度算法
    • 先来先服务(FCFS)
    • 最短寻找时间优先算法(SSTF)
    • 扫描算法(SCAN,经典电梯调度算法)
    • 循环扫描算法(CSCAN)
  1. 设备管理
  • 基本概念
    • I / O 设备
    • I / O 设备分类
  • I / O 控制
  • 缓冲区管理

学习路线

本学习路线适用于所有从 0 开始学操作系统、了解操作系统核心概念、希望快速提升基础能力的同学。但如果要从事操作系统底层开发的话,这份路线还不够,需要深入理解 Linux 等操作系统的设计,并进行大量的编码练习。

预热

该阶段可跳过,或者与之后的阶段同时进行

在任何时候,都可以在课外时间利用一些轻松精简的视频或书籍来帮助我们简单了解计算机、操作系统相关的概念。

推荐《计算机科学速成课》视频:https://www.bilibili.com/video/BV1EW411u7th,仅观看 P 1 – 10、P 18 – 20 即可。

一、基础学习(概念)

这个阶段重在了解操作系统的基本概念,对其体系结构有个全面的认识,不必纠结于源码。

当然,能力很强的同学也可以跳过本阶段,直接去看下个阶段的视频教程。

操作系统的学习侧重于理论,主要分为六大部分:基本概念、进程管理、内存管理、文件管理、磁盘管理、设备管理。其中, 最重要 的是进程管理和内存管理。这两部分和我们编写程序相关(比如并发编程、死锁、内存分配),因此也是面试时的高频考点。

建议跟着完整的视频教程学习,最好不要一开始就看复杂的书籍(比如《现代操作系统》、《深入理解计算机系统》等)。

对于操作系统这种经典理论,不建议看培训机构的课程(也基本没有),还是大学教授讲的课更专业严谨一些。

推荐《王道计算机考研 – 操作系统》视频课:https://www.bilibili.com/video/BV1YE411D7nH 。毕竟是考研课,这门课讲的非常清晰、受众广泛,哪怕不是计算机专业的同学(跨考)也能看懂。视频中老师整理了大量的思维导图,也能培养大家的体系化思维。

其他资源

在学习某个知识点遇到问题时可以翻阅以下资料

二、深入学习(实验)

这个阶段会结合源码来讲解分析操作系统的实现,并且通过一些实验加强了解。

对于时间紧、只是想找工作的同学,本阶段可直接跳过。

上个阶段推荐的课程侧重于基本概念(理论知识),不涉及源码。而这个阶段推荐的课程资源更细节、同时包含了一些实验帮助大家更好地深入理解操作系统。

比如以下几所名校的课程,选一门看即可(首推清华大学):

如果想进一步巩固知识,可以在看视频的同时去阅读一些计算机经典书籍,比如:

看了上述的视频教程后,如果还想进一步学习,可以跟着教程来尝试自己动手制作一个简易的操作系统(MiniOS),帮助你真正理解操作系统的设计与实现。

国外教程推荐 MIT 6.828 和难度相对低一些的 MIT 6.S081,这是两门经典的实验课:

当然也可以看一些书籍,比如:

三、备战面试

这一章没什么好说的,找工作前强烈建议背诵一些面试题。当然,如果你能结合自己编程的实际经验去记忆和回答就更好了。

操作系统面试的重点主要是进程管理 + 内存管理,进程管理又是重点中的重点,以下经典面试题一定要搞懂(可以从下面的资源部分找到答案):

  1. 进程和线程的区别?
  2. 进程调度算法有哪些?
  3. 常见的进程通信方式?
  4. 有哪些进程同步的方法?
  5. 什么是死锁,什么情况下会出现死锁(必要条件)?怎么预防和处理?
  6. 介绍常见的内存页面置换算法
  7. 什么是中断?
  8. 什么是系统调用?
  9. 操作系统如何进行内存管理?
  10. 什么是虚拟内存?
  11. 什么是局部性原理?
  12. 什么是缓冲区溢出?

还有很多和 Linux 操作系统相关的题目,此处暂不列举。

资源

学习建议

  1. 操作系统具有极强的理论性,学习过程中难免会感觉枯燥,因此在初学时不建议强行去背诵一些知识,跟着视频过一遍、能够描述出操作系统大概涉及哪些知识点就好(结合思维导图去学习)。在面试 / 考研前再根据自己的时间去记忆题目就好。
  2. 在学习操作系统内的算法(比如 CPU 进程调度、内存页面置换、磁盘调度)时,要理解每个算法的概念、特点、优势与劣势、应用场景,因为我们在程序设计时极有可能应用这些算法来解决问题,比如 LRU 算法。
  3. 在学习过程中,可能会接触到部分算法和源码(比如生产者 – 消费者问题),时间允许的话可以试着自己实现一遍,加深理解。

加油小伙伴们!

玄机博客
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容