版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 河南城建学院操作系统课程设计报告课程名称: 操作系统课程设计 设计题目: 理发师问题 指导教师: 李蓓 耿永军 班 级: 学 号: 学生姓名: 同组人员: 成 绩: 评 语: 计算机科学与工程学院2014年6月19日2 前言现在计算机更新如此迅速的时代要学好计算机软件技术,特别是操作系统的学习,不仅要努力学好课本上的基础知识,还要经常在图书馆看些有关这方面的书籍,而更重要的是要有足够的实践经验,也要注重和同学的交流,经常尝试性的做些小的操作系统,对自己技术的提升会有很大的帮助。同时,学习计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技
2、术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。本操作系统课程设计,是给同学提供一个集中实验的机会。希望同学们通过该设计加深对所学习课程的理解。本设计的内容是基于操作系统原理、C语言程序设计和数据结构等内容。本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。完成本次课程设计,首先必须配置操作系统编写的所需的环境,包括虚拟机的建立和相应环
3、境建立。用VI编辑器编写相应得程序,以实现理发师进程的同步与互斥。目录第一章.系统环境11.1硬件环境11.2软件环境1第二章.设计目的及要求22.1设计目的22.2 要求22.3 内容2第三章.总体设计33.1程序设计组成框图33.2 主函数流程图43.3理发师进程流程图53.4 顾客进程流程图53.5函数调用6第四章.详细设计74.1概要设计74.1.1 数据结构74.1.2 多线程编译原理74.1.3 创建线程74.1.4 信号量84.2 头文件声明84.3函数定义94.4 变量定义94.5函数实现9第五章.调试与测试115.1调试方法115.2结果分析13第六章.设计中遇到的问题及解决
4、方法146.1出现的问题146.2解决方法14第七章.源程序清单和执行结果167.1源程序清单167.2程序执行结果19第八章.心得体会20第九章.参考文献21 2 21 操作系统课程设计第一章.系统环境1.1硬件环境内存1GB,处理器1,硬盘(SCSI)50GB,网络适配器NAT。1.2软件环境虚拟机上运行的Red Hat Linux 9系统运行环境,言语开发环境是Linux的GNU C或C+。图1.1软件环境第二章.设计目的及要求2.1设计目的学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和
5、掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于条件和学时有限,在理论学习过程中没有给提供更多的实验机会。本操作系统课程设计,是提供了一个集中实验的机会。应该通过该设计加深对所学习课程的理解。进一步研究和实践操作系统中关于并发进程同步与互 斥操作的一些经典问题的解法。加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。 2.2 要求按件工程的思想和方
6、法进行设计,并把它作为一个工程来做。设计的每一步都有要形成文档,“成品”出来以后要有使用说明书和测试报告。最后按院方统一要求整理出软件实习“论文”,并分别以电子和书面文档的形式上交。最后,设计的程序要编译通过,并在验收时进行演示。 本设计的内容是基于操作系统原理教材的,但同学们必须对以前的C语言程序设计和数据结构等内容进行认真的复习。 本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。因此,要求课程设计者对Linux操作系统和GNU C或C+有一定的了解。2.3 内容(1)一个理发店接待室有n张椅子,工作室有
7、1张椅子;(2)没有顾客时,理发师睡觉;(3)第一个顾客来到时,必须将理发师唤醒;(4)顾客来时如果还有空座的话,他就坐在一个座位上等待;(5)如果顾客来时没有空座位了,他就离开,不理发了;(6)当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。第三章.总体设计题目中要求描述理发师和顾客的行为,因此需要进程barber ()和customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师休息,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,
8、所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用于互斥,初值为1;3.1程序设计组成框图实现工具及方法基本事项LINUX+C语言+VMwareworkstation理发师工作或睡觉理发师barber等待顾客理发,如果没有顾客就去睡觉,否则顾客获得理发椅使用权,过后释放理发椅使用权。创建线程创建理发师线程,初始化信号量sem_ini
9、t(&barbers,0,1);,如果创建失败,exit(EXIT_FAILURE)顾客剪发等待顾客customer理发,如果等待室有空位,进入。如果理发师在睡觉唤醒理发师,如果在工作就在等待室等候。创建线程创建顾客线程,初始化信号量sem_init(&customers,0,0);如果创建失败,exit(EXIT_FAILURE)图3.13.2 主函数流程图在程序模块中,主要实现对线程的操作,开始创建理发师进程,只有当顾客到来时再创建顾客线程来实现对顾客的操作,开始理发,当顾客全部理发完成时,就睡觉结束所有线程。图3.2主函数流程图3.3理发师进程流程图再理发师模块中,但有顾
10、客来时,理发师线程开始申请顾客信号量,顾客减一,理发师理发,完成时,释放理发师信号量。如归偶没有顾客就睡觉。图3.3理发师进程流程图3.4 顾客进程流程图在顾客模块中,当一个顾客来的时候,判断顾客人数要小于椅子数,如果没有空椅子顾客离去,如果有,顾客等待且顾客人数加1,释放顾客信号量,等待理发师理发。图3.4顾客流程图3.5函数调用 根据设计要求主函数天妖一下三个主要函数,来完成本程序,主函数main实现对两个线程的控制和执行操作。图3.5函数调用关系图第四章.详细设计4.1概要设计 4.1.1 数据结构sem_t customers;sem_t barbers;pthread_mutex_t
11、 mutex;int waiting=0;int chairCHAIRS;int cuspeople;4.1.2 多线程编译原理此次在Linux下进行多线程编程需要用到pthread_create、 pthread_mutex_lock和pthread_mutex_unlock这三种函数4.1.3 创建线程pthread_create用来创建一个线程,原型为:int pthread_create(pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg)第一个参数为
12、指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。函数thread不需要参数时,最后一个参数设为空指针。第二个参数设为空指针时,将生成默认属性的线程。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。pthread_create(&ntid, NULL, thr_fn, NULL): 线程创建函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine)(vo
13、id*), void *arg)。 tid : 新创建线程的线程ID; attr: 指定新创建线程的线程属性,为NULL即为使用默认属性; start_routine : 这是一个函数指针,用来指向线程函数; arg : 传递给线程函数的指针; 返回值 : 0代表成功。 失败,返回的则是错误号。4.1.4 信号量(1)函数sem_init()用来初始化一个信号量,函数原
14、型为: int sem_init (sem_t *_sem, int pshared, unsigned value); 该函数将sem 引用的无名变量初始化为value,该参数表示拥有资源的个 数,不能为负数。sem为指向信号量结构的一个指针;pshared不为时此信 号量在进程间共享,否则只能为当前进程的所有线程共享;value给出了信号量的初始值。(2)sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作”即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。信号量的值永远会正确地加一个“2”,因
15、为有两个线程试图改变它。 当有线程阻塞在这个信号量上时,调用这个函数会使其中一个线程不在阻塞,选择机制是有线程的调度策略决定的。(3)sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,这信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就 会地等待直到有其它线程增加了这个值使它不再是0为止。4.2 头文件声明#include <pthread.h> #include <stdio.h>#i
16、nclude <unistd.h> #include <stdlib.h>#include <semaphore.h>#include <sys/time.h>#include <math.h>4.3函数定义 void barber(void):定义一个理发师函数void customer(int num):定义一个顾客函数void cut_hair(void):定义一个理发时间函数sleep():执行挂起一段时间,在gcc编译器中,使用的头文件因gcc版本的不同而不同,#include <unistd.h>,单位为秒,返
17、回值若进程/线程挂起到参数milliseconds所指定的时间则返回0,若有信号中断则返回剩余秒数。在Linux下,sleep中的“s”不大写pthread_mutex_lock(&mutex);/加锁pthread_mutex_unlock(&mutex);/释放锁sem_wait(&customers); 相当于wait(customers)减一sem_post(&barbers);/ 相当于signel(barber)加一sem_init(&customers,0,0);/initial of the customers is 0顾客信号量sem_
18、init(&barbers,0,1);/initial of the barbers is 1理发师信号量4.4 变量定义 1. int waiting=0; /the number of waiting chairCHAIR;/椅子数组3.int cuspeople;/顾客数组4.int i;/用于数组下标5.int ser;/椅子编号6 int seq;/用于数组下标4.5函数实现 void barber(void);void customer(int num);void cut_hair(void);pthread_mutex_t mutex;sem
19、_init(&customers,0,0);/initial ofthe customers is 0顾客信号量sem_init(&barbers,0,1);/initial of the barbers is 1理发师信号量² 理发师线程void barber(void)/理发师线程while(1)/循环 sem_wait(&customers);/wait(customers)pthread_mutex_lock(&mutex);/上互斥锁waiting=waiting-1;/等待的顾客减一个Printf("customer %d is
20、going to be served!n",chairser);/ser座位编号chairser=0;/该座位上的顾客离开等待座位到理发座位理发ser=(ser+1)%CHAIRS;/查找下一个被理发的顾客pthread_mutex_unlock(&mutex);/释放锁cut_hair();/理发函数,延迟时间sem_post(&barbers);/signal(barbers) ² 顾客线程void customer(int num)/num顾客编号变量int k;pthread_mutex_lock(&mutex);/解锁if(waiting&
21、lt;CHAIRS)/顾客进入时有空位waiting=waiting+1;/等待着的顾客加一sem_post(&customers);/signal(customers)printf("Customer %d,You should sit at the %d seat!n",num,seq);/seq座位编号chairseq=num;/第num个顾客坐在seq个座位上,座位数组的值为顾客的编号seq=(seq+1)%CHAIRS;/seq移动到下一个座位for(k=0;k<CHAIRS;k+)if(chairk!=0)/查询座椅上的顾客,如果chair为0,则
22、座位上没有顾客printf("customer %d is at seat!n",chairk);/输出座位上顾客的编号elseprintf("empty!n");printf("n");pthread_mutex_unlock(&mutex);/释放锁sem_wait(&barbers);/wait(barber),如果成功,则执行理发师程序,失败转为等待else/顾客进入时没有座位printf("Customer %d,You should leave.There are so many people!n
23、",num);第五章.调试与测试5.1调试方法在电脑上编写代码,将代码拷贝到Linux系统虚拟机上。然后在虚拟机上使用vi编译器对C语言代码进行编译,存放C语言代码的文件名为jiami.c。编译语句为gcc lpthread -o pan pan.c。执行代码语句为./pan。看文件的状态情况。最后完成调试和测试,程序成功执行,得到正确的结果。测试结果的分析与讨论:1. 对文件pan.c进行查看。图5.12. 编译并执行程序pan.c。图5.23. 得到测试结果。图5.3图5.4图5.55.2结果分析程序成功运行,对文件的操作如图5.35.6所示,成功对理发师问题进行解决。在调试过程
24、中出现一些问题,但是查阅资料就解决了,像编译语句为gcc lpthread -o pan pan.c,自己第一次输编译语句为gcc -o pan pan.c就出现错误,因为在线程里是不对的,找不到线程的头文件。² 测试过程中遇到的主要问题编译语句为gcc lpthread -o pan pan.c,自己第一次输编译语句为gcc -o pan pan.c就出现错误,因为在线程里是不对的,找不到线程的头文件。会出现输入错误。在Linux虚拟机中vi编译器编译时会出现错误,像res=pthread_create(&barber_t,NULL, barber,NULL);提示找不到b
25、arber的指针,虽然可以运行结果,但还是不对,经过上网查看资料解决了这个问题。² 解决措施按部就班地执行程序,按出错提示寻找错误的地方,问同学和老师、上网查看结果分析,百度了好多重要的东西,还有程序的完善,在这次课程设计中,程序也是一遍一遍地被修改。终于做好了这次的课程设计。耐心、细心和发现问题的能力是做程序的根本。第六章.设计中遇到的问题及解决方法6.1出现的问题² 问题一图6.1² 问题二图6.36.2解决方法 在这个编程中,虽然源代码算没错,不过在运行时就有问题,在调试中前后函数的功能要对应,要不然就不能正确运行,还有一些基本的符合不符合规范,注意英文字母
26、的书写,例如在LNIUX中sleep()中s要小写,注意书写代码的规范,gcc -o pan pan.c在执行的时候就会出错如图6.2,因为在线程创建中需要pthread_create,所以要用lpthread来找到#include<pthread >的头文件才可以执行。还有像图6.1找不到那几种指针,经上网查阅后修改正确了。所以细心观察程序的逻辑结构,认真分析程序的流程。同组的人员共同讨论,集思广益,规范代码,完善功能。图6.4图6.5第七章.源程序清单和执行结果7.1源程序清单#include <pthread.h> 多线程编程头文件#include <std
27、io.h>#include <unistd.h>#include <stdlib.h>#include <semaphore.h>#include <sys/time.h>#include <math.h>#define CHAIRS 5 椅子的数量#define people 20sem_t customers;sem_t barbers;pthread_mutex_t mutex; 互斥锁的声明int waiting=0;int i;int seq=0;int ser=0;int chairCHAIRS;int cuspeo
28、ple;void barber(void);void customer(int num);void cut_hair(void);int main() int res; pthread_t barber_t; pthread_t customer_t; sem_init(&customers,0,0); 初始化顾客信号量 sem_init(&barbers,0,1); pthread_mutex_init(&mutex,NULL);/initial of the mutex is 0 for (i=0;i<CHAIRS;i+) chairi=0; for (i=0
29、;i<people;i+) cusi=i+1; res=pthread_create(&barber_t,NULL,(void*)barber,NULL); 创建理发师线程 if(res!=0) printf("Barber thread creation failed!n"); exit(EXIT_FAILURE); else printf("I'm a barber! You're Welcome!n"); for (i=1;i<people+1;i+) printf("I'm %d custom
30、er! I am coming!n",i); res=pthread_create(&customer_t,NULL, (void*)customer, (void*)cusi-1); 创建顾客线程 if(res!=0) printf("costomer %d thread creation failed!n",i); exit(EXIT_FAILURE); if(i<people) sleep(rand()%4); 产生03的随机数挂起 else sleep(2); void barber(void) while(1) sem_wait(&
31、customers); wait操作 pthread_mutex_lock(&mutex); 加锁 waiting=waiting-1; printf("customer %d is going to be served!n",chairser); chairser=0; ser=(ser+1)%CHAIRS; pthread_mutex_unlock(&mutex); signal操作释放锁 cut_hair(); sem_post(&barbers); 通知已进来的,在等理发师的顾客进程 void cut_hair(void) printf(&q
32、uot;Barber:I am cutting the customer's hair .n"); sleep(3); 挂起3秒 printf("Barber:Done!n"); void customer(int num) int k; pthread_mutex_lock(&mutex); 上互斥锁 if(waiting<CHAIRS) waiting=waiting+1; sem_post(&customers); 释放(barber) printf("Customer %d,You should sit at the
33、 %d seat!n",num,seq); chairseq=num; seq=(seq+1)%CHAIRS; for(k=0;k<CHAIRS;k+) if(chairk!=0) printf("customer %d is at seat!n",chairk); else printf("empty!n"); printf("n"); pthread_mutex_unlock(&mutex); 释放锁 sem_wait(&barbers); 上锁 else printf("Customer %d,You should leave.There are so many people!n",num); for(k=0;k<CHAIRS;k+) if(chairk!=0) printf("customer %d is at se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026保政策解读与宣传-医保知识考试考核试题(+答案解析)
- 2026年广告设计广告创意设计艺术家资格认证考试试题及答案
- 2026年环境设计师景观规划资格考试试题及答案
- 2026年药物临床试验稽查工作实施规范
- 2026年危化品仓储岗位安全知识考试试题及答案
- 2026年药品到货拒收药品销毁处置培训试题(含答案)
- 2026年卫生职称技能操作答辩试题及答案
- 2026年食品召回处置流程培训考试试卷试题及答案
- 2026年医院核心制度全员三基培训年度方案
- 咖啡、果汁饮料综合加工生产项目可行性研究报告模板申批拿地用
- 加油站秋安全培训内容课件
- 未来五年铁观音行业直播电商战略分析研究报告
- 小班美工《图形添画》课件
- 街道辅助人员笔试试题(附答案)
- 职场动物进化手册
- 超星尔雅学习通《工程伦理(浙江大学)》2025章节测试答案
- 系统工程课件完整版
- 七年级上册英语阅读还原50题含答案
- 《干部履历表》(1999版电子版)
- 医学课件酸碱平衡紊乱
- 铁路机车车辆驾驶人员(J5类)考试题库大全-上(单选题)
评论
0/150
提交评论