×
操作系统教程操作系统的定义和功能操作系统的类型

进程管理

与进程有关的时间操作系统CPU调度操作系统调度算法操作系统FCFS调度操作系统FCFS护航效果操作系统FCFS与开销操作系统最短作业优先(SJF)调度预测SJF进程的CPU突发时间最短剩余时间优先(SRTF)调度算法循环调度算法循环调度算法示例最高响应比下(HRRN)调度最高响应比下(HRRN)调度示例优先级调度非抢占式优先级调度抢先式优先级调度

同步

进程同步简介临界区问题锁定变量机制测试集锁定机制优先级反转开启可变或严格的交替方式感兴趣变量机制帕特森(Peterson)解决方案同步机制无需等待睡眠和唤醒信号量介绍计算信号量的问题计算信号量的问题二进制信号量或互斥量

死锁

死锁简介处理死锁的策略死锁预防避免死锁避免死锁使用RAG进行死锁检测死锁检测和恢复

内存管理

内存管理简介固定分区动态分区压缩(碎片整理)用于动态分区的位图链表动态分区分区算法分页技术分页技术实例二进制地址基础知识物理和逻辑地址空间页表从页表映射到主内存页表项查找最佳页面大小虚拟内存后备缓冲器按需分页转换页表页面替换算法Belady异常分段分页与分段比较分段的分页

文件管理

文件的属性文件上的操作文件访问方法目录结构一级目录两级目录树型结构目录非循环图结构化目录文件系统文件系统结构主引导记录(MBR)磁盘中的数据结构内存中的数据结构目录实现目录实现连续分配链表分配文件分配表索引分配链接索引分配索引节点空闲空间管理磁盘调度

测试集锁定机制


汇编代码中的修改

在锁变量机制中,有时Process读取锁变量的旧值并进入临界区。由于这个原因,多个流程可能会进入临界区。但是,下面第一部分中显示的代码可以用第二部分中显示的代码替换。这不会影响算法,但通过这样做,我们可以设法在一定程度上提供互斥,但不能完全实现。

在更新版本的代码中,Lock的值被加载到本地寄存器R0中,然后锁的值被设置为1

但是,在步骤3中,先前的锁定值(现在存储到R0中)与0进行比较,如果该值为0,则该过程将简单地进入临界区域,否则将通过循环连续执行来等待。

将进程本身立即设置为1的好处是,现在进入临界区的进程携带的锁变量的更新值为1

在它被抢占并重新计划的情况下,它也不会进入临界区,而不管当前锁定变量的值如何,因为它已经知道锁定变量的更新值是什么。

第一部分

1. Load Lock, R0  
2. CMP R0, #0     
3. JNZ step1  
4. store #1, Lock

第二部分

1. Load Lock, R0  
2. Store #1, Lock  
3. CMP R0, #0  
4. JNZ step 1

TSL指令

但是,上述部分提供的解决方案在一定程度上提供了相互排斥,但不能确保互斥将始终存在。临界区可能有多个流程。

在执行第2节中编写的汇编代码的第一条指令之后,如果进程被抢先,该怎么办?在这种情况下,它将携带旧的锁定变量值,并且无论知道锁定变量的当前值,它都将进入临界区域。这可能会使两个进程同时出现在临界区。

要摆脱这个问题,必须确保在加载先前的锁定变量值之前并且在将其设置为1之前不应该发生抢占。如果能够合并前两个说明。

为了解决这个问题,操作系统提供了一个称为测试集锁定(TSL)指令的特殊指令,该指令简单地将锁定变量的值加载到本地寄存器R0中,并将其同时设置为1

首先执行TSL的过程将进入临界区,之后不会进入其他进程,直到第一个进程出来。即使在抢先执行第一个过程的情况下,任何进程都不能执行临界区。

解决方案的汇编代码如下所示。

  1. TSL Lock, R0
  2. CMP R0, #0
  3. JNZ step 1

以四个条件为基础来考察TSL。

相互排斥
在TSL机制中保证相互排斥,因为在设置锁变量之前,进程永远不会被抢占。 只有一个进程可以在特定时间将锁变量看作0,这就是为什么互斥可以保证执行。

进程
根据进程的定义,不想进入临界区的进程不应该阻止其他进程进入进程。 在TSL机制中,进程只有在想要进入临界区时才会执行TSL指令。 如果没有进程不想进入临界区,锁的值将始终为0,因此在TSL中始终保证进程。

有界等待
TSL不保证有限等待。 有些过程可能没有这么长时间。 我们无法预测一个进程,在一段时间之后,它肯定会有机会进入临界区。

架构中立
TSL不提供架构中立。 这取决于硬件平台。 TSL指令由操作系统提供。 有些平台可能不会提供。 因此它不是架构中立的。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)