操作系统课程设计-进程同步模拟设计 - 生产者和消费者问题-080614张方纪

更新时间:2023-12-24 09:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学 号:

0120810340614

课 程 设 计

题 目 学 院 专 业 班 级 姓 名 指导教师

进程同步模拟设计 ——生产者和消费者问题 计算机科学与技术学院 计算机科学与技术

0806 张方纪 孙玉芬

2010 年 1 月 20 日

武汉理工大学计算机科学与技术学院《操作系统》课程设计

课程设计任务书

学生姓名: 张方纪 专业班级: 计算机0806 指导教师: 孙玉芬 工作单位: 计算机科学与技术学院 题 目: 进程同步模拟设计——生产者和消费者问题 初始条件:

1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1.模拟用信号量机制实现生产者和消费者问题。

2.设计报告内容应说明: ⑴ 需求分析;

⑵ 功能设计(数据结构及模块说明); ⑶ 开发平台及源程序的主要部分;

⑷ 测试用例,运行结果与运行情况分析; ⑸ 自我评价与总结:

i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法);

时间安排:

设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。 周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)

指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日

1

武汉理工大学计算机科学与技术学院《操作系统》课程设计

进程同步模拟设计

——生产者和消费者问题

1 课设任务

本课程设计的任务在于,通过编写一个具体的有关操作系统进程同步互斥的经典问题,加强对操作系统实现进程间同步与互斥的机制的理解。同时培养提出问题、发现知识、使用工具、解决问题的能力。

具体地,我们要编制出一个程序,利用PV原语以及进程创建、同步、互斥、销毁等相关的系统调用来模拟“生产者—消费者”问题。

2 背景介绍

2.1 “生产者—消费者”问题(the producer-consumer

problem)

问题描述:

一组生产者向一组消费者提供消息,它们共享一个有界缓冲区n,生产者向其中投放消息,消费者从中取得消息。

规则:

? 对于生产者进程:产生一个数据,当要送入缓冲区时,要检查缓冲区是否已

满,若未满,则可将数据送入缓冲区,并通知消费者进程;否则,等待; ? 对于消费者进程:当它去取数据时,要看缓冲区中是否有数据可取,若有则

取走一个数据,并通知生产者进程,否则,等待。

? 缓冲区是个临界资源,因此,诸进程对缓冲区的操作程序是一个共享临界区,

所以,还有个互斥的问题。 问题分析:

该问题涉及到操作系统进程管理当中的两个重要概念——同步和互斥。

同步,表现在生产者和消费者需要协同工作,步调不能拉开太大(由缓冲区大小n决定,n越大,缓冲空间越大,步调可以拉得越开;n=1时,必须是生产一个,消费一个,生产者和消费者就完全同步了)。当步调差距超过极限时,走在前面的当前进程(生产者)调用P原语时由于资源耗尽,被阻塞;步调靠后的继续向前推进。由此实现同步。

互斥,表现在生产者与消费者、生产者与生产者、消费者与消费者任何两个成员之间必须互斥地使用缓冲区。当有一个成员进入缓冲区存/取产品时,其他成员将被关在门外排队等候(被阻塞);当完毕时,通知队首成员进入。

由操作系统理论可知,我们需要三个信号量,分别命名full, empty, mutex,来分别代表消费者的可用资源数、生产者的可用资源数、缓冲区是否可用。初值:full=0(消费者无资源可用),empty=N(生产者有N个资源可用,N代表缓冲区大小),mutex=1(缓冲区可用)。

要模拟多个进程的并发,我们要使用一个系统调用,使多个函数或程序同时地执行。鉴于VC下这样的函数太过复杂,Linux下笔者暂未找到,因此我们使用Toyix系统提供的一个系统调用函数:cobegin。其说明如下:

2

武汉理工大学计算机科学与技术学院《操作系统》课程设计

cobegin

原型:

int cobegin(); 功能:

创建多个子进程并发执行函数。 参数:

函数名用0结束,例如: cobegin(f1,f2,f3,0); 返回值:

创建子进程的个数。 说明:

所有子进程共享数据段,主进程撤销,所有子进程将被撤销。 我们于下一小节具体讲述有关Toyix的背景知识。

2.2 Toyix简介 2.2.1 概述

Toyix 是我国著名计算机教育家王爽老师开发的一个专门用于操作系统基础理论教学的软件。该软件很好的解决了目前存在于计算机专业操作系统课程教学中无法使学习者 获得实践体验和对理论直观的了解的问题。以下是Toyix软件的重要意义和特点的描述:(该软件下载地址 www.toyix.net )

传统的操作系统教学中存在的问题:

? 重理论轻实践,学习的理论没有与编程结合,使学习者无法获得实际的体验。 ? 以unix或windows为平台实践,这两种系统比较复杂,须学习许多相关的知

识,分散学习者的精力,不能把主要精力放在操作系统的问题的研究上。 因此我们需要一个既能提供编程体验,又不能太复杂的试验平台。

为了解决这个问题,王爽老师开发了一个专门用于操作系统基础理论教学的系统-Toyix。

Toyix的特点: 1、Toyix小巧简单

Toyix安装包只有几百KB,下载后解压即可使用。 2、Toyix的用户操作方便

Toyix兼容Dos的大多数命令。 3、Toyix下使用的是TC的编译器

多数学习者在学操作系统前都学过C语言,一般是从TC起步的,这样在Toyix下编程时就不需要再学习新的编程知识,就可以开始编程。

4、Toyix的编程接口兼容性好

系统部分与UNIX兼容,C库函数与标准的C库函数兼容,这样书上的代码非常容易在Toyix下实现。当然Toyix没有实现UNIX和标准C的所有函数,只实现了一些教学实践中必须的。

2.2.2 Toyix的安装

安装步骤:

3

武汉理工大学计算机科学与技术学院《操作系统》课程设计

1、下载TOYIXCE.zip文件,将压缩文件中的TOYIXCE文件夹解压到D盘根目录下,如下图。

图1

解压Toyix到D:盘根目录

2、打开TOYIXCE文件夹,浏览Toyix的系统文件,查看Toyix系统文件的目录结构,如下图。

图2 Toyix操作系统的目录结构

如果看到toyix的系统文件在D:\\TOYIXCE目录下,说明Toyix系统已安装完毕。

2.2.3 对Toyix的一点修改

4

武汉理工大学计算机科学与技术学院《操作系统》课程设计

Toyix将用户程序源文件放在了C:盘根目录,极不方便打开,又容易与C:盘系统文件混淆。因此我建议更改工作目录。

打开Toyix操作系统的目录结构中的CO.BAT文件,将其中内容更改为: @echo off path d:\\toyixce

cd /d D:\\TOYIXCE\\PROJECTS toy

并在D:\\TOYIXCE目录下建立一PROJECTS文件夹,即可将工作目录设在

D:\\TOYIXCE\\PROJECTS下,可以很方便地将整个Toyix操作系统及你所编写的程序打包,而且也避免了与C:盘主操作系统文件的相互干扰。此后,用户用edit文本编辑器新建的文件以及后面用cc命令编译和用do命令运行的文件/程序就都默认在此工作目录下了。

2.2.4 Toyix的启动和初步使用

Windows Xp及以上的用户可以直接双击CO.BAT启动2.2.4 Toyix操作系统。默认当前目录即上面所说的D:\\TOYIXCE\\PROJECTS。

Toyix系统很简单,只涉及简单的模拟进程管理,只包含edit.com等少许外部程序(当然用户可以利用它的CC内部命令自己生成.prg格式的外部程序)。Toy.exe是其在Windows下的启动程序。

用户使用普通的文本编辑器,或它自带的edit DOS下的编辑器编辑源程序。使用cc命令编译。使用do命令运行。

运行过程中,DOS界面上方会有一栏toyix的进程监视器。它显示了所有进程的状态,“running”后面显示的是正在执行进程的进程号,“ready”后面显示的是就绪进程的进程号,“blocked”后面显示的是阻塞进程的进程号。如图3:

图3 toyix的进程监视器

2.2.5 Toyix编程

Toyix编程部分主要讲解toyix系统提供的库函数。Toyix库函数主要分两类:一类是与系统相关的库函数;另一类是c库函数,和一般c库函数的使用基本相同。

此部分内容请读者参考,www.toyix.net上面的资料。地址:http://www.toyix.net/tutorial/tutorial.htm#a2。

读者也可以通过本课设报告来窥知toyix系统的内容。

3 具体实现(完整代码及分析)

完整代码如下: #include #define N 4

semaphore mutex; semaphore full; semaphore empty;

produce() {

delay(3000);/*用3秒钟生产一件产品*/

5

武汉理工大学计算机科学与技术学院《操作系统》课程设计

printf(\ p(&empty); p(&mutex);

delay(5000);/*用5秒钟将该产品放入缓冲区*/ printf(\ v(&mutex); v(&full); }

consume() {

p(&full); p(&mutex);

delay(5000);/*用5秒钟从缓冲区取走一件产品*/ printf(\ v(&mutex); v(&empty);

delay(3000);/*用3秒钟消费该产品*/

printf(\}

main() {

int n, i; printf(\

/*设置信号量的初值 */

set(&mutex,1);/*mutex=1:缓冲区可用;mutex=0:缓冲区正被占用,不可用 */ set(&full,0);/*consume函数的信号量。full=1~N:缓冲区有产品可取走; full<=0:缓冲区无产品 */

set(&empty,N);/*produce函数的信号量。empty=1~N:缓冲区有空位放产品;full<=0:缓冲区无空位 */

n=cobegin(/*多个函数(进程)并行执行。测试各种情况。(注:cobegin最多支持7个函数同时运行)*/

produce, produce, produce, produce, produce, consume, consume, 0 );

printf(\

printf(\

getch();/*必须加上,以保证主进程最后才结束。cobegin的子进程都会在主进程结

6

武汉理工大学计算机科学与技术学院《操作系统》课程设计

束时被销毁。*/

}

运行过程与结果:

图4 编译源程序,成功生成.prg可执行文件

图5 执行可执行文件,父进程就绪

0号进程是操作系统初始进程,或命令行进程。1号进程为可执行文件调入内存所产生的进程,即主(父)进程。本程序中,2号开始即为子进程。Cobegin中共7个函数(进程)并发执行,进程号分别为2~8。

7

武汉理工大学计算机科学与技术学院《操作系统》课程设计

图6 按任意键开始运行

可以看到,此时进程5被调度到,61234处于就绪状态,78被阻塞。

图7 进程的切换调度

可见,34256都已经执行过至少一次,而且并发的7个进程的调度先后顺序并无一定之规。6进程(生产者)生产了1件产品,可是因为缓冲区才4个单位,前四个生产者已经往其中放满了产品。接下来会发生什么?

8

武汉理工大学计算机科学与技术学院《操作系统》课程设计

图8 6号进程(第5个生产者)最后将产品放入了缓冲区

这一结果回答了我们上面提到的问题。这也体现了同步问题中进程调度的先后性。而其实现机制则是信号量和PV原语。

图9 回到主程序,按任意键结束主程序

最后一点是关键!必须要在主函数最后加入getch();这行代码,以保证主进程等待所有子进程结束才结束。不然请看结果:

9

武汉理工大学计算机科学与技术学院《操作系统》课程设计

图10 主进程先于所有7个子进程结束的结果

查看Toyix手册,cobegin的说明(见2.1小节)中有:“所有子进程共享数据段,主进程撤销,所有子进程将被撤销。”这就解释了问题的由来。

4 小结与体会

这一次的课程设计很有别于以往一贯的C++编程,而是在短短一天内,在一个新的平台上,使用一个新的库来实现一个很经典的计算机科学方面问题。创新度从以往的语言上,提高到了平台的选择上。

Toyix是计算机教育家王爽老师开发的一个微型操作系统,只供操作系统学习与实践之用。先生还特地为此开发了一个很简明的网站,没有一个字的广告,很清爽。

我是在看课件上的相关章节,在网上寻找cobegin这个函数时发现这一网站的。没想到它给了我这么多知识,真好!

这里避而不谈本次课设的内容,我们谈一下中国的计算机教学环境。

国外和国内的大环境差别之大是显而易见的。单凭相关知识库网站的信息价值就可以看出这一点。像www.toyix.net这样的网站真的很难得。它在计算机教育中所起的价值,是无可估量的。

我会进我的一份力,回报这样一种举措的。

5 参考文献

[1] 《计算机操作系统》西安电子科技大学出版社,2000 [2] Toyix 网站http://www.toyix.net,2011-1-21

[3] Toyix函数手册http://www.toyix.net/functions/get_pid.html,2011-1-21

10

武汉理工大学计算机科学与技术学院《操作系统》课程设计

图10 主进程先于所有7个子进程结束的结果

查看Toyix手册,cobegin的说明(见2.1小节)中有:“所有子进程共享数据段,主进程撤销,所有子进程将被撤销。”这就解释了问题的由来。

4 小结与体会

这一次的课程设计很有别于以往一贯的C++编程,而是在短短一天内,在一个新的平台上,使用一个新的库来实现一个很经典的计算机科学方面问题。创新度从以往的语言上,提高到了平台的选择上。

Toyix是计算机教育家王爽老师开发的一个微型操作系统,只供操作系统学习与实践之用。先生还特地为此开发了一个很简明的网站,没有一个字的广告,很清爽。

我是在看课件上的相关章节,在网上寻找cobegin这个函数时发现这一网站的。没想到它给了我这么多知识,真好!

这里避而不谈本次课设的内容,我们谈一下中国的计算机教学环境。

国外和国内的大环境差别之大是显而易见的。单凭相关知识库网站的信息价值就可以看出这一点。像www.toyix.net这样的网站真的很难得。它在计算机教育中所起的价值,是无可估量的。

我会进我的一份力,回报这样一种举措的。

5 参考文献

[1] 《计算机操作系统》西安电子科技大学出版社,2000 [2] Toyix 网站http://www.toyix.net,2011-1-21

[3] Toyix函数手册http://www.toyix.net/functions/get_pid.html,2011-1-21

10

本文来源:https://www.bwwdw.com/article/od35.html

Top