# 第一章初识
## 一、操作系统功能
### 1.进程管理(cpu管理)
+ 进程控制:创建、暂停、唤醒、撤销;
+ 进程调度:调度策略,优先级;
+ 进程通信:进程之间的通信
### 2.内存管理
+ 内存分配
+ 内存共享
+ 内存保护
### 3.设备管理
+ 设备的分配和调度
+ 设备无关性作
+ 设备传输控制
+ 设备驱动
### 4.文件管理
+ 存储空间管理
+ 文件操作
+ 目录操作
+ 文件和目录的存取管理
### 5.网络管理,分布式管理,图形界面管理...
## 二、定义
**操作系统是个大型的系统程序**
+ 提供用户**接口**,方便用户控制计算机
+ 负责为应用程序**分配和调度软硬件资源**,控制与协调应用程序并发活动,帮助用户存储和保护信息
## 三、分时技术与分时操作系统
### 1.中断技术和通道技术
**中断技术**:CPU收到外部**中断信号**后,停止当前工作,转去执行该**外部事件**,处理完后又回到原来的断点继续工作
**通道技术**:处理外设与内存之间的**数据传输**的处理机
### 2.分时操作系统背景
+ 事务性任务的涌现(大量的运算)
+ 交互性高
+ 响应迅速
### 3.网络操作系统
+ 普通操作系统+网络通信+网络服务
+ UNIX / LINUX / WINDOWS
### 4.网络操作系统的功能
+ 透明存取
+ 存取控制
# 第二章操作系统逻辑结构
## 一、逻辑结构
OS的设计和实现思路
### 1.逻辑结构的种类
+ 整体式结构
+ 层次式结构
+ 微内核结构(客户/服务器,client/server)
### 2.整体式结构
模块化
**特点**
+ 模块设计、编码和调试独立
+ 模块调用自由
+ 模块通信多以全局变量
**缺点**
+ 信息传递随意,维护更新困难
### 3.微内核结构
OS = 微内核+核外服务器
**微内核**
足够小,提供OS最基本的核心功能和服务
+ 实现与硬件相关的紧密处理
+ 实现一些最基本功能
+ 负责客户和服务器间的通信
**核外服务器**
完成OS的绝大部分服务,等待应用程序提出请求
由多个服务器或进程共同组成
+ 进程/线程服务器,设备管理服务器,以进程形式运行在用户态
## 二、CPU的态
CPU的工作状态
### **1.态的分类:**
1.内核态
+ 能够访问所有的资源和执行所有的指令(汇编)
+ 管理程序/OS内核
2.用户态
+ 仅能访问部分资源,其他资源受限
+ 用户程序
### 2.态的转换
1.用户——》核态
+ 用户请求OS提供服务
+ 发生中断
+ 用户进程产生错误
+ 用户请求特权指令
2.核态——》用户
+ 执行中断返回
## 三、中断
现场(上下文):程序正确运行所依赖的信息集合
现场的两个处理过程
+ 现场的保护:进入中断服务程序之前,会把上下文的信息保存到栈里面
+ 现场恢复:退出中断服务后,会把栈里的数据信息pop出来
# 第四章进程管理
## 一、进程的概念
### 1.概念
描述和管理程序的"运行过程"——进程
**进程的定义:**
+ **进程是程序在某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单元**
+ 数据集合:软/硬件环境,多个进程共享/共存的环境
**进程的特征:**
+ 动态性:进程是程序的一次执行过程,动态产生/消亡
+ 并发性:多个进程一起向前推进
+ 异步性:按各自速度向前推进
+ 独立性:进程是系统分配资源和调度CPU的单位(线程)
**进程与程序区别:**
+ 动态与静态:
进程是动态的:程序的一次执行过程
程序是静态的:一组代码
+ 暂存与长存的:
进程是暂存的:在内存中驻留
程序是长存的:在介质(磁盘空间)上长期保存
+ 对应关系
一个程序可以有多个进程
**进程的类型:**
+ 按使用资源的权限
系统进程:系统内核相关的进程
用户进程:运行于用户态
### 2.状态
运行:占有CPU
就绪:具备运行条件,但没有占用CPU
阻塞:等待某项服务完成或信号不能运行的状态,系统调用,I/O操作,合作进程信号
就绪——》运行:进程调度
运行——》就绪:时间片到,CPU被抢占
运行——》阻塞:请求服务,等待信号
阻塞——》就绪:服务完成,信号到来
### 3.Linux进程的状态
1. 可运行态:就绪、运行
2. 阻塞(等待)态:
深度阻塞:不能被唤醒
浅度阻塞:能被唤醒
3. 僵死态:
进程终止执行,释放大部分资源
4. 挂起态:
进程被挂起
![](/新建文件夹/校招/笔记图/Linux进程状态.png)
Linux操作系统调用fork()函数创建新进程,do_exit()释放进程
### 4.进程控制块PCB(Process Control Block)
+ 描述进程状态、资源、和与相关进程关系的**数据结构**(c:struct)
+ PCB是进程的标志
+ 进程创建时创建PCB;进程撤销后PCB同时撤销
### 5.进程的切换
**进程的上下文**
+ Context,进程运行环境,CPU环境
**进程切换过程**
+ 换入进程的上下文进入CPU(从栈上来)
+ 换出进程的上下文离开CPU(到栈上去)
## 二、进程控制
### 1.创建进程
**过程:**
+ 创建一个空白的PCB
+ 获得并赋予进程标识符ID
+ 为进程分配空间
+ 初始化PCB
+ 插入想应的进程队列
放入就绪队列
### 2.进程撤销
**过程:**
+ 在PCB队列中检索出改PCB
+ 获取该进程的状态
+ 如果是运行态,立即终止该进程
【递归】检查是否有子进程,先“撤销”子进程
+ 释放进程占有的资源
+ 将进程的PCB从PCB队列中移除
### 3.进程阻塞
+ 请求系统服务(OS不能立即满足)
+ 遇到I/O
+ 新数据尚未到达
+ 无新工作可做
### 4.Linux进程控制
创建进程——fork()
```c
pid_t fork(void);
pid_t pid = fork();
/*pid_t = int*/
```
新建进程是当前进程的子进程,主进程调用fork()创建子进程
fork()函数的实现
```c
```
**进程执行与父进程不同的功能**
exec函数簇(包括若干函数)
+ 功能:
装入一个指定的可执行程序运行
使子进程具有和父进程完全不同的新功能
+ 步骤:
1.根据文件名找到相应的可执行程序
2.将可执行程序的内容填入子进程的地址空间
3.进入新进程执行且不再返回
## 三、线程***
### 1.线程的概念
1. 线程是可以由CPU直接运行的实体,进程中执行运算的最小单位;
2. 一个进程可创建多个线程,一个线程可以与同进程下其它线程共享进程所有的全部资源
3. 多个线程共享CPU可实现并发
**单线程程序:**整个进程只有一个线程
**多线程程序:**整个进程有至少2个线程程。主线程和至少1个用户线程
### 2.线程应用场景
+ 程序多个功能并发运行
+ 提高窗口交互性
+ 需要改善结构的地方
+ 多核CPU上的应用,充分发挥多核性能(并行)
**Linux创建线程:**pthread_create(线程函数, 参数)
## 四、临界区和锁
### 1.临界资源与临界区
**临界资源**:一次只允许一个进程独占访问(使用)的资源
**临界区**:进程中访问临界资源的程序段
**设计临界区访问机制的四个原则:**
1. 忙则等待:临界区忙时,其他进程在临界区外等待
2. 空闲让进:无进程处于临界区时,任何有权进程都可以进入
3. 有限等待:进程进入临界区的请求应在有限时间内得到满足
4. 让全等待:等待进程放弃CPU
## 五、同步和P-V操作***
### 1.同步和互斥的概念
**进程同步:**
若干合作进程完成同一个任务,一个进程开始某个操作之前另一个进程必须已经完成了这个操作,否则只能等待
互斥是一种特殊的同步关系
### 2.P-V操作概念
#### 1.信号灯(信号量)
一种进程同步机制
进程在运行过程受信号灯状态控制,并能改变信号灯状态
**信号灯数据结构:**
+ 信号灯定义为一个二元矢量(S, q)
+ S:整数,初值非负(又称信号量)
+ q:PCB队列,初值为空
**信号灯的操作:**
+ P操作(函数或过程,P(S, q)) 通过 S -= 1
+ V操作(函数或过程,V(S, p)) 释放 S += 1
**P-V操作解决互斥问题**
S表示可用资源数量,执行一次**P操作**意味着请求资源,S -= 1,若S >= 0该进程继续执行
S < 0时表示已没有可用资源,S的绝对值代表等待该资源的进程数
当进程使用完资源后执行**V操作**,若此时S<=0表示还有进程等待该资源,因此唤醒一个等待状态下的进程
**P-V操作解决同步问题**
#### 2.生产者消费者问题:
一群生产者向一群消费者提供产品(数据),共享缓冲区。
规则:
1.不能向满缓冲区存产品
2.不能向空缓冲区取产品
3.每个时刻只允许一个生产者或消费者存或取一个产品
![](/新建文件夹/校招/笔记图/P-V操作在生产者消费者模型中的运用.png)
生产者生产数据之前,执行P(empty)操作,消费者去完数据之后执行V(empty)操作
消费者取数据之前执行P(full)操作,生产者生产完数据之后执行V(full)操作
在生产者和消费之执行操作之前都执行P(mutex)操作,之后都执行V(mutex)操作,保正同一时刻只有一个生产者或消费者在存取数据,实现互斥
## 六、Windows和Linux同步机制***
### 1.Windows实现同步机制
#### 1.临界区()
在进程内使用,保证仅一个线程可以申请到该对象
临界区内是临界资源的访问
#### 2.信号量(Semamphore)
允许指定数目的多个线程/进程访问临界区
一种资源计数器,限制并发的线程数量
## 七、进程通信***
### 1.Linux信号通信
+ 信号时Linux进程间一种重要的通信机制
+ 信号是进程发送的一个通知,通知某个事件已发生
+ 收到信号的进程可以立即执行指定操作
+ 信号的发出方可以是进程,也可以是系统
**信号来源**:
1. 键盘输入特殊组合键产生信号,例如’ctrl + c‘
2. 执行终端命令产生信号,例:cd
3. 查询中调用函数产生信号,例:kill(), abort()
4. 硬件异常或内核产生相应信号,例:内存访问出错
**Linux定义了64种信号,信号用整数1-64表示**
# 第五章死锁
## 一、概念
**定义:**
+ 两个或多个进程无限期的等待永远不会发生的条件的一种系统状态
+ 两个或多个进程中,每个进程都持有某种资源,但又继续申请其它进程所持有的资源,此时所申请的资源信号量不足,所以每个进程都处于阻塞状态,这种状态称为死锁
例:有a,b两种资源,并且信号量都为1,进程A拥有a资源,B拥有b资源,A想请求b资源,B想请求a资源,两种资源的信号量不足,所以两个进程都阻塞,造成死锁
## 二、死锁起因
### 1.资源有限
资源数目不足,进程对资源的竞争而产生死锁
### 2.并发进程推进顺序不当
进程请求资源和释放资源的顺序不当
## 三、解决死锁
### 1.死锁必要条件
+ 1.互斥条件:进程互斥使用资源,资源具有独占性
+ 2.不剥夺条件:进程在访问完资源之前不能被其它进程强行剥夺
+ 3.部分分配条件:进程边运行边申请资源,临时需要临时分配
+ 4.环路条件:多个进程构成环路,每个进程占用的资源被前一个进程申请,自己所申请的资源又被后一个进程占用着
### 2.解决
破坏条件1(难,某些资源的物理属性就是排他性的)
破坏条件2(代价大,容易造成其它进程崩溃)
破坏条件3(预先静态分配)
破坏条件4(有序资源分配)
**预先静态分配法:**
特点:
+ 执行可能被延迟:所需资源不能全部满足时。
+ 应用开销增大:运行前估算资源需求。
+ 资源利用率低:资源被占而不用。
**有序资源分配法:**
目的:破坏环路条件,使得环路无法构成。
策略:
+ 系统中的每个资源分配有唯一序号
+ 进程每次申请资源时只能申请序号更大的资源
如果进程已占有序号为M的资源,则下次只能申请序号大于M的资源
windows和linux都没有有效的解决死锁的机制,操作系统默认不会发生死锁,死锁发生由用户来处理
# 第六章进程调度****
## 一、概念
在合适的时候以一定的策略选择一个就绪的进程运行
### 1.调度时机
### 2.调度策略
### 3.调度目标
1. 响应速度尽可能快
2. 进程处理时间尽可能短
3. 系统吞吐量尽可能大
4. 资源利用率尽可能高
5. 对所有进程要公平
6. 避免饥饿(指一个进程长时间得不到调度,得不到资源)
7. 避免死锁
以上目标部分存在原则上的矛盾,很难兼顾
**两个可以量化的指标:**
+ 周转时间/平均周转时间
进程提交给计算机到最终完成所花费的时间(t),t = t.start(提交时间) - t.complete(完成时间)
说明进程在系统中停留的时间的长短
平均周转时间越小,系统吞吐量越大,资源利用率也越高
+ 带权周转时间/平均带权周转时间
w = t(进程的周转时间)/t.r(进程的运行时间)
进程在系统中的相对听留时间
## 二、调度算法
### 1.先来先服务调度(First Come First Serve)
+ 算法
按照作业进入系统的时间的先后顺序来挑选作业。先来先运行
+ 特点
容易实现,效率不高
只考虑了**等候时间**,没考虑**运行时间**。一个后来的很短的作业可能需要等待很长时间,**不利于短作业**
### 2.短作业优先调度算法(Short Job First)
+ 算法
参考运行时间,选取运行时间最短的作业投入运行
+ 特点
易于实现,效率不高
忽视了作业**等待时间**,一个早来的长作业可能会很晚被调度,易出现资源的饥饿现象
### 3.响应比高者优先调度算法
+ 响应比定义
作业的响应时间与运行时间的比值,响应时间=等待时间+运行时间
+ 算法
计算每个响应比,选择响应比最高的作业优先投入运行
+ 特点
如果作业等待时间相同,则运行时间越短的作业,其响应比越高,因此越容易被调度。有利于短作业
如果作业运行时间相同,则等的越久的作业,响应比越高,因此越容易被调度。有利于等侯长的作业
对于运行时间长的作业,其优先级随等待时间的增加而提高,当等待足够久时,能获得cpu
### 4.优先数调度算法
+ 算法
根据进程优先数,把CPU分配给最高的进程
进程优先数 = 静态优先数 + 动态优先数
+ 静态优先数
进程创建时确定,整个进程运行期间不再改变
+ 动态优先数
可以在进程运行期间发生改变
**静态优先数的相关**
+ 基于进程所需的资源多少
+ 基于程序运行时间的长短
+ 基于进程的类型[IO/CPU,前台/后台,核心/用户]
**动态优先数相关**
+ 使用CPU超过一定时上
+ 进行I/O操作后
+ 当进程等待超过一段时间后
### 5.循环轮转调度算法(ROUND-ROBIN)
**概念:**
1. 把所有就绪进程按**先进先出**排成队列
2. 进程以时间片为单位轮流使用CPU。运行完时间片之后,把进程加入队列末尾
**优点:**
+ 公平性:每个进程有平等机会获得CPU
+ 交互性:每个进程等待(N - 1)* q的时间就能重新获得CPU
N:队列中进程数,q:时间片
**时间片q的大小**
+ 太大:会退化为FCFS调度算法
+ 太小:进程切换频繁,系统开销增加
**改进**
+ 时间片大小可变
+ 组织多个就绪队列
## 三、Linux进程调度
### 1.Linux进程类型
**普通进程**
+ 采用动态优先级调度
+ 调度程序周期性地修改优先级(避免饥饿)
**实时进程**
+ 采用静态优先级来调度
+ 由用户预先指定,以后不会改变
### 2.Linux进程的优先级
**静态优先级**
+ 进程创建时指定或由用户修改
**动态优先级**
+ 在进程运行期间可以按调度策略改变
+ 非实时进程采用动态优先级,由调度程序计算
+ 只要进程占用CPU,优先级就随时间流失而不断减小
+ task_struct的counter表示动态优先级
![](/新建文件夹/校招/笔记图/Linux调度策略.png)
**实时进程**
+ SCHED_FIFO(先进先出)
当前实时进程一直占用CPU直至退出或阻塞或被抢占
再就绪时就会被添加到同优先级队列的末尾
+ SCHED_RR(时间片轮转)
与其它实时进程以Round-Robin方式共同使用CPU
确保同优先级的多个进程能共享CPU
**非实时进程(普通进程)**
+ SCHED_OTHER(动态优先级)
+ counter成员表示动态优先
**调度策略的改变**
+ 系统调用sched_setscheduler()改变调度策略
+ 实时进程的子孙进程也是实时进程
一键复制
编辑
Web IDE
原始数据
按行查看
历史