您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统--课设-附原吗
操作系统课程设计目的本课程设计是计算机科学与技术专业重要核心课的--大型实验课。通过本课程设计,使学生对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的掌握,从而加深理解操作系统的工作原理和实现方法。课程设计题目用信号量机制解决生产者消费者问题(有若干生产者和若干消费者共享一个容量为N的缓冲器,使用信号量机制写出生产者与消费者进程)(限3人小组)1.设父进程创建一个子进程作为生产者,创建两个子进程作为消费者,这三个子进程使用一个共享内存,该共享内存定义为具有5个变量的数组,每个变量表示一个缓冲区,缓冲区号为0~4。生产者进程依次往缓冲区0~4中写10个数据1~10,两个读进程依次从缓冲区0~4中轮流取出这10个数据。使用信号量实现进程读写缓冲区的同步和互斥。分析:⑴需要创建3个子进程:生产者、消费者A、消费者B;⑵需要使用3个信号量:empty、full、mutex,分别表示缓冲区是否有空、是否有数和互斥信号量,其初值分别为:5,0,1;⑶需要2个共享内存:array和get,分别表示多缓冲区数组变量array[0]~[4]、和消费者读缓冲区号的计数get,get计数由两个消费者进程共享,由于生产者只有一个,所以写缓冲区号的计数set不需要使用共享内存。(4)3个子进程结束后,由父进程输出两个消费者进程所读出的数据累加和。2.用P、V操作实现下述问题的解。桌上用一个盘子,可以放一个水果,父亲总放苹果到盘子上,而母亲总放香蕉到盘子上;一个儿子专等吃盘子上的香蕉;而一个女儿专等吃盘子中的苹果。设共有10个苹果10个香蕉。(若有两个缓冲区,程序如何改变)。考核方式要求小组合作完成题目,每个小组提交1份课程设计报告即可。成绩分为优、良、中、及格和不及格。主要分为3个部分,考勤40%,系统设计30%,系统实现占30%。教师可根据学生的个人在团队中的表现上浮或下调其成绩。课程设计时间进度安排地点:操作系统实验室时间:9-26至11-8下午。其他时间上午小组讨论、编写和修改程序。10月16日前将系统设计方案提交:xiekai@bigc.edu.cn11月26日前完成系统调试11月28日交设计报告对课程设计报告的要求1.封皮正确2.完整描述课程设计的主要内容。3.详细描述系统设计,系统框架、关键处理流程等。4.系统和测试的实现,描述关键的数据结构和算法。5.结果分析6.总结源代码:1.#includeunistd.h#includestdio.h#includestdlib.h#includestring.h#includesys/types.h#includelinux/sem.hintj=0;main(){intarray;//共享内存arrayintget;//共享内存getintset=0;//生产者存入的下标位置intcustomer_a,customer_b;//消费者A,B进程intproducer;//生产者进程int*viraddr;//虚地址intmutex,empty,full;//信号量inti,m;intgetnum;intsum_a=0;intsum_b=0;intaget;intbget;structsembufP,V;unionsemunarg;//共用体get=shmget(IPC_PRIVATE,4*sizeof(int),0666|IPC_CREAT);//创建共享存储区getviraddr=(int*)shmat(get,0,0);//挂起for(i=0;i3;i++)//get的0下标用来存读取的下标1下标来存a累加和2下标存b累加和{viraddr[i]=0;}array=shmget(IPC_PRIVATE,5*sizeof(int),0666|IPC_CREAT);//创建共享存储区arrayempty=semget(IPC_PRIVATE,1,0666|IPC_CREAT);//创建信号量empty初始化arg.val=5;if(semctl(empty,0,SETVAL,arg)==-1)perror(semctlsetvalerror1);full=semget(IPC_PRIVATE,1,0666|IPC_CREAT);//fullarg.val=0;if(semctl(full,0,SETVAL,arg)==-1)perror(semctlsetvalerror2);mutex=semget(IPC_PRIVATE,1,0666|IPC_CREAT);//mutexarg.val=1;if(semctl(mutex,0,SETVAL,arg)==-1)perror(semctlsetvalerror3);P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;//50V.sem_op=1;V.sem_flg=SEM_UNDO;//********************************************************while((producer=fork())==-1);//创建生产者子进程if(producer==0)//如果生产者子进程返回{for(i=1;i=10;i++){semop(empty,&P,1);//P(empty);semop(mutex,&P,1);//P(mutex);printf(生产者写入数据%d\n,i);//写数据到共享存储区viraddr=(int*)shmat(array,0,0);//挂起viraddr[set]=i;//往set缓冲区存数//sleep(2);set++;if(set4){set=set-5;}semop(mutex,&V,1);//V(mutex);semop(full,&V,1);//V(full);}exit(0);}else//如果父进程返回{while((customer_a=fork())==-1);//创建消费者A子进程if(customer_a==0)//如果消费者A进程返回{for(i=0;i5;i++){semop(full,&P,1);//P(full);semop(mutex,&P,1);//P(mutex);viraddr=(int*)shmat(get,0,0);getnum=viraddr[0];//getnum存要读取的位置的下标viraddr[0]=viraddr[0]+1;//下标加一if(getnum4)//下标大于4循环{getnum=getnum-5;}viraddr=(int*)shmat(array,0,0);//array挂起aget=viraddr[getnum];//A读的数存入aget中printf(消费者A读出数据:);//从共享存储区中取数据printf(%d\n,viraddr[getnum]);viraddr=(int*)shmat(get,0,0);viraddr[1]=viraddr[1]+aget;//累加和semop(mutex,&V,1);//V(mutex);semop(empty,&V,1);//V(empty);}printf(end\n);exit(0);}//100else//如果父进程返回{while((customer_b=fork())==-1);//创建消费者B子进程if(customer_b==0)//如果消费者B进程返回{for(i=0;i5;i++){semop(full,&P,1);//P(full);semop(mutex,&P,1);//P(mutex);viraddr=(int*)shmat(get,0,0);getnum=*viraddr;*viraddr=*viraddr+1;if(getnum4){getnum=getnum-5;}viraddr=(int*)shmat(array,0,0);//挂接arraybget=viraddr[getnum];printf(消费者B读出数据:);//从共享存储区中取数据printf(%d\n,viraddr[getnum]);viraddr=(int*)shmat(get,0,0);viraddr[2]=viraddr[2]+bget;//累加和sum_b=sum_b+viraddr[getnum];semop(mutex,&V,1);//V(mutex);semop(empty,&V,1);//V(empty);}printf(end\n);exit(0);}else{wait(0);wait(0);wait(0);printf(waitfinish!\n);viraddr=(int*)shmat(get,0,0);printf(suma=%d\n,viraddr[1]);printf(sumb=%d\n,viraddr[2]);shmdt(viraddr);//断开两个共享区shmctl(array,IPC_RMID,0);//撤消两个共享区shmctl(get,IPC_RMID,0);semctl(mutex,IPC_RMID,0);//撤消三个信号量semctl(empty,IPC_RMID,0);semctl(full,IPC_RMID,0);exit(0);}}}}2.#includeunistd.h#includestdio.h#includestdlib.h#includestring.h#includesys/types.h#includelinux/sem.hmain(){intplate;intfather,mother,son,daughter;int*viraddr;intsem_empty,sem_apple,sem_banana,sem_mutex;intf,m,s,d;structsembufP,V;unionsemunarg;plate=shmget(IPC_PRIVATE,sizeof(int),0666|IPC_CREAT);viraddr=(int*)shmat(plate,0,0);//*********************************sem_empty=semget(IPC_PRIVATE,1,0666|IPC_CREAT);arg.val=1;if(semctl(sem_empty,0,SETVAL,arg)==-1)perror(semctlsetvalerror);sem_apple=semget(IPC_PRIVATE,1,0666|IPC_CREAT);arg.val=0;if(semctl(sem_apple,0,SETVAL,arg)==-1)perror(semctlsetvalerror);sem_banana=semget(IPC_PRIVATE,1,0666|IPC_CREAT);arg.val=0;if(semctl(sem_banana,0,SETVAL,arg)==-1)perror(semctlsetvalerror);sem_mutex=semget(IPC_PRIVATE,1,0666|IPC_CREAT);arg.val=1;if(semctl(sem_mutex,0,SETVAL,arg)==-1)perror(semctlsetvalerror);P.sem_num=0;P.sem_op=-1;P.sem_flg=SEM_UNDO;V.sem_num=0;V.sem_op=1;V.sem_flg=SEM_UNDO;while((father=fork())==-1);if(father==0{for(f=10;f0;f--){semop(sem_empty,&P,1);//P(sem_empty)semop(sem_mutex,&P,1);//P(sem_mutex)printf(父亲放苹果\n);
本文标题:操作系统--课设-附原吗
链接地址:https://www.777doc.com/doc-6448096 .html