操作系统实验报告
目录
目录
实验一
一、实验结果
实验二 使用信号量实现进程互斥与同步
一、实验结果
1. 使用信号量实现有限缓冲区的生产者和消费者问题
2. 使用信号量实现读进程具有优先权的读者和写者问题
实验三 死锁和预防
一、实验要求
二、实验内容
三、实验结果
实验四 内存管理
一、实验要求
二、实验内容
三、实验结果
实验五 处理器调度
一、实验要求
二、实验内容
三、实验结果
实验六 文件管理
一、实验要求
二、实验内容
三、实验结果
实验一
一、实验结果
在终端提供的Linux环境下,使用gcc编译器运行程序
结果如下

通过观察输出结果可以看出,在运行过程中首先启动的主进程中依次生成了两个从属性实例。这两个从属性实例在其生命周期内始终处于运行状态,并且在其各自的生命周期中不断输出其运行状态信息。随后,在主进程中分别调用了kill方法终止这两个从属性实例的活动,并最终使得整个程序退出了。
运行结果分析揭示了进程同步机制及其核心概念与实现细节。其中最为关键的是父进程中设置与子进程中执行之间的关系以及父进程中设置对子进程中执行的控制作用。
实验二 使用信号量实现进程互斥与同步
一、实验结果
1. 使用信号量实现有限缓冲区的生产者和消费者问题
在Linux环境下运行gcc编译器以实现对C语言程序的转换为可执行文件(亦即生成exec文件)。
步骤如下:
生成C语言源代码文件:具体来说,生成一个名为生产者与消费者.c的C语言源代码文件,并在其中编写程序代码。
(2)使用GCC编译器编译源代码文件:在终端中输入了以下命令
编译器 gcc 用于执行《操作系统实验》课程中的《生产者与消费者》相关程序的构建与运行
-o program
其中,在使用 -o 选项后生成的 program 是指生成的可执行文件名称。而 producer and consumer.c 是指自定义编写并包含路径信息的源代码文件名和路径。
(3)运行可执行文件:终端中输入了以下命令运行生成的可执行文件:
./program
结果如下

根据实验结果表明, 观察到两个相关联的线程群组均达到了稳定运行的状态. 具体来看, 生产相关的子系统首先进入启动阶段后, 立即生成标号为零号的产品, 并将其存放到指定的缓冲区域的第一站. 接着, 消费相关的子系统通过先进先出的方式进行资源分配, 在每次迭代过程中都会取走当前可获取的所有资源直至资源池完全消耗完毕.
随后由生产者****线程执行任务:将生成的货物依次存入缓存区域。当缓存区域已填满时会进入到等待状态以便寻找下一个可用的空间进而暂停当前的工作流程。当消费者线程处理了一部分货物后缓存区域中剩余的空间将会减少此时主 producer 将被唤醒并重新开始执行任务:将新的货物加入缓存区域直至找到下一个可用的位置再次投入产出循环过程。
在本例中进行分析后发现, 生产者进程总计生成了19件产品, 而消费者进程共计处理了18件产品. 这是因为, 当该系统试图生成第19件产品时, 缓冲区已达到饱和状态; 只有在消费者进程移除部分产品并释放出空闲槽位之后, 生产者进程才得以继续运行. 同时满足以下条件: (一) 当系统试图生成第19件产品前, 缓冲区已满; (二) 当系统试图处理第20件产品前, 缓冲区仍有剩余空间; (三) 当系统试图处理第20件产品后, 缓冲区空间被进一步释放.
2. 使用信号量实现读进程具有优先权的读者和写者问题
操作步骤同1,文件路径如下
/Users/peach/Desktop/操作系统实验/读者写者/读者写者/main.c
Linux环境下使用gcc编译器得到的运行结果如下:

现在对运行结果和执行过程作出一定的分析
初始状态,共有5个读者和2个写者线程,且共享数据的初值为0。
Writer 0 writes: 0
Reader 0 reads: 0
Reader 1 reads: 0
Reader 0 reads: 0
Reader 2 reads: 0
Reader 0 reads: 0
Reader 3 reads: 0
Reader 0 reads: 0
Reader 4 reads: 0
Reader 0 reads: 0
写者线程1开始执行,将共享数据的值改为1,并唤醒所有等待该数据的线程。
Writer 1 writes: 1
读者线程0开始执行,读取到共享数据的值为1,然后释放读者锁。
Reader 0 reads: 1
其余四个读者线程依次获取读者锁,并读取共享数据的值为1后立即释放读者锁
Reader 1 reads: 1
Reader 2 reads: 1
Reader 3 reads: 1
Reader 4 reads: 1
该Write thread 2将启动执行;然而,在此时刻存在Reader thread拥有Reader lock时,则会导致该Write thread必须等待所有Reader thread完成Read operations之后才能开始Write operation;这体现了Reader priority policy
Writer 2 writes: 2
读者线程0开始执行,读取到共享数据的值为2,然后释放读者锁。
Reader 0 reads: 2
其余四个 readers 线程轮流获取读者锁,并依次获取到存储在共享数据中的当前值为 2;随后完成互斥后释回读者锁。
Reader 2 reads: 2
Reader 3 reads: 2
Reader 4 reads: 2
Reader 1 reads: 2
写者线程0开始执行,将共享数据的值改为0,并唤醒所有等待该数据的线程。
Writer 0 writes: 0
读者线程1开始执行,读取到共享数据的值为0,然后释放读者锁。
Reader 1 reads: 0
其余四个读者线程依次获取读者锁,并读取到共享数据的值为零后,在此之后释放 readers locks.
Reader 2 reads: 0
Reader 3 reads: 0
Reader 4 reads: 0
Reader 1 reads: 0
实验三 死锁和预防
一、实验要求
加深对银行家算法的理解。
二、实验内容
给出进程需求矩阵 C、资源向量 R 以及一个进程的申请序列。
采用进程被拒绝启动与资源被拒绝分配(银行家算法)来进行该进程组的执行情况模拟
1. 初始状态没有进程启动
判断进程申请的资源分配情况,并为了更好地分析预分配后的系统状态变化(稳定状态与不稳定状态),当系统处于稳定状态下时,请生成相应的稳定运行序列。
3. 每次进程申请获得批准后, 生成并显示资源分配矩阵 A 和可用资源向量 V。
4. 每次申请情况能够逐步查看; 例如, 在输入一个空格时, 即可继续下一个申请步骤。
三、实验结果
在Linux环境下使用gcc编译器完成本次实验

测试结果如下


序列判断

输入资源需求量

结束运行

实验四 内存管理
一、实验要求
熟悉存储器管理系统的设计方法,加深对所学各种内存管理方案的了解。
二、实验内容
随机生成一个页面访问序列,并列举如下:1、5、3、4、2等。请计算以下几种置换策略对应的缺页数量、缺页率以及命中率。
1. 先进先出算法 FIFO(First In First Out)
2. 最近最少使用算法 LRU(Least Recently Used)
3. 最佳置换算法 OPT(Optimal)
三、实验结果
在Linux环境下使用gcc编译器完成本次实验
1.首先用户输入数据
涉及计算机对进程进行页面管理的数量、执行过程中的页面加载或调用顺序及其规模。

2.分别利用FIFO、LRU、OPT算法进行缺页数、缺页率和命中率的计算。

经分析,运行结果与实际一致。
实验五 处理器调度
一、实验要求
熟悉使用各种单处理器调度(短程调度)的各种算法。
二、实验内容
随机给出一个进程调度实例,如:
| 进程 | 到达时间 | 服务时间 |
|---|---|---|
| A | 0 | 3 |
| B | 2 | 6 |
| C | 4 | 4 |
| D | 6 | 5 |
| E | 8 | 2 |
对系统中的进程运行情况进行模拟,并采用不同的调度算法进行计算:先来先服务(FCFS)、轮转(RR)(q=1)和最短作业优先(SPN),并详细计算各进程的完成时间和响应比等参数的具体数值表现。
三、实验结果
1.在终端提供的Linux环境下使用gcc编译器完成本次实验

2.进行进程初始化

3.选择调度算法
(1)FCFS算法




(2)短进程优先算法



(3)高优先级算法



(4)时间片轮转算法


省略轮转过程……

实验六 文件管理
一、实验要求
熟悉二级存储管理中的文件分配策略。
二、实验内容
考虑一个磁盘块序列:1至500号,在初始状态下所有磁盘块均为空闲状态。每个磁盘块的大小设定为2KB。建议采用位表法或链表法用于管理空闲区域;或者采用基于索引技术和空闲列表的方法来组织可用空间。针对基于分片的索引分配策略,请详细说明以下操作流程:
按一定范围(2千至1万)随机生成50份文件,并将这些数据按照所述算法保存于模拟硬盘介质中
2. 删除奇数.txt(1.txt 、3.txt 、 …… 、49.txt)文件
第4步:新建5个文件目录(A、B、C、D和E),它们分别具有7千字节至9千字节的大小,并根据步骤1所述的方法被存储至模拟硬盘介质中
4. 给出文件 A.txt 、B.txt 、C.txt 、D.txt 、E.txt 的文件分配表和空闲区块的状态。
三、实验结果
在终端提供的Linux环境下使用gcc编译器运行程序

运行结果如下


文件分配

