操作系统课程设计

  • 格式:docx
  • 大小:266.63 KB
  • 文档页数:20

课 程 设 计2014——2015学年 第1学期课程名称操作系统学 院 计算机科学与技术学院专 业软件工程专业 班 级软件1201 姓 名 柏 扬 指导教师刘 军《操作系统原理》课程设计指导书课程编号:课程名称:操作系统/Operating System周数/学分:1周/1学分先修课程:高级语言程序设计、汇编语言、数据结构、计算机组成原理适用专业:计算机科学与技术、软件工程开课学院、系或教研室:计算机科学与技术学院一、课程设计的目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。

二、课程设计的内容和要求1.系统调用学习在Linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核空间中实现对用户空间的读写。

这个函数的功能是返回当前的系统时间。

实验条件要求:每人一台Linux主机且有超级用户权限。

2.内核定时器通过研究内核的时间管理算法学习内核源代码。

然后应用这些知识并且使用“信号”建立一种用户空间机制来测量一个多线程程序的执行时间。

实验条件要求:每人一台Linux主机且有超级用户权限。

3.实现生产者消费者(Bounded – Buffer Problem)问题通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。

实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。

4.实现读者写者(Reader-Writer Problem)问题通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。

实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。

三、课程设计进度安排四、课程设计说明书与图纸要求应包含如下内容:1.设计题目与要求2.总的设计思想及系统平台、语言、工具等。

3.数据结构与模块说明(功能与流程图)4.源程序5.运行结果与运行情况6.调试记录7.自我评析和总结五、课程设计评分标准注:优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格。

六、课程设计参考资料推荐教材:《Operating System Concepts(Sixth Edition)(操作系统概念)影印版》,主编:AbrahamSilberschatz出版社:高等教育出版社出版或修订时间:2003年10月参考书:《计算机操作系统教程(第三版)》主编:张尧学出版社:清华大学出版社出版或修订时间:2001年7月《操作系统原理(第三版)》,主编:庞丽萍出版社:华中科技大学出版社出版或修订时间:2000年12月执笔:杨铭熙审阅:陈天煌日期2005年8月29审定:徐东平日期2005年9月10课程设计任务书题目: 实现生产者消费者(Bounded – Buffer Problem)问题初始条件:学习了高级语言程序设计、汇编语言、数据结构、计算机组成原理课程,掌握了一种计算机高级语言。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。

实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。

时间安排:指导教师签名: 2014年12月26日系主任(或责任教师)签名:年月日目录1.设计题目与要求 (1)1.1题目: 实现生产者消费者(Bounded-Buffer Problem) 问题 (1)1.2要求 (1)1.2.1初始条件 (1)1.2.2技术要求 (1)2.问题简介 (1)2.1问题背景 (1)2.2问题分类 (2)2.3基本解决方案 (2)3.设计思想及原理 (2)4.系统平台、语言及工具 (4)5. 数据结构与模块说明(功能与流程图) (4)5.1数据结构 (4)5.2模块说明 (4)6.程序源码及运行结果 (5)6.1程序源代码 (5)6.2运行结果 (9)7.总结 (9)8.参考文献 (10)实现生产者消费者(Bounded-Buffer Problem) 问题1.设计题目与要求1.1题目: 实现生产者消费者(Bounded-Buffer Problem) 问题1.2要求1.2.1初始条件1.操作系统:Linux2.程序设计语言:C语言3.有界缓冲区内设有20个存储单元,其初值为0。

放入/取出的数据项按增序设定为1-20这20个整型数。

1.2.2技术要求1)为每个生产者/消费者产生一个线程,设计正确的同步算法2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。

3)生产者和消费者各有两个以上。

4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。

2.问题简介2.1问题背景生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。

在同一个进程地址空间内执行的两个线程。

生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。

消费者线程从缓冲区中获得物品,然后释放缓冲区。

当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

2.2问题分类根据缓冲区的个数、大小以及生产者消费者的个数可以分为以下几类:1.单缓冲区(适合单或多生产消费者);2.环行多缓冲区(或无穷缓冲区)单生产消费者;3.环行多缓冲区多生产消费者;2.3基本解决方案1.用进程通信(信箱通信)的方法解决;2.进程消息缓冲通信;3.进程信箱通信;3.设计思想及原理在操作系统原理课程中,我们已经了解到了可以采用信号量来解决n个进程的临界区问题,这n个进程共享一个信号量mutex(mutual exclusion),并初始化的组织结构如下图。

为1。

每个进程Pi由于本系统我们研究的是有限缓冲区(Bounded-Buffer)的生产者消费者问题。

而且根据初始条件可知,该缓冲区内有20个缓冲项,每个缓冲项存储一个整形数。

信号量mutex提供了对缓冲池访问的互斥要求,并初始化为1。

信号量empty和full分别用来表示空缓冲项和满缓冲项的数量。

信号量empty初始化为20,而信号量full初始化为0;生产者进程和消费者进程的代码如图。

注意生产者和消费者之间的对称性可以这样来理解代码:生产者为消费者生产满缓冲项,或消费者为生产者生产空缓冲项。

4.系统平台、语言及工具此实验在操作系统Ubuntu9.10下实现,主要用到的工具为vi和gedit(用于源代码的编辑),以及GCC工具(用于源代码的编译链接等)。

具体版本: Vi(7.2.245)gcc(4.4.1)5. 数据结构与模块说明(功能与流程图)5.1数据结构该系统用到的有限缓冲区采用数组实现5.2模块说明该实验主要分为三大模块:1.主程序,控制程序的流程,其中控制线程的活动以及信号量的操作。

2.生产者模块:生产者对缓冲区的操作3.消费者模块:消费者对缓冲区的操作5.3 程序相关模块的流程图(生产者线程流程图)(消费者线程流程图)6.程序源码及运行结果6.1程序源代码#include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<semaphore.h> #include<signal.h>#define num_producer 3#define num_consumer 3 //由于题目要求生产者和消费者各有两个以上,故此处均定为3个#define BUFFER_SIZE 20 //定义缓冲区的大小,按题目要求为20int NUM=1; //题目要求放入/取出的数据项按增序设定为1-20,因此定义此全局变量int buffer[BUFFER_SIZE];int nextp=0,nextc=0;sem_t empty,full,mutex;//主函数int main(){int i;signal(SIGALRM,handler);sem_init(&empty,0,BUFFER_SIZE);sem_init(&full,0,0);sem_init(&mutex,0,1);for(i=0;i<BUFFER_SIZE;i++) buffer[i]=0;for(i=0;i<num_producer;i++)pthread_create(&threads_p[i],NULL,(void*)producer_thread,(void*)(i+1));for(i=0;i<num_consumer;i++)pthread_create(&threads_c[i],NULL,(void*)consumer_thread,(void *)(i+1));for(i=0;i<num_producer;i++) pthread_join(threads_p[i],NULL);for(i=0;i<num_consumer;i++) pthread_join(threads_c[i],NULL);sem_destroy(&empty);sem_destroy(&full);sem_destroy(&mutex);return 0;}//消费者代码void *consumer_thread(void *tid){int i;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); while(1){sem_wait(&full);srand((int)time(NULL)*(int)tid);sem_wait(&mutex);printf("消费者标识:%d\t指针位置:%d\t\n",(int)tid,nextc); buffer[nextc]=0;nextc=(nextc+1)%20;printf("缓冲区:");for(i=0;i<BUFFER_SIZE;i++){printf("%3d",buffer[i]);}printf("\n");sem_post(&mutex);sem_post(&empty);srand((int)time(NULL)*(int)tid);sleep(1);}return ((void*)0);}//生产者代码void *producer_thread(void *tid){int i;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); while(1){sem_wait(&empty);srand((int)time(NULL)*(int)tid);sleep(1);while((nextp+1)%20==nextc);sem_wait(&mutex);if(NUM>20) NUM=1;//如果大于20,NUM重新为1buffer[nextp]=(NUM++);nextp=(nextp+1)%20;if(nextp==0){printf("生产者标识:%d\t指针位置:19\t\n",(int)tid);}else{printf("生产者标识:%d\t指针位置:%d\t\n",(int)tid,nextp-1); }printf("缓冲区:");for(i=0;i<BUFFER_SIZE;i++){printf("%3d",buffer[i]);}printf("\n");sem_post(&mutex);sem_post(&full);srand((int)time(NULL)*(int)tid);}return ((void*)0);}6.2运行结果程序按Ctrl+Z终止运行,即进程挂起,可使用fg %id 继续运行查看结果7.总结进程的同步与互斥是操作系统课程中非常重要的一部分内容。