发布时间 : 星期五 文章操作系统实验题目及实验报告要求 - 图文更新完毕开始阅读a671c7375a8102d276a22f1e
图4-3 生产者和消费者程序
初始化程序:模拟实验的程序从初始化程序入口启动,初始化工作包括对信号量S1、S2赋初值,对生产者、消费者进程的PCB初始化。初始化后转向处理器调度程序,其流程如图4-4
处理器调度程序:在计算机系统中,进程并发执行时,任一进程占用处理器执行完一条指令后就有可能被打断而让出处理器由其他进程运行。故在模拟系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它成为非运行状态,由处理器调度程序按随机数再选择一个就绪进程占用处理器运行。处理器调度程序流程见图4-5。
开始
初始化信号量S1,S2 S1:=10,S2:=0 生产者和消费者进程的PCB中状态为就绪,断点为0 将现行进程置为生产者进程,PC:=0 处理器调度程序 结束 图 4-4 初始化流程
模拟处理器指令执行程序:按“指令计数器”PC之值执行指定的质量,且PC加1指向下一条指令。模拟处理器指令执行的程序流程见图4-6和4-7。
另外,为了使得模拟程序有一个结束条件,在图4-6中附加了“生产者运行结束”的条件判断,模拟时可以采取人工选择的方法实现。图4-7给出了P(S)和V(S)模拟指令执行过程的流程。其他模拟指令的执行过程已在图4-2中指出。
四、实验报告
(1) 实验题目。
(2) 打印源程序并附上注释。
(3) 从键盘上输入一组字符,由生产者每次读入一个字符供消费者输出。运行模拟程序,
打印依次读入的字符和消费者输出的字符。
(4) 把生产者和消费者进程中的P操作、V操作都改成空操作指令,观察在两者不同步的情
况下可能出现的与时间有关的错误。打印依次读入的字符和消费者输出的字符。
j:=PA[i] 开始 保护现场,PC=>当前进程PCB的断点 否 有就绪进程? 是 结束 随即选择—就绪进程作为将现行进程状态改为运行现行进程PCB的断点值=>PC 模拟处理器指令执行程序 图4-5处理器调度程序流程
开始 j:=PC 是 现行进 程为生产者? 否 j:=SA[i]
图 4-6 模拟处理器指令执行 开始 S←S-1 否 S<0 是 将调用P(s)过程的将调用P(s)过程的进进程置为就绪 开始 S←S+1 否 S<0 是 找一个等待s信号量的进程置为就绪态
(1)模拟P(S) (2)模拟V(S)
图 4-7 模拟PV操作的执行
三、实验要求
1、 linux操作系统 2、 Windows操作系统
四、主要实验步骤
linux操作系统下的操作步骤: gedit semaphore.c (编辑程序)
gcc –o semaphore semaphore.c (编译、链接程序) ./semaphore(执行程序)
五、实验数据及处理结果
代码#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度 unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区下标 int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列 bool g_continue = true; //控制程序结束 HANDLE g_hMutex; //用于线程间的互斥
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程