标签搜索

操作系统理论

wehg489
2026-02-04 / 0 评论 / 5 阅读 / 正在检测是否收录...

一、进程的引入:为什么需要进程?
问题背景:早期计算机一次只能运行一个程序。比如,你有一个计算程序和一个下载程序,你想边计算边下载,怎么办?

解决方案:引入进程的概念,让多个程序可以“同时”运行。实际上,在单核CPU上,是通过快速切换来实现的,但给用户的感觉是同时运行。

例子:你打开音乐播放器听歌,同时用浏览器上网。操作系统为每个程序创建了一个进程,并轮流执行它们(时间片轮转)。虽然CPU同一时刻只能执行一个进程,但由于切换很快,你感觉音乐和网页同时都在运行。

二、进程是什么?
具体例子:想象一个厨房(CPU)里有一个厨师(进程)。厨师要做一道菜(程序),他需要菜谱(代码)、食材(数据)、厨具(资源)。菜谱指明了步骤,但厨师在切菜的时候可能被叫去炒菜(切换),那么他必须记住切到哪了(保存现场),等他回来再接着切。

进程的定义:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。它包括代码、数据、程序计数器、寄存器、堆栈等。

三、进程的状态与切换
面对的问题:进程在运行中,有时需要等待外部事件(比如等待用户输入、等待磁盘读取数据),如果让CPU一直等待,就浪费了。如何提高CPU利用率?

解决办法:让进程在等待时让出CPU,给其他就绪的进程使用。这就引入了进程状态。

例子:假设有两个进程A和B。A需要从磁盘读取数据,于是操作系统将A的状态改为“阻塞”,并让B运行。当磁盘数据准备好后,再将A的状态改为“就绪”,等待CPU调度。

典型的状态转换:

就绪:进程已准备好,只等CPU。
运行:进程正在CPU上执行。
阻塞:进程等待某个事件(如I/O完成)。
状态转换图:

新建 → 就绪 ↔ 运行 → 终止
              ↓
             阻塞

四、进程的创建与终止
创建:通过系统调用(如fork)创建新进程。

例子:在Linux终端中,你输入ls命令,shell进程会调用fork创建一个子进程,然后子进程调用exec执行ls程序。

终止:进程完成任务后,通过exit系统调用终止,释放资源(除了进程控制块PCB,最后会被父进程回收)。

五、进程间通信(IPC)
问题:进程之间是隔离的,不能直接访问对方的内存。但如果需要协作,比如一个进程生产数据,另一个进程消费数据,怎么办?

解决办法:操作系统提供进程间通信的机制。

具体例子:

管道(pipe):就像一条水管,一端写,另一端读。例如,在shell中执行ls | grep .txt,shell创建两个进程,一个执行ls,一个执行grep,并用管道连接起来。ls的输出直接作为grep的输入。

消息队列:进程A发送一个消息到队列,进程B从队列中读取。类似于发邮件。

共享内存:两个进程可以访问同一块内存区域。这是最快的IPC方式,但需要同步机制(如信号量)来避免冲突。

信号(signal):一个进程可以向另一个进程发送信号,比如按下Ctrl+C发送SIGINT信号终止进程。

六、进程同步
问题:当多个进程共享资源(比如共享内存、文件)时,可能会产生冲突。

例子:有两个进程A和B,它们都要往同一个文件里写数据。如果A写了一半,B也开始写,那么文件内容就会混乱。

解决办法:使用同步机制,确保同一时刻只有一个进程访问共享资源。

具体方法:

互斥锁(Mutex):进程在访问共享资源前加锁,访问完后解锁。其他进程必须等待锁释放。

信号量(Semaphore):一个计数器,用来控制多个进程对共享资源的访问。比如,只有3个资源,信号量初始值为3,每有一个进程占用一个资源,信号量减1,当减到0时,其他进程必须等待。

条件变量:用于等待某个条件成立。

七、进程调度
问题:有多个就绪进程,但CPU只有一个,先运行哪个?

调度算法例子:

先来先服务(FCFS):就像排队买票,先来的先服务。但如果有长进程先到,短进程就要等很久。

短作业优先(SJF):优先运行估计运行时间最短的进程。这可以减少平均等待时间,但长进程可能一直得不到运行(饥饿)。

时间片轮转(RR):每个进程分配一个时间片(比如100ms),时间片用完后,进程被剥夺CPU,放到就绪队列末尾。这样每个进程都能得到执行,但上下文切换开销较大。

多级反馈队列:结合了多种算法。有多个队列,每个队列优先级不同,时间片大小也不同。新进程进入最高优先级队列,如果时间片用完还没结束,就降到下一级队列。这样短进程可以很快完成,长进程也会得到执行。

八、上下文切换
问题:当CPU从一个进程切换到另一个进程时,需要保存当前进程的状态,以便下次恢复。

例子:进程A正在运行,时间片用完,操作系统要切换到进程B。那么,操作系统必须保存A的寄存器、程序计数器等状态到A的PCB中,然后从B的PCB中恢复B的状态,让B继续运行。

开销:上下文切换需要时间,如果切换太频繁,CPU的有效工作时间就会减少。

九、多线程与进程的关系
问题:进程的创建、切换开销较大,而且进程间通信复杂。如果我们要在一个程序内同时做多件事,比如一个文档编辑器,一边接收用户输入,一边自动保存,一边进行拼写检查,怎么办?

解决办法:引入线程。线程是进程内的执行单元,一个进程可以有多个线程,它们共享进程的资源(如内存、文件),但各自有独立的栈和寄存器。

例子:一个Web服务器,每来一个客户端请求,就创建一个线程来处理。这样,多个请求可以同时被处理(在多核CPU上真正并行,单核上也是并发)。因为线程共享进程的内存,所以创建线程和线程间通信的开销比进程小。

十、总结
进程是操作系统资源分配的基本单位,它使得多个程序可以并发执行,提高了系统资源的利用率。但进程的创建、切换、通信都有开销,因此后来又引入了线程。理解进程的关键是理解它的状态转换、调度、同步和通信机制,这些都是为了解决多任务环境下的资源竞争和协作问题。

虚拟存储管理系统的基础是程序的局部性理论,这个理论的基本含义是指程序执行时往往不会均匀地访问主存储器单元。根据这个理论,Denning 提出了工作集理论。工作集是进程运行时被频繁访问的页面集合。在进程运行时,如果它的工作集页面都在主存储器(内存)内,能够使该进程有效地运行,否则会出现频繁的页面调入/调出现象。

进程通信PV操作与信号量核心知识点总结

初值=0 意味着初始状态没有任何可用资源,事件未发生,必须等待通知
P操作 就像"瞅一眼桌子",发现没饭就睡觉(进程阻塞)
V操作 就像"外卖员按门铃",把你叫醒继续执行(进程唤醒)
原子性保证:

// 假设S=1,两辆车同时P操作
车A: 读取S=1  → S--=0  → 进入停车场
车B: 读取S=1  → S--=0  → 也进入停车场 ❌
// 结果:一个车位停两辆车!碰撞!

正确顺序:先P资源信号量,再P互斥信号量
原理:如果先拿锁,当资源耗尽时,其他进程无法进入临界区释放资源,形成死锁

初值=1:商场厕所(互斥访问)场景:只有一间厕所,拉屎要排队
数据库行锁:1个线程修改,其他线程阻塞
打印机互斥:1个人打印,其他人排队
技术映射:保护临界区,一次只允许一个进程访问

初值=N:停车场(资源池)场景:10个车位,先到先得
图书馆座位:初值=500个座位
数据库连接池:初值=5个连接
线程池任务队列:初值=100个任务容量

资源申请顺序不一致

Process1 { P(A); P(B); ... V(B); V(A); }  // 先A后B
Process2 { P(B); P(A); ... V(A); V(B); }  // ❌ 先B后A
// 结果:Process1占A等B,Process2占B等A → **死锁!**

正确:全局统一起始顺序

Process1 { P(A); P(B); ... }
Process2 { P(A); P(B); ... }  // ✅ 顺序一致

信号量负值理解错误
题目:3个进程共享1台打印机,信号量初值=1,当前值=-2,问什么情况?
❌ 错误答案:有2台打印机空闲(完全错误!)
✅ 正确答案:2个进程在等待打印机(|-2|=2)

编写PV操作(黄金顺序)

Process {
    准备工作;
    P(资源信号量);      // 1️⃣ 先检查资源是否可用
    P(互斥信号量);      // 2️⃣ 再进入临界区(上锁)
    操作共享资源;       // 3️⃣ 临界区代码
    V(互斥信号量);      // 4️⃣ 先出临界区(解锁)
    V(通知信号量);      // 5️⃣ 再通知其他进程
    后续操作;
}

📌 初值选择:互斥用1,同步用0,资源就是N
📌 PV本质:P是申请,不够就等;V是释放,唤醒他人
📌 操作顺序:先资源后锁,先解锁后通知
📌 信号量值:正数可用,零刚好用,负数等几
📌 死锁避免:统一申请顺序,限制最大并发

进程调度知识点

进程调度本质
核心问题:CPU只有一个,成百上千个进程要运行,按什么顺序执行?
生活类比:餐厅只有一个厨师,怎么安排炒菜顺序才能让顾客最满意?
ml96exfh.png

现实操作系统应用
Linux CFS调度器
核心理念:完全公平调度(Completely Fair Scheduler)
关键技术:红黑树管理进程,按虚拟运行时间vruntime排序
计算公式:vruntime = 实际时间 × (NICE_0_LOAD / 权重)
调度周期:所有进程至少运行一次的时间
生活类比:班级轮流发言,说话时间短的人优先

Windows调度器
32级优先级:0-31,0为最低
动态调整:前台窗口线程+2,I/O操作后+1
实时优先级:16-31级(需管理员权限

实时系统调度
硬实时 必须准时完成 最早截止时间优先(EDF)
软实时 偶尔超时允许 速率单调调度(RMS)
案例:导弹控制→EDF算法;视频播放器→RMS算法

进程调度就是CPU的"交通警察":
FCFS是排队,SJF是绿色通道,RR是轮流执政,
多级反馈是智能交通系统,最终目标——让所有"车辆"都满意!

动态分区内存管理中的空闲分区合并(或合并自由块)
在动态分区分配方式中,当进程运行结束释放内存时,系统会将其占用的分区回收,并检查该分区是否与相邻的空闲分区相邻(地址连续)。如果回收区与上方和下方的空闲区都相邻,则系统会将这三个分区合并为一个更大的空闲分区,从而导致空闲区总数减少1。此过程旨在减少外部碎片,提高内存利用率。

要保证系统中 6 个并发进程(每个进程都需要 2 个互斥资源 R)不发生死锁,资源 R 的最少数目为 7。

推导过程:
在最坏情况下,每个进程都已获得 1 个资源,同时还需要 1 个资源才能继续执行。此时如果系统中只剩 1 个可用资源,则可分配给任意一个进程,使其满足全部资源需求并运行完毕,之后释放的资源又能供其他进程使用,从而避免死锁。
因此,最少资源数 = 进程数 × (每个进程所需资源数 - 1) + 1 = 6 × (2 - 1) + 1 = 7。

0

评论 (0)

取消
歌曲封面
0:00