基础知识
操作系统(OS)是管理计算机硬件和软件资源的核心软件,负责进程调度、内存管理、文件处理等功能。
进程与线程
进程是程序的执行实例,如运行的浏览器是一个进程。线程是进程内的轻量级单位,可并发执行,如同时下载和播放视频。
同步
是指任务按照顺序依次执行,后一个任务依赖于前一个任务的完成;
异步
是指任务可以并发执行,任务之间没有固定的顺序,互不干扰。
- 独立性
进程是独立运行的单位,它有自己的独立空间和资源。
线程是进程内部的执行单元,虽然它有自己的执行路径,但它不像进程那样完全独立。 - 资源共享
默认情况下,进程之间是相互隔离的,它们不能直接访问彼此的内存空间或其他资源。
线程是共享进程资源的,它们可以方便地访问进程内的资源。 - 开销
创建、切换和销毁进程的开销比较大。
创建、切换和销毁线程的开销比较小。
调度算法
操作系统通过调度算法决定进程执行顺序。调度算法是操作系统用来决定“谁先干活、谁后干活”的方法。想象你家开饭店,有好多顾客(进程或线程)等着吃饭,服务员(CPU)只能一次服务一个,调度算法就是服务员决定“先给谁上菜”的规则。
调度算法的对比
算法 | 规则 | 优点 | 缺点 |
---|---|---|---|
FCFS | 谁先来谁先跑,就像排队买奶茶,按顺序来。 | 简单公平 | 长任务拖后腿 |
SJF | 谁干得快谁先跑,像饭店先给点饮料的顾客服务(1分钟),再给炒菜的(5分钟)。 | 效率高 | 长任务饥饿 |
Round Robin | 每个人轮流跑一小会儿,像饭店服务员每桌送一口菜,循环跑。每次跑的时间叫“时间片”(比如1秒)。 | 公平,多任务好 | 切换开销大 |
Priority | 谁重要谁先跑,像饭店先服务VIP顾客。 | 重要任务优先 | 低优先级饥饿 |
MFQ | 多个队列,每个队列优先级不同,任务可以换队列。跑得快的优先,跑得慢的降级,像饭店先服务快餐顾客,慢餐的往后排。 | 灵活平衡 | 实现复杂 |
**测试开发里关心什么?**
1、响应时间:用户点一下按钮,多久有反应?FCFS可能慢,RR可能快。
2、公平性:所有任务都能跑吗?优先级调度可能让小任务等太久。
3、吞吐量:单位时间干多少活?SJF效率高,但不公平。
4、死锁或饥饿:任务会不会卡住或永远跑不了?测优先级和MFQ时要注意。
5、切换开销:RR时间片太小,CPU老切换,效率低,测切换频率影响。
内存管理
内存管理是操作系统负责管好RAM(随机存取内存)。它就像一个大仓库,程序要跑就得在里面占个地方,内存管理决定“谁放哪儿、怎么放、用完怎么收”。
目标:让内存用得高效(不浪费)、程序跑得顺(不卡)、多个程序能一起跑(不打架)。
为什么重要:内存不够或管不好,程序会崩,系统会慢。
内存管理的任务:
分配
:给程序分块地方跑,比如QQ要200MB,游戏要1GB。回收
:程序不用了,把地方收回来给别人用。保护
:别让QQ偷看游戏的数据。优化
:尽量少浪费空间,别让内存乱七八糟。
常见的内存管理方法
方法 | 怎么分 | 优点 | 缺点 | 测试点 |
---|---|---|---|---|
固定分区 | 固定块 | 简单 | 内部碎片 | 浪费空间 |
动态分区 | 按需分,要多少给多少 | 灵活 | 外部碎片 | 碎片影响 |
分页 | 固定小页 | 无外部碎片 | 内部碎片、管理复杂 | 页面表效率 |
虚拟内存 | 内存+硬盘 | 跑大程序 | 换出慢、颠簸 | 换入换出性能 |
段式 | 按逻辑分段 | 符合程序 | 外部碎片 | 段管理复杂性 |
段页式 | 按逻辑分段再分页 | 符合程序 | 内部碎片(主要)+外部碎片 | 段页管理复杂性 |
内存管理常见问题
1、碎片
- 内部碎片:分块太大,程序用不完(固定分区、页面)。内存分块大小固定,程序用不完就空着。
- 外部碎片:小块空隙拼不出大空间(动态分区、段式)。程序用完释放内存后,留下的空隙不连续。
解决:分页少碎片,压缩内存(把空隙挪一起)。
2、内存泄漏
程序用完不还内存,像借书不还,内存越用越少。
3、页面置换
虚拟内存不够时,挑页面换出去。常用算法: FIFO(先入先出)
:最早进来的先换。LRU(最近最少使用)
:最久没用的换。
文件系统
文件系统是什么?
文件系统是操作系统管理存储设备(像硬盘、U盘)上数据的方法。它负责怎么存文件、找文件、读写文件,就像图书馆的书架和目录,帮你整理和查找书。
常见文件系统
FAT32简单、NTFS安全、ext4稳定、APFS快。
- FAT32(文件分配表)U盘常用FAT32
- NTFS(新科技文件系统)Windows的C盘用NTFS
- ext4(第四代扩展文件系统)Linux常用
- APFS(苹果文件系统)
文件系统中一些概念
1、分区
:硬盘可以分成几块(像C盘、D盘),每块有自己的文件系统。
2、块(Block)
:硬盘分成小格子(比如4KB一个块),文件存在这些格子里。
3、元数据
:记录文件的信息(名字、大小、位置),像书的标签。
4、目录
:文件夹里记着有哪些文件,像书架上的目录表。
文件系统的任务
存储
:把文件放进硬盘,分好位置。命名
:给文件起名字,方便找。组织
:用目录(文件夹)把文件分组,像书架分层。读写
:让程序能打开、改、存文件。保护
:不让别人随便动你的文件。
硬盘和文件系统的关系- 硬盘是“仓库”,存一堆原始数据(0和1)。
- 文件系统是“管理员”,把数据整理成文件和文件夹。
文件系统的关键功能
1、文件存储
:
- 文件分成块存硬盘,块大小(4KB、8KB)影响效率。
- 小文件占一块,大文件占多块。
2、目录结构
: 树形结构
3、权限管理
:控制谁能读、写、执行,像NTFS能设“只读”。
4、日志
:记下每次操作,像日记本,断电也能恢复。
文件存储和内存管理中的存储方式是一样的吗?
相似点
:都分块存(块或页),都有连续和非连续方式,用表管位置。
不同点
:
- 文件存储管硬盘,长期存,有目录和元数据。
- 内存管理管RAM,临时用,靠页表,没目录。
- 文件存储更重连续性,内存管理更重灵活性。
文件存储:像家里的储物柜,东西(文件)分格子(块)放,有标签(元数据)和清单(目录),一直留着。
内存管理:像课桌上的草稿纸,写作业(程序)时用小块纸(页),写完就扔,没标签和清单。
死锁
死锁发生当两个或更多进程相互等待资源,形成循环依赖,如A等待B释放资源,而B等待A。这种情况会导致系统冻结。
死锁产生条件(缺一不可)
1、互斥条件
:资源只能一个人用,像饭店里只有一双筷子,你拿了别人就不能拿。
2、持有并等待
:你拿着一支筷子,还等着另一支,像你有左筷子,等右筷子。
3、不可抢夺
:没人能抢你的筷子,除非你自己放手,像筷子粘手上,别人拿不走。
4、循环等待
:你等我,我等你,绕圈圈,像你拿左筷子等我放右筷子,我拿右筷子等你放左筷子。
没有循环等待,资源请求就不会“卡成圈”,总有人能拿到所有资源,干完活放手,打破僵局。
避免死锁
1、打破互斥
2、不许持有并等待
3、允许抢夺
4、打破循环等待
- 常用算法:银行家算法(系统像银行,检查资源够不够才借给你,确保不会死锁。)
检测死锁
现象:程序没反应,CPU利用率高但没进展
工具:
- 用调试器(GDB)查看线程在等啥
- 画资源分配图,找循环
生产者-消费者问题
什么是生产者-消费者问题?
- 定义:生产者(Producer)生成数据,消费者(Consumer)处理数据,中间有个缓冲区(像仓库),要保证生产和消费平衡,不让仓库溢出(满了)或空闲(没东西)。
- 例子:像饭店厨房(生产者)做菜,服务员(消费者)端菜,中间有个桌子(缓冲区),不能菜堆满桌子,也不能桌子空了没人吃。
- 目标:生产者和消费者同时跑,效率高,不卡住。
怎么发生的?
- 生产太快:生产者塞满缓冲区,溢出,像厨房菜做太多,桌子放不下。
- 消费太慢:消费者拿得慢,缓冲区满,生产者得等。
- 生产太慢:缓冲区空了,消费者没事干,得等。
解决方法
- 用锁和条件变量(同步工具):
- 互斥锁(Mutex):保证一次只有一个人动缓冲区。
- 条件变量:生产者等“缓冲区不满”,消费者等“缓冲区不空”。
- 例子(伪代码):
缓冲区大小 = 10 生产者: 锁住缓冲区 如果满了,等(条件:不满) 放数据 通知消费者(有东西了) 解锁 消费者: 锁住缓冲区 如果空了,等(条件:不空) 拿数据 通知生产者(有空位了) 解锁
I/O管理与假脱机(Spooling)
什么是I/O管理与假脱机?
- I/O管理:操作系统管输入输出设备(像打印机、硬盘),让程序和设备顺畅交流。
- 假脱机(Spooling):把慢速I/O任务放后台,像打印文件时,先存硬盘,打印机慢慢打,不让程序等。
怎么工作?
- 直接I/O:程序直接跟设备打交道,像你自己拿文件去打印机,等它打完。
- Spooling:
- 程序把任务给Spooling系统(存硬盘)。
- Spooling后台管设备,程序不用等。
- 例子:
- 你打印10页Word:
- 没Spooling:等打印机10分钟。
- 有Spooling:文件存硬盘,1秒给你解放,打印机后台跑。
- 你打印10页Word:
优点
- 效率高:程序不等慢设备。
- 多任务:多个程序共用设备。
分布式系统中的死锁检测
什么是分布式系统中的死锁?
- 定义:分布式系统是多个节点(电脑)一起工作,死锁是节点间互相等资源,像A节点等B放锁,B等A放锁。
检测方法
- 资源分配图(Wait-For Graph, WFG):
- 画图:节点和资源连线,谁拿啥、等啥。
- 找圈:有循环就是死锁。
- 例子:
- A→资源2(B拿)→B→资源1(A拿)→A,有圈,死锁。
- 分布式算法:
发起探测
:
– 节点A等资源等太久,觉得自己可能死锁了,发探测消息。[A等B的资源2,只发给B:(A, A, B)。如果广播也能找到节点,但是会浪费网络]
– 消息格式:(发起者, 发送者, 接收者),比如(A, A, B)。传递探测
:收到消息的节点B检查。
– 如果B也在等谁(比如C),把消息传给C,更新为(A, B, C)。
– 如果B不等谁,丢掉消息。检测死锁
:
– 如果消息传回A,比如(A, C, A),说明A→B→C→A有圈,死锁。
– 没传回来,说明没圈。
挑战
- 网络延迟:消息慢,检测不准。
- 一致性:节点状态变快,图可能错。