1、实验三 编程模拟生产者和消费者问题 一、实验目的和要求 模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。 进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统 中的多个进程轮流地占用处理器运行。 我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进 程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生 “与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有 关。为了防止这类错误,系统必须要用同步机构来控制进程对公共变量的访问。 一般说,同步机构是由若干条原语同步原语所组成。本实习要求学生 模拟 PV 操作同步机构的实现,模拟
2、进程的并发执行,了解进程并发执行时同 步机构的作用。 二、实验环境 Windows 操作系统和 Visual C+6.0 专业版或企业版 三、实验步骤 模拟 PV 操作同步机构,且用 PV 操作解决生产者消费者问题。 提示: (1) PV 操作同步机构,由 P 操作原语和 V 操作原语组成,它们的定义如下: P 操作原语 P (s):将信号量 s 减去 1,若结果小于 0,则执行原语的进程被 置成等待信号量 s 的状态。 V 操作原语 V (s):将信号量 s 加 1,若结果不大于 0,则释放一个等待信 号量 s 的进程。 这两条原语是如下的两个过程: procedure p (var s:
3、semaphore); begin s: = s-1; if s0 then W (s) end p procedure v (var s: semaphore); egin s: = s+1; if s0 then R (s) end v 其中 W(s )表示将调用过程的进程置为等待信号量 s 的状态;R (s )表示 释放一个等待信号量 s 的进程。 在系统初始化时应把 semaphore 定义为某个类型,为简单起见,在模拟实 习中可把上述的 semaphore 直接改成 integer。 (2) 生产者 消费者问题。 假定有一个生产者和一个消费者,生产者每次生产一件产品,并把生产的 产品
4、存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产 品去消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内 以产品。假定缓冲器内可同时存放 10 件产品。那么,用 PV 操作来实现生产者 和消费者之间的同步,生产者和消费者两个进程的程序如下: B: array 09 of products; s1, s2; semaphore; s1: =10, s2: =0; IN, out: integer; IN: =0; out: =0; cobegin procedure producer; c: products; begin L1: Produce (c); P (s
5、1); BIN: =C; IN: =(IN+1)mod 10; V (s2); goto L1 end; procedure consumer; x: products; begin L2: p (s2); x: =Bout; out: =(out+1) mod10; v (s1); consume (x); goto L2 end; coend. 其中的 semaphore 和 products 是预先定义的两个类型,在模拟实现中 semaphore 用 integer 代替,products 可用 integer 或 char 等代替。 (3) 进程控制块 PCB。 为了记录进程执行时的情
6、况,以及进程让出处理器后的状态,断点等信息, 每个进程都有一个进程控制块 PCB。在模拟实习中,假设进程控制块的结构如 图 3-1。其中进程的状态有:运行态、就绪态、等待态和完成态。当进程处于等 待态时,在进程控制块 PCB 中要说明进程等待原因(在模拟实习中进程等待原 因是为等待信号量 s1 或 s2) ;当进程处于等待态或就绪态时,PCB 中保留了断 点信息,一旦进程再度占有处理器则就从断点位置继续运行;当进程处于完成 状态,表示进程执行结束。 进程名 状态 等待原因 断点 图 3-1 进程控制块结构 (4) 处理器的模拟。 计算机硬件提供了一组机器指令,处理器的主要职责是解释执行机器指令
7、。 为了模拟生产者和消费者进程的并发执行,我们必须模拟一组指令和处理职能。 模拟的一组指令见图 3-2,其中每条指令的功能由一个过程来实现。用变量 PC 来模拟 “指令计数器” ,假设模拟的指令长度为 1,每执行一条模拟指令后, PC 加 1,提出下一条指令地址。使用模拟的指令,可把生产者和消费者进程的 程序表示为图 3-3 的形式。 定义两个一维数组 PA04和 SA04,每一个 PAi存放生产者程序中的 一条模拟指令执行的入口地址;每个 SAi存放消费者程序中的一条模拟指令执 行的入口地址。于是模拟处理器执行一条指令的过程为:取出 PC 之值,按 PAPC或 SAPC得模拟指令执行的入口地
8、址,将 PC 之值加 1,转向由入口地 址确定的相应的过程执行。 模拟的指令 功 能 p (s) 执行 P 操作原语 v (s) 执行 V 操作原语 put BIN: =product; IN: = (IN+1) mod 10 GET x: =Bout; out: =(out+1) mod 10 produce 输入一个字符放入 C 中 consume 打印或显示 x 中的字符 GOTO L PC: =L NOP 空操作 图 3-2 模拟的处理器指令 序号 生产者程序 消费者程序 0 produce p (s2) 1 p (s1) GET 2 PUT v (s1) 3 v (s2) consu
9、me 4 goto 0 goto 0 图 3-3 生产者和消费者程序 (5) 程序设计 本实习中的程序由三部分组成:初始化程序、处理器调度程序、模拟处理 器指令执行程序。各部分程序的功能及相互间的关系由图 3-4 至图 3-7 指出。 图 3-4 初始化流程 图 3-5 模拟处理器调度 初始化程序:模拟实习的程序从初始化程序入口启动,初始化工作包括对 信号量 s1、s2 赋初值,对生产者、消费者进程的 PCB 初始化。初始化后转向 处理调度程序,其流程如图 3-4。 处理器调度程序:在计算机系统中,进程并发执行时,任一进程占用处理 器执行完一条指令后就有可能被打断而让出处理器由其它进程运行。故
10、在模拟 系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它 成为非运行态,由处理器调度程序按随机数再选择一个就绪进程占用处理器运 行。处理器调度程序流程见图 3-5。 图 3-6 模拟处理器指令执行 (a) 模拟 P (s) (b) 模拟 V (s) 图 3-7 模拟 PV 操作的执行 模拟处理器指令执行程序:按“指令计数器”PC 之值执行指定的指令,且 PC 加 1 指向下一条指令。模拟处理器指令执行程序的流程图见图 3-6 和图 3- 7。 另外,为了使得模拟程序有一个结束条件,在图 3-6 中附加了“生产者运行 结束”的条件判断,模拟时可以采用人工选择的方法实现。图 3-7 给出了 P(s)和 V( s)模拟指令执行过程的流程。其它模拟指令的执行过程已在图 3- 2 中指出。