学 号:
0120810340219
课 程 设 计
题 目
进程同步模拟设计
------ 吃水果问题
学 院 计算机科学与技术
专 业 计算机科学与技术
班 级 0802 班
姓 名 高辉
指导教师 彭德巍
2011
年
1
月
18
日
武汉理工大学《操作系统》课程设计说明书
课程设计任务书
学生姓名: 高辉 专业班级: 计算机
0802
指导教师: 彭德巍 工作单位: 计算机科学与技术学院
题 目: 进程同步模拟设计——吃水果问题
初始条件:
1.预备内容:阅读操作系统的进程管理章节内容, 对进程的同步和互斥,以及
信号量机制度有深入的理解。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写
等具体要求)
1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次
只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子
两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告内容应说明:
⑴ 需求分析;
⑵ 功能设计(数据结构及模块说明);
⑶ 开发平台及源程序的主要部分;
⑷ 测试用例,运行结果与运行情况分析;
⑸ 自我评价与总结:
i)你认为你完成的设计哪些地方做得比较好或比较出色;
ii)什么地方做得不太好,以后如何改正;
iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
iv)完成本题是否有其他方法(如果有,简要说明该方法);
v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:
设计安排一周:周 1、周 2:完成程序分析及设计。
周 2、周 3:完成程序调试及测试。
周 4、周 5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,一律按 0 分记)
指导教师签名: 年 月 日
1
武汉理工大学《操作系统》课程设计说明书
系主任(或责任教师)签名: 年 月 日
进程同步模拟设计
—— 吃水果问题
1、课程设计目的与需求分析
1.1、目的
利用进程、线程及互斥、同步信号量机制,模拟吃水果的同步模型:桌子
上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸
专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中
的橘子,两个女儿专门等吃盘子中的苹果。
1.2、需求分析
当计算机中两个或者多个进程在执行时需要使用公用缓冲区,并且对该缓
冲区采取了互斥措施,这时如果并发执行这些进程的时候就会造成 CPU 时间的
极大浪费,这是操作系统设计要求不允许的。而这种现象在操作系统和用户进
程中大量存在。因此为了解决这一问题,提出了同步的概念,即把异部环境下
的一组并发进程,因直接制约而互相发送消息而进行互相合作、互相等待,使
得各进程按一定的速度执行的过程称为进程间的同步。
本题目至少需要四个独立的运行模块:①父亲线程实现放苹果 ②母亲线程实
现放橘子 ③儿子线程实现吃橘子 ④女儿线程实现吃苹果。
其中,父亲和母亲线程之间都往盘子中放水果是互斥关系,两儿子之间因都
要吃橘子是互斥关系,两女儿之间因都要吃苹果是互斥关系,而父亲与女儿、
母亲与儿子之间存在放水果、吃水果的关系,因而是同步关系。
2、整体功能设计
2.1 说明
本课设在 Linux 系统下完成,使用 C 语言中的多线程功能具体实现。为了
体现多线程间的各种关系,程序中默认的设置如下:
父亲、母亲、大儿子、小儿子、大女儿、小女儿共六个线程。
父亲每 3s 中放一个苹果;
母亲每 3s 中放一个橘子;
大儿子每 3s 中吃一个橘子,共要吃 5 个;
小儿子每 3s 中吃一个橘子,共要吃 4 个;
大女儿每 4s 中吃一个苹果,共要吃 3 个;
小女儿每 3s 中吃一个苹果,共要吃 2 个;
盘子里最初有一个苹果一个橘子。
在动态类型的程序(fruit.c)中,增添了在孩子们吃完默认的水果后,继
2
武汉理工大学《操作系统》课程设计说明书
续吃的功能。
2.2 数据结构
2.2.1 线程
线程头文件 #include <pthread.h>
线程的创建,threadFunct 是线程的入口函数。
int res=pthread_create(&threadArray[i],NULL,threadFunct,(void
*)i);
线程的终止退出 pthread_exit(NULL);
等待线程完成 res=pthread_join(threadArray[i],&thread_res);
2.2.2 用信号量进行同步
#include <semaphore.h>
sem_t availPut; //还可以往盘子里放几个水果
res=sem_init(&availPut,0,0); //创建信号量
sem_wait(&availPut); //P操作 -1
sem_post(&availPut); //V操作 +1
sem_destroy(&availPut); //清理信号量
2.2.3 用互斥量进行同步
#include <pthread.h>
pthread_mutex_t appleLock; //互斥琐
res=pthread_mutex_init(&appleLock,NULL); //创建
pthread_mutex_lock(&appleLock); //加锁
appleNum++;
pthread_mutex_unlock(&appleLock); //开锁
pthread_mutex_destroy(&appleLock); //清理互斥量
3 程序实现
3.1 主函数 main()
int main (){
int res; int i;
pthread_t threadArray[threadNum];
void *thread_res;
res=sem_init(&availPut,0,0);
if (res!=0){
perror ("availPut Semaphone init failed!");
exit(EXIT_FAILURE);
}
res=sem_init(&apple,0,1);
res=sem_init(&orange,0,1);
res=pthread_mutex_init(&appleLock,NULL);
3
武汉理工大学《操作系统》课程设计说明书
res=pthread_mutex_init(&orangeLock,NULL);
showInfo();
for (i=0;i<threadNum;i++){
res=pthread_create(&threadArray[i],NULL,threadFunct,
(void *)i);
if (res==0){
printf("*** %s *** thread create succeed !\n",name[i]);
}else{
perror ("thread create failed!\n");
exit(EXIT_FAILURE);
}
}
for (i=threadNum-1;i>=0;i--){
res=pthread_join(threadArray[i],&thread_res);
if (res==0){
printf("pick up ### %s ### thread %d\n",name[i],i);
}else{
perror ("Thread join failed!");
}
}
printf("Thread join,all threads finished!\n");
showInfo();
sem_destroy(&availPut);
sem_destroy(&apple);
sem_destroy(&orange);
pthread_mutex_destroy(&appleLock);
pthread_mutex_destroy(&orangeLock);
exit(EXIT_SUCCESS);
}
4