为什么要学操作系统
几乎所有的互联网相关的知识都建立在操作系统之上。它是非常保值的知识。
计算机网络、操作系统和数据库,是在个人学习方面,投资收益率最高的三类技术。第一,它们是计算机世界的水电煤,它们被应用在几乎每个角落,很多上层应用实际上只是这些技术的组合;第二,这些技术的保质期非常长,能让你一次学习终身受益,几乎没有知识失效的风险。
操作系统基础
操作系统是计算机系统的核心软件,是管理计算机硬件与软件资源的程序,同时也是控制程序的执行和资源分配的管理者。操作系统具有以下基本特征:
- 并发性:多个程序同时执行
- 共享性:多个程序共享系统资源
- 虚拟性:将物理资源变为逻辑资源,拓展资源能力
- 异步性:进程以不可预知的速度推进,呈"走走停停"特征
历史
操作系统的发展经历了几个时期:
-
手工操作阶段:无操作系统,程序员直接操作计算机
-
批处理系统:
- 单道批处理:一次只执行一个作业
- 多道批处理:内存中同时存在多个作业,CPU在它们之间切换
- 分时系统:多个用户同时共享计算机资源,每个用户有专用终端
- 个人计算机操作系统:面向单用户的系统(如DOS, Windows, MacOS)
- 网络操作系统和分布式操作系统:支持网络环境下的资源共享和通信
- 实时操作系统:对时间有严格要求,用于工业控制等场景
- 嵌入式操作系统:运行在嵌入式设备上的轻量级系统
- 移动操作系统:为移动设备设计的系统(如Android, iOS)
进程管理
进程与线程
- 进程 Process:程序的一次执行过程,是资源分配的基本单位
- 线程 Thread:是调度的基本单位,比进程更轻量级。同一进程内的线程共享进程的资源
进程同步与互斥
- 临界资源:一次仅允许一个进程使用的资源
- 临界区:访问临界资源的程序段
- 信号量:用于进程间同步与互斥的整型变量
- P操作(wait):减少信号量值,若结果小于0则阻塞
- V操作(signal):增加信号量值,唤醒等待进程
在操作系统中,对信号量S的P原语的操作中,使进程进入相应阻塞队列等待的条件是 S < 0。
典型同步问题
- 生产者-消费者问题:生产者向缓冲区放入数据,消费者从缓冲区取出数据
- 资源互斥问题:例如独木桥问题,一次只允许一方通过
死锁
死锁是一种现象,指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,这些进程都将永远不能再向前推进。死锁的形成需要四个条件:
- 互斥条件:资源不能被同时使用
- 请求和保持条件:进程持有资源的同时请求新资源
- 不剥夺条件:已分配资源不能被强制剥夺
- 循环等待条件:形成循环等待链
例如,某系统有3个并发进程竞争资源 R,每个进程都需要5个R,那么至少要几个R,系统才不会发生死锁?
死锁的避免可以通过银行家算法的思想来分析:确保系统在任何时候都能通过合理分配资源让所有进程依次完成,而不会进入死锁状态。最坏情况下,每个进程可能持有最大需求量减 1 的资源并等待最后一个资源,此时系统需要额外的资源来打破可能的循环等待。
每个进程持有 M - 1 = 4 个资源,共占用 个资源。此时,系统需要至少 1 个额外资源(第 13 个资源),以分配给某个进程,使其完成并释放所有资源。
进程调度算法
从就绪的进程队列中选择一个就绪进程,分配处理器,使之投入运行。其目的是最大化 CPU 利用率。
- 先来先服务调度算法 FCFS
- 短作业优先 SJF
- 优先级调度算法 PR
- 高响应比优先:响应比 = (等待时间+服务时间)/服务时间
- 时间片轮转:按时间片轮流执行各进程
内存管理
虚拟内存用于扩充物理内存的大小。
请求分页系统
- 最佳置换算法(OPT):理论上最优但不可实现
- 先进先出算法(FIFO)
- 最近最少使用算法(LRU)
- 最少使用算法(LFU)
- 时钟算法(CLOCK)
例题
某页式存储管理系统中,页面大小为4KB,地址总线宽度为32位,则内存页数为多少?
- 地址总线宽度为32位,意味着可以寻址的物理内存空间为 = 4GB
- 每个页面大小为4KB = 4 × 1024 = 4,096 字节
- 内存页数 = 总物理内存大小 ÷ 页面大小 =
一个分页式存储管理系统中,某进程逻辑地址空间由16个4KB的页组成,将它映射到一个2MB的物理内存空间。分析该进程的逻辑地址格式和物理地址格式。
- 页面大小 ,与逻辑页面的偏移量相同,页面框架内偏移量占用 12 位
- 有 16 个页面,即 个页面,需要 4 位表示页面号
- 物理内存的页面框架数为 2,097,152÷4096=512 个页面框架,,所以需要 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)都以极高的效率和简洁性著称。