学号:课程设计课程名称操作系统学院计算机科学与技术学院专业软件工程班级姓名指导教师2014——2015学年第1学期1《操作系统原理》课程设计指导书课程编号:课程名称:操作系统/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月执笔:杨铭熙审阅:陈天煌审定:徐东平课程设计任务书学生姓名:专业班级:软件工程指导教师:刘军工作单位:计算机科学与技术学院题目: 实现读者写者(Reader-Writer Problem)问题实验条件要求:通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
每人一台与Linux主机联网的Windows主机,普通用户权限。
课程设计进度安排2014年 12月 26日目录1 设计目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计要求 (1)2 总的设计思想及系统平台、语言、工具等 (1)2.1 设计思想 (1)2.2 系统平台及使用语言 (2)2.3 开发工具的选择 (2)3 数据结构和模块说明 (2)3.1 主函数 (2)3.2 写者线程函数 (3)3.3 读者线程函数 (3)4 源程序 (5)5 运行结果与运行情况 (13)6 调试记录 (30)7 自我评析和总结 (31)8 参考文献 (32)2设计目的与要求2.1课程设计目的通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
2.2课程设计要求1.每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的标识符;2.读者应有3个以上,写者应有有两个以上;3.多个读者/写者之间须共享对存储区进行操作的函数代码。
3总的设计思想及系统平台、语言、工具等3.1设计思想为实现reader与writer线程间在读或写时的互斥设置一个互斥信号量writer_mutex。
另外,再设置一个整形变量reader_counter表示正在读的线程数目。
由于只有一个reader线程在读,便不允许writer线程去写。
因此,仅当reader_counter=0,表示尚无reader线程在读时,reader线程才需要执行wait(writer_mutex)操作。
若wait(writer_mutex)操作成功,reader线程便可以去读,相应的,做reader_counter+1操作。
同理,仅当reader线程在执行reader_counter 减1操作后其值为0时,才必须执行signal(writer_mutex)操作,以便让writer线程写。
reader_counter是一个可被多个reader线程访问的临界资源,因此,也应该为它设置一个互斥信号量reader_mutex。
3.2系统平台及使用语言本课程设计在Linux操作系统下,使用C语言完成。
用到的工具主要有GCC 编译器和VI编辑器。
3.3开发工具的选择内存:1G工具:g++,vim,geany4数据结构和模块说明4.1主函数图3-1 主函数流程图4.2写者线程函数图3-2写者线程函数流程图4.3读者线程函数图3-3 读者线程函数流程图5源程序/*reader-writer Problemauther : zhengfei rj0315Modole:Shared datasemaphore mutex, wrt;Initiallymutex = 1, wrt = 1, readcount = 0writer process:begindo {wait(wrt);writing;signal(wrt);}while(1);endReader process:begindo {wait(mutex);readcount++;if (readcount == 1)wait(rt);signal(mutex);reading;wait(mutex);readcount--;if (readcount == 0)signal(wrt);signal(mutex);}while(1);end***/#include <iomanip>#include <unistd.h>#include <stdio.h>#include <pthread.h>#include <math.h>#include <time.h>#include <stdlib.h>#include <iostream>#include <fstream>#include <string>#include <semaphore.h>#define readerNum 5#define writerNum 7#define BUFFERSIZE 20using namespace std;int writeRoom[writerNum];//to store which buffer every writer are writing int readRoom[readerNum];//to store which buffer every reader are reading int buffer[BUFFERSIZE];//the bufferstring bufferOwn[BUFFERSIZE];//who use the buffer int readcount=0;int readp=0;int writerp=0;int content_id=0;//the content id of the buffersem_t mutex;sem_t wrt;time_t now;ofstream fout("out.txt");string int2str(int n){char temp[8];sprintf(temp,"%d",n);return (string)temp;}void showbuffer(){int width=4;for(int i=0;i<BUFFERSIZE;i++){bufferOwn[i]="";fout<<setw(width)<<buffer[i];cout<<setw(width)<<buffer[i];}fout<<endl;cout<<endl;for(int i=0;i<readerNum;i++){if(readRoom[i]!=-1)bufferOwn[readRoom[i]]+="r"+int2str(i);}for(int i=0;i<writerNum;i++){if(writeRoom[i]!=-1)bufferOwn[writeRoom[i]]+="w"+int2str(i);}for(int i=0;i<BUFFERSIZE;i++){fout<<setw(width)<<bufferOwn[i];cout<<setw(width)<<bufferOwn[i];}fout<<endl;cout<<endl;}string gettime(){time(&now);string t=ctime(&now);return t;}void writing(int n){writeRoom[n]=rand()%BUFFERSIZE;//set the write place randomlywriterp=writeRoom[n];//the current write placebuffer[writerp]=content_id++;//the writing content ,the content is recognise by a series of id which will increase as 1,2,3,4...fout<<"\nwriter "<<n<<" start to write buffer"<<writerp<<" on "<<gettime();cout<<"\nwriter "<<n<<" start to write buffer"<<writerp<<" on "<<gettime();showbuffer();sleep(rand()%2+1);fout<<"\nwriter "<<n<<" finish writing buffer"<<writerp<<" on "<<gettime();cout<<"\nwriter "<<n<<" finish writing buffer"<<writerp<<" on "<<gettime();writeRoom[n]=-1;showbuffer();}void reading(int n){sem_wait (&mutex);readRoom[n]=rand()%BUFFERSIZE;fout<<"\nreader "<<n<<" start to read buffer"<<readRoom[n]<<" on "<<gettime();cout<<"\nreader "<<n<<" start to read buffer"<<readRoom[n]<<" on "<<gettime();showbuffer();sem_post(&mutex);sleep(rand()%2+1);sem_wait (&mutex);fout<<"\nreader "<<n<<" finish reading buffer"<<readRoom[n]<<" on "<<gettime();cout<<"\nreader "<<n<<" finish reading buffer"<<readRoom[n]<<" on "<<gettime();fout<<"\nthere is "<<readcount-1<<" readers are still reading"<<endl;cout<<"\nthere is "<<readcount-1<<" readers are still reading"<<endl;readRoom[n]=-1;showbuffer();sem_post(&mutex);}void *writer_thread(void * wid){while(1){/*wait(wrt);*/sem_wait(&wrt);/*writing;*/writing((int)wid);/*signal(wrt);*/sem_post(&wrt);/*sleep a while and then write again*/sleep(rand()%5+1);}}void *reader_thread(void *rid){while(1){/*wait(mutex);*/sem_wait(&mutex);readcount++;if (readcount == 1)/*wait(wrt);*/sem_wait(&wrt);/* signal(mutex);*/sem_post(&mutex);/*add emptybottle to buffer;*/reading((int)rid);/*wait(mutex);*/sem_wait(&mutex);readcount--;if (readcount == 0)/*signal(wrt);*/sem_post(&wrt);/*signal(mutex); */sem_post(&mutex);/*sleep a while and then read again*/sleep(rand()%5+1);}}int main(int argc,char *argv[]){/* init */pthread_t reader[readerNum],writer[writerNum] ;sem_init(&wrt,0,1);sem_init(&mutex,0,1);for(int i=0;i<BUFFERSIZE;i++){buffer[i]=-1;bufferOwn[i]="";}for(int i=0;i<readerNum;i++){readRoom[i]=-1;}for(int i=0;i<writerNum;i++){writeRoom[i]=-1;}/*create threads*/for(int i=0;i<readerNum;i++){pthread_create(&reader[i], NULL, reader_thread, (void *)i);}for(int i=0;i<writerNum;i++){pthread_create(&writer[i], NULL, writer_thread, (void *)i);}sleep(40);fout.close();exit(0);return 0;}6运行结果与运行情况在本程序的实现过程中,使用了vim编辑器。