2020年操作系统实验题目及实验报告要求

时间:2020-11-23 10:37:20 手机站 来源:网友投稿

  王桥 计科 123 班 实 验 报 告 实验课程

  操作系统实验学生姓名

  学 号

  专业班级

  2014 年 6 月 3 日 目

  录

  一、 实验一 1 二、 实验二 7 三、 实验三 21 四、 实验四 28 五、 实验五 33

  南昌大学实验报告 --- ( 1)

  操 作系 统安 装及 其 接口 环境 学生姓名

  王桥 学 号

  专业班级

  计科 123 班 实 验 类 型

  ■ 验 证 □ 综 合 □ 设 计 □ 创 新 实 验 日 期

  实验成绩

  一、实验目的

  熟悉 Windows 1(执行程序)

   模拟 PV操作同步机构,且用 PV操作解决生产者——消费者问题。模拟 PV操作同步机构,且用 PV操作解决生产者——消费者问题。[ 提示]

  (1) PV 操作同步机构,由 P 操作原语和 V 操作原语组成,它们的定义如下

  P 操作原语 P(s) 将信号量 s 减去 1,若结果小于 0,则执行原语的进程被置成等待信号量 s 的状态。

  V 操作原语 V(s) 将信号量 s 加 1,若结果不大于 0,则释放一个等待信号量 s 的进程。

  这两条原语是如下的两个过程

  procedure p ( var s: semaphore); begin s:=s-1; if s<0 then W(s) end {p} procedure v ( var s: semaphore);

  begin s:=s+1;

  if s<=0 then R(s) end {V} 其中 W(s)表示将调用过程的进程置为等待信号量 s 的状态; R(s) 表示释放一个等待信号量 s 的进程。

  在系统初始化时应把 semaphore 定义为某个类型, 为简单起见, 在模

  拟实验中可把上述的 semaphore 直接改成 integer 。

  (2)

  )生产者——消费者问题。

  假定有一个生产者和消费者, 生产者每次生产一件产品, 并把生产的产品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一 件产品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空

  缓冲器内取产品。假定缓冲器内可同时存放 10 件产品。那么,用 PV操作来实现生产者和消费者之间的同步, 生产者和消费者两个进程的程序如下

  B:array [0..9] of products; s 1 ,s 2 : semaphore; IN, out; integer ;

  IN:=0;out:=0;

  cobegin

  procedure producer; c: products; begin L 1 :

  produce (c); p (s

  1 ); B[IN]:=C;

  IN:=(IN+1)mod 10;

  v(s 2 );

  goto L 1

  end;

  procedure consumer; x: products; begin

  L 2 :P(s 2 );

  x:=B[out];

  out:=(out+1) mod 10;

  v(s 1 ); consume(x); goto L 2 end;

  coend

  其中的 semaphore 和 products 是预先定义的两个类型,在模拟实现中

  semaphore用 integer 或 char 等代替。

  (3)

  )进程控制块 PCB。

  为了纪录进程执行时的情况, 以及进程让出处理器后的状态, 断点等

  进程名 状态 等待原因 断点 信息,每个进程都有一个进程控制块 PCB。在模拟实验中,假设进程控制块的结构如图 4-1 。其中进程的状态有运行态、就绪态、等待态和完成态。当进程处于等待态时,在进程控制块

  PCB中要说明进程等待原因(在模拟实验中进程等待原因为等待信号量

  s 1 或 s 2 );当进程处于等待态或就绪态时, PCB中保留了断点信息,一旦进程再度占有处理器则就从断点位置 继续运行;当进程处于完成状态,表示进程执行结束。

  图 4-1 进程控制块结构

  (4)

  )处理器的模拟。

  计算机硬件提供了一组 机器指令,处理器的主要职责

  是解释执行机器指令。为了模 拟生产者和消费者进程的并发

  执行,我们必须模拟一组指令 和处理器职能。

  模拟的一组指令见图 4-2 ,其中每条指令的功能由一个过程来实现。用变量 PC 来模拟“指令计数器” ,假设模拟的指令长度为 1,每执行一条模拟指令后, PC加 1,指出下一条指令地址。使用模拟的指令,可把生产者和消费者进程的程序表示为图 4-3 的形式。

  定义两个一维数组 PA[0..4] 和 SA[0..4],

  每一个 PA[i] 存放生产者程序中的一条模拟指令执行的入口地址;每个 SA[i] 存放消费者程序中的一条模拟指令执行的入口地址。于是模拟处理器执行一条指令的过程为取 出 PC之值,按 PA[PC] 或 SA[PC]得模拟指令执行的入口地址,将 PC之值 加 1,转向由入口地址确定的相应的过程执行。

  (5)

  )程序设计

  本实验中的程序由三部分组成初始化程序、处理器调度程序、模拟

  处理器指令执行程序。

  各部分程序的功能及相互间的关系由图 4-4 至图 4-7

  指出。

  模拟的指令 功能

  P(s) 执行 P 操作原语

  V(s) 执行 v 操作原语

  put B[IN]:=product;IN:=(IN+1) mod 10

  GET X:=B[out];out:=(out+1) mod 10 produce 输入一个字符放入 C 中 consume 打印或显示 x 中的字符

  GOTO L PC: L

  NOP 空操作

  图 4-2 模拟的处理器指令

  序号 生产者程序 消费者程序

  0 produce P(s 2 )

  1 P(s 1 ) GET

  2 PUT V(s 1 )

  3 V(s 2 ) consume

  4 goto 0 goto 0

  图 4-3 生产者和消费者程序

  初始化程序

  模拟实验的程序从初始化程序入口启动, 初始化工作包括对信号量 S1、S2 赋初值,对生产者、消费者进程的 PCB初始化。初始化后转向处理器调度程序,其流程如图 4-4 处理器调度程序

  在计算机系统中, 进程并发执行时, 任一进程占用处

  理器执行完一条指令后就有可能被打断而让出处理器由其他进程运行。故在模拟系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它成为非运行状态,由处理器调度程序按随机数再选择一个就绪进程占用处理器运行。处理器调度程序流程见图 4-5 。

  开始

  初始化信号量 S1,S2 S1:=10 , S2:=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 操作都改成空操作指令, 观察在两者不同步的情况下可能出现的与时间有关的错误。打印 依次读入的字符和消费者输出的字符。

  开始 图 4-5 处理器调度程序流程开始

  保护现场, PC=>图当前4 进 -6 程的断点 模P 拟 CB处j:=理PC器指令执行

  开始 是 开始 现行进 否 否 ( 1)模拟 P( S)

  (2)模拟 V(S)

  有就绪进程?

  三、实验要 S 求←S-j:1=PA[i] 程为生产者? 图 4-7 模拟 PV 操作的执行 是 结束

  j:=SA[i]

  S← S+1 随即选择—就绪进 否 否 S<0 S<0

  将现是 行进程状态改 PC:=i+1 是

  1、l inux 操作系统

  2、Windows 操作系统四、主要实验步骤 linux 操作系统下的操作步骤

  gedit ( 编辑程序 ) gcc –o semaphore (编译、链接程序)

   (执行程序)

  生产者和消费者的代码

  #include <iostream> const unsigned short SIZE_OF_BUFFER=5; . "; std::cerr << "Succeed" << std::endl; } . "; g_buffer[in]=ProductID; in=(in+1)%SIZE_OF_BUFFER; std::cerr << "Succeed" << std::endl; . "; ConsumeID=g_buffer[out]; out=(out+1)%SIZE_OF_BUFFER; std::cerr << "Succeed" << std::endl; . "; std::cerr << "Succeed" << std::endl;

  }

  计算并输出下述各种算法在不同内存容量下的命中率。

  A. FIFO先进先出的算法

  B. LRU最近最少使用算法

  C. LFU最少访问页面算法三、实验要求 1、需写出设计说明;

  2、设计实现代码及说明 3、运行结果; 四、主要实验步骤 1、最少使用( LFU)页面置换算法设计说明 该算法主要是将最近时期页面使用最少的页面作为淘汰页。这里通过设立 count[32] 这个计数数组记录 32 页的调用次数, 通过比较来确定要调出的页面。

  但如果没产生缺页就只需对所调页数对应的 count 值加 1 即可。

  2、最近最久未使用( LRU)页面置换算法设计说明

  这个算法同 FCFS算法的不同之处在于,每产生一条随机指令,如果和 4 个内存块中的某一个页数相同的话, 就要对这 4 个内存块中的页数重新排序, 将每次要置换出去的页数放在 mem_volume[3]中,这样,在每次产生缺页的时候,都先将所缺页数写入到该内存块,然后再排序,将其放到 mem_volume[0]中去。

  3、先进先出( FIFO)算法设计说明

  按照所要求的产生随机指令序列,存放在 order[320] 这个数组中。

  通过循环产生这些随机指令,每产生一条都要进行下列判断是否和内存中即 mem _volume[4]

  中存放的页面相同,如果相同则不做任何操作,如果不相同,则产生缺页, 相应的缺页次数加一, 按照 fcfs 将最先进入内存的页数淘汰, 并将该页写到内存中去。重复上面的操作直到完成这 320 条指令。

  f%%\n",add/10,sum/10); printf("**************************************************\n"); return 0; } *\n"); f%%\n",add/10,sum/10); printf("**************************************************\n"); return 0; } f%%\n",add/10,sum/10); printf("**************************************************\n"); return 0; } 五、实验数据及处理结果

  六、实验体会或对改进实验的建议 这次实验是最后一次实验,代码量比较大,但实现起来都比较容易,因为这三个算 法之间总体的思路是不变的, 即先判断是否和内存块中的页数相同, 如果相同执行相应操作,如果不同,产生缺页,再执行相应操作。但有一个细节问题,要使第一次调入的

  页数产生缺页,于是将 mem_volume[4]中的值都初始化为 100(大于 32 即可),这样第一次调入便会产生缺页。

  这个细节虽然在结果中不能够得到体现, 但是我想做不管怎样都应该全面的去考虑问题。总之,这次的操作系统实验使我受益匪浅。

  • 下载文档
  • 收藏
  • 0

推荐访问:实验报告 实验 题目 操作系统 2020年操作系统实验题目及实验报告要求

版权声明 :以上文章中选用的图片文字均来源于网络或用户投稿 ,如果有侵权请立即联系我们 , 我们立即删除 。