课程设计。
目录 1课程设计任务书 2
正文 31.设计目的与要求 3
1.1设计目的 3
1.2设计要求 3
2.设计思想及系统平台 3
2.1设计思想 3
2.2系统平台及使用语言 4
3.详细算法描述 4
4.源程序 7
5.运行结果与运**况 10
6.调试过程 12
7.总结 13
本科生课程设计成绩评定表 14
学生姓名专业班级。
指导教师工作单位: 计算机科学与技术学院
题目: 实现读者写者(reader-writer problem)问题。
初始条件:1. 操作系统:linux
2. 程序设计语言:c语言。
3. 设有20个连续的存储单元,写入/读出的数据项按增序设定为1-20这20个字符。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.技术要求:
1)为每个读者/写者产生一个线程,设计正确的同步算法。
2)每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。。
3)读者应有3个以上,写者应有有两个以上。
4)多个读者/写者之间须共享对存储区进行操作的函数**。
2. 设计说明书内容要求:
1)设计题目与要求。
2)总的设计思想及系统平台、语言、工具等。
3)数据结构与模块说明(功能与流程图)
4)给出用户名、源程序名、目标程序名和源程序及其运行结果。(要注明存储各个程序及其运行结果的主机ip地址和目录。)
5)运行结果与运**况。
提示: (1)连续存储区可用数组实现。
2)编译命令可用: cc -lpthread -o 目标文件名源文件名。
3)多线程编程方法参见附件。)
3. 调试报告:
1) 调试记录。
2) 自我评析和总结。
上机时间安排:
指导教师签名201年 1 月 11 日。
系主任(或责任教师)签名201年 1 月 11 日。
通过研究linux的线程机制和信号量实现读者写者问题 (reader-writer problem )的并发控制。
1)为每个读者/写者产生一个线程,设计正确的同步算法。
2)每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当。
前指针位置和读者/写者线程的自定义标识符。
3)读者应有3个以上,写者应有有两个以上。
4)多个读者/写者之间须共享对存储区进行操作的函数**。
为实现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。
除此之外,各线程也共享输出文件,特别是reader线程,有可能多个reader线程同时使用输出文件。为避免输出混乱,也应该为其设置一个互斥信号量print_mutex。
本课程设计在linux操作系统下,使用c语言完成。用到的工具主要有gcc编译器和vi编辑器。
本程序解决读者——写者问题的大致算法思想前一部分已描述,此外,本程序通过alarm()设置程序的运行时间,一旦超时,将设置超时变量timeout=1。一旦设置超时变量,所有的读者线程和写者线程将不再进行下一轮的读/写操作。每个线程执行完一轮的读/写操作,将休息一会后继续进行下一轮的读/写操作,直到超时变量为1。
本程序的读/写操作都是随机进行的。
共享数据:semaphore writer_mutex=1;
semaphore reader_mutex=1;
semaphore print_mutex=1;
int reader_counter=0;
writer线程的处理函数:
while(1){
wait(writer_mutex);
reading;
signal(writer_mutex);
if(timeout==1)break;
sleep();
writer线程的处理函数流程图如下:
reader线程的处理函数:
while(1){
wait(reader_mutext);
if(reader_counter==0)wait(writer_mutex);
reader_counter++;
signal(reader_mutex);
reading;
wait(reader_mutext);
reader_counter--;
if(reader_counter==0)signal(writer_mutex);
signal(reader_mutex);
reading;
if(timeout==1)break;
sleep();
reader线程的处理函数流程图如下:
源程序如下:
#include<>
#include<>
#include<>
#include<>
#include<>
#include
#include<>
#include<>
#include<>
#include<>
#define num_threads_rd 5 /*define the number of reader*/
#define num_threads_wr 5 /*define the number of writer*/
#define max_buffer 20
#define run_time 20
int reader_counter=0; /to count the number of reader who is reading*/
int timeout=0; /time out write_pointer*/
int buffer[max_buffer]; difine the buffer */
sem_t writer_mutex,reader_share,print_mutex;
pthread_t threads_rd[num_threads_rd]; reader*/
pthread_t threads_wr[num_threads_wr]; writer*/
file* fd;
void* writer_thread(void*);
void* reader_thread(void*);
void writing(int);
void reading(int);
void showbuf();show the concent of buffer*/
void handler(){
timeout=1; /set the timeout flag*/
int main(){
int i;
fd=fopen(""w");open a file to s**e the result*/
signal(sigalrm,handler);
sem_init(&reader_share,0,1); set the value of semaphores*/
sem_init(&writer_mutex,0,1);
sem_init(&print_mutex,0,1);
for(i=0;i /*create the threads*/
for(i=0;i pthread_create(&threads_wr[i],null,(void*)writer_thread,(void*)i);
操作系统大作业a
一 填空 14分 1 在设备管理中,为了克服独占设备速度较慢 降低设备资源利用率的缺点,引入了虚拟分配技术即用共享设备模拟独占设备。2 常用的内存管理方法有和。3 动态存储分配时,要靠硬件地址变换机构实现重定位。4 在存储管理中常用虚拟存储器方式来摆脱主存容量的限制。5 在页式管理中,页式虚地址与内...
操作系统大作业a
一 填空 14分 1 在设备管理中,为了克服独占设备速度较慢 降低设备资源利用率的缺点,引入了即用共享设备模拟独占设备。2 常用的内存管理方法有和。3 动态存储分配时,要靠硬件地址变换机构实现。4 在存储管理中常用方式来摆脱主存容量的限制。5 在页式管理中,页式虚地址与内存物理地址的映射是由和完成的...
操作系统大作业
学号 091401223 姓名 高玉林 本次上机作业使用的软件是microsoft visual studio community 2017 rc,版本 15.0.26020.0,使用的语言是c 第一题 编写求f x 值的程序。f x f1 x f2 x f3 x f1 x 10 x f2 x 10...