操作系统学习笔记


为什么要学操作系统

几乎所有的互联网相关的知识都建立在操作系统之上。它是非常保值的知识。

计算机网络、操作系统和数据库,是在个人学习方面,投资收益率最高的三类技术。第一,它们是计算机世界的水电煤,它们被应用在几乎每个角落,很多上层应用实际上只是这些技术的组合;第二,这些技术的保质期非常长,能让你一次学习终身受益,几乎没有知识失效的风险。

操作系统基础

操作系统是计算机系统的核心软件,是管理计算机硬件与软件资源的程序,同时也是控制程序的执行和资源分配的管理者。操作系统具有以下基本特征:

  • 并发性:多个程序同时执行
  • 共享性:多个程序共享系统资源
  • 虚拟性:将物理资源变为逻辑资源,拓展资源能力
  • 异步性:进程以不可预知的速度推进,呈"走走停停"特征

历史

操作系统的发展经历了几个时期:

  1. 手工操作阶段:无操作系统,程序员直接操作计算机

  2. 批处理系统

  • 单道批处理:一次只执行一个作业
  • 多道批处理:内存中同时存在多个作业,CPU在它们之间切换
  1. 分时系统:多个用户同时共享计算机资源,每个用户有专用终端
  2. 个人计算机操作系统:面向单用户的系统(如DOS, Windows, MacOS)
  3. 网络操作系统和分布式操作系统:支持网络环境下的资源共享和通信
  4. 实时操作系统:对时间有严格要求,用于工业控制等场景
  5. 嵌入式操作系统:运行在嵌入式设备上的轻量级系统
  6. 移动操作系统:为移动设备设计的系统(如Android, iOS)

进程管理

进程与线程

  • 进程 Process:程序的一次执行过程,是资源分配的基本单位
  • 线程 Thread:是调度的基本单位,比进程更轻量级。同一进程内的线程共享进程的资源

进程同步与互斥

  • 临界资源:一次仅允许一个进程使用的资源
  • 临界区:访问临界资源的程序段
  • 信号量:用于进程间同步与互斥的整型变量
  • P操作(wait):减少信号量值,若结果小于0则阻塞
  • V操作(signal):增加信号量值,唤醒等待进程

在操作系统中,对信号量S的P原语的操作中,使进程进入相应阻塞队列等待的条件是 S < 0。

典型同步问题

  • 生产者-消费者问题:生产者向缓冲区放入数据,消费者从缓冲区取出数据
  • 资源互斥问题:例如独木桥问题,一次只允许一方通过

死锁

死锁是一种现象,指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,这些进程都将永远不能再向前推进。死锁的形成需要四个条件:

  • 互斥条件:资源不能被同时使用
  • 请求和保持条件:进程持有资源的同时请求新资源
  • 不剥夺条件:已分配资源不能被强制剥夺
  • 循环等待条件:形成循环等待链

例如,某系统有3个并发进程竞争资源 R,每个进程都需要5个R,那么至少要几个R,系统才不会发生死锁?

死锁的避免可以通过银行家算法的思想来分析:确保系统在任何时候都能通过合理分配资源让所有进程依次完成,而不会进入死锁状态。最坏情况下,每个进程可能持有最大需求量减 1 的资源并等待最后一个资源,此时系统需要额外的资源来打破可能的循环等待。

每个进程持有 M - 1 = 4 个资源,共占用 3×4=123 \times 4 = 12 个资源。此时,系统需要至少 1 个额外资源(第 13 个资源),以分配给某个进程,使其完成并释放所有资源。

进程调度算法

从就绪的进程队列中选择一个就绪进程,分配处理器,使之投入运行。其目的是最大化 CPU 利用率。

  • 先来先服务调度算法 FCFS
  • 短作业优先 SJF
  • 优先级调度算法 PR
  • 高响应比优先:响应比 = (等待时间+服务时间)/服务时间
  • 时间片轮转:按时间片轮流执行各进程

内存管理

虚拟内存用于扩充物理内存的大小。

请求分页系统

  • 最佳置换算法(OPT):理论上最优但不可实现
  • 先进先出算法(FIFO)
  • 最近最少使用算法(LRU)
  • 最少使用算法(LFU)
  • 时钟算法(CLOCK)

例题

某页式存储管理系统中,页面大小为4KB,地址总线宽度为32位,则内存页数为多少?

  1. 地址总线宽度为32位,意味着可以寻址的物理内存空间为 2322^{32} = 4GB
  2. 每个页面大小为4KB = 4 × 1024 = 4,096 字节
  3. 内存页数 = 总物理内存大小 ÷ 页面大小 = 2202^{20}

一个分页式存储管理系统中,某进程逻辑地址空间由16个4KB的页组成,将它映射到一个2MB的物理内存空间。分析该进程的逻辑地址格式和物理地址格式。

  1. 页面大小 4096字节=2124096字节 = 2^{12},与逻辑页面的偏移量相同,页面框架内偏移量占用 12 位
  2. 有 16 个页面,即 242^4 个页面,需要 4 位表示页面号
  3. 物理内存的页面框架数为 2,097,152÷4096=512 个页面框架,512=29512 = 2^{9},所以需要 9 位表示页面框架号

所以逻辑地址为:

  • 高 4 位:页面号(Page Number),表示 0 到 15 的页面。
  • 低 12 位:页内偏移量(Page Offset),表示页面内 0 到 4095 的字节偏移。

物理地址为:

  • 高 9 位:页面框架号
  • 低 12 位:页面框架偏移(也就是页面大小)

文件系统

文件是具有名称的相关信息的集合,是操作系统中最小的独立数据单位。从用户角度看,引入文件系统的主要目的是实现对文件的按名存取

文件类型

  • 无结构文件(流式文件):字节流文件,没有内部结构
  • 结构化文件:有固定结构的记录集合

文件访问方式

  • 顺序访问:按文件物理顺序访问
  • 随机访问:直接访问文件中任意位置的数据
  • 索引访问:通过索引表确定记录位置

输入/输出系统

I/O 控制方式

  • 程序I/O方式:CPU干预最多
  • 中断控制方式:I/O完成后向CPU发出中断请求
  • DMA方式:直接内存访问,减少CPU干预。现代 Mac 采用了这种方式。
  • 通道控制方式:专门的I/O处理机执行I/O操作

磁盘调度算法

数据在磁盘上的物理地址格式构成字段有柱面号、磁头号和扇区号。

  • 最短寻道时间优先(SSTF):优先访问与当前磁头最近的请求
  • 单向扫描算法(SCAN/电梯算法):磁头单向移动,处理途中的所有请求
  • 周转时间 = 作业完成时间 - 作业到达时间
  • 带权周转时间 = 周转时间 / 实际运行所需的时间

例题

如果现在读/写磁头完成了88号磁道的操作之后,正在53号磁道上执行输入/输出操作,而等待访问者依次要访问的磁道为98,183,37,122,14,124,65,67。试分别按最短寻道时间优先调度(SSTF)和扫描算法列出响应磁道的顺序和磁头移动的总磁道数。

  • 最短寻道时间:每次都查找最近的磁道 53 → 65 → 67
  • 扫描算法:总是往更大的磁道移动,:53 → 65 → 67 → 98 → 122 → 124 → 183 → 37 → 14

C 语言与操作系统

C语言的优美在于它的简洁、控制力、性能、自由历史积淀。它像一门“低级的诗”,用最少的语法表达最强大的功能。它没有 C# 的现代化便利、Go 的并发简洁或 JavaScript 的动态灵活,但它提供了无与伦比的底层控制和性能,让程序员可以直接与机器对话。

C的社区崇尚极致的效率极简主义,这种文化也体现在代码风格中。C程序员倾向于写出紧凑、优雅且高效的代码,追求“用最少的资源做最多的事”。例如,C的标准库函数(如memcpy、strcmp)都以极高的效率和简洁性著称。