先来先服务调度算法PHP,操作系统.md

# 第一章初识

## 一、操作系统功能

### 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

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值