


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、江苏大学计算机学院课程设计报告课程名称操作系统课程设计实验学期2010至2011学年,第 L学期学生姓名周勇专业班级计算机0801学 号 3080602049指导教师詹永照开课系计算机科学系操作系统课程组制操作系统课程设计报告实验题目:Linux系统管理实践与设计时间:2010-12-27至进程控制、进程通信实现2011-01-02一、实验目的与要求1、掌握基本的同步与互斥算法。2、学习使用Linux中基本的同步对象,掌握相关函数的使用方法。3、了解Linux中多进程的并发执行机制,实现进程的同步与互斥。4、查阅相关资料。5、熟悉各种命令、系统调用与实用程序。6、按给定功能设计相关程序。7、撰
2、写课程设计报告。二、实验内容桌上有一只盘子,盘子只能放5只水果,每次只能放一只水果或取出一只水 果。爸爸专放苹果,妈妈专放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子 中的苹果。分别用P,V操作实现他们的协作行为。三、实验设备与环境实验设备:虚拟机运行平台:Linux语言:c四、设计正文(包括分析与设计思路、各模块流程图以及带注释的主要算法源码)设计思路:设计4个进程,分别是父亲进程,母亲进程,儿子进程, 女儿进程。设置一个缓冲区,用来放水果,长度为5.所以设置一个公有信号量mutex,以限制他们对缓冲区的放和取,初值为1.另外设置私有信 号S2,S1.以控制儿子是否可以取橘子吃,女儿是否可以
3、取苹果吃。 初值都为0.还要设置一个信号量 empty,控制父亲跟母亲之间的同 步,初值为5。表示现在缓冲区有5个空位可以放。各模块流程图:nn带注释的主要算法源码:1. Co nn trol.c#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <errno.h>#include <string.h&g
4、t;#define SHMKEY 9075 /*共享存储区的键*/#define SEMKEY_EMPTY 9085#define SEMKEY_S1 9086#define SEMKEY_S2 9087#define SEMKEY_MUTEX 9082* 信号量数组的键 */#define BUFF_LEN 5 /*缓冲区可以存放个水果 */#define FRUIT_LEN 12 /*水果用字符串代替*/void set_sembuf_struct( struct sembuf *sem, int semnum, int semop, int semflg)/*设置信号量结构*/sem-&
5、gt;sem_num=semnum;sem->sem_op=semop;sem->sem_flg=semflg;main()char *addr, end;int shmid;unsigned char in;int semid_empty, semid_s1,semid_s2, semid_mutex; /*信号量id*/struct sembuf sem_tmp;/*开辟共享存储区*/if (shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777|IPC_CREAT|IPC_EXCL) = -1)if (errno = EEXIST)
6、printf("The Buffer Has Existed!n");printf( "Do You Want To Delete The Buffer(Y = yes)?n=:");scanf("%c", & end);if (end = 'y'| end ='Y')/*共享存储区、信号量并不随程序的结束而被删除,如果我们没删除的话,可以用ipcs命令查看,用ipcrm删除*/*释放缓冲区*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);
7、if (shmctl(shmid,IPC_RMID,0) < 0) perror( "shmctl:");/*同时释放信号量*/semid_mutex = semget(SEMKEY_MUTEX,1,0777);semid_empty = semget(SEMKEY_EMPTY,1,0777); semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777); semctl(semid_mutex,0,IPC_RMID);semctl(semid_empty,0,IPC_RMID); se
8、mctl(semid_s1,0,IPC_RMID);semctl(semid_s2,0,IPC_RMID);elseprintf( "Fail To Create Buffer!n" );return -1;addr = ( char *)shmat(shmid, 0, 0);/* 连接缓冲区 */memset(addr, 0, BUFF_LEN * FRUIT_LEN); shmdt(addr); /* 离开缓冲区 */*创建信号量:1个用于对缓冲区互斥,3个用于父亲、母亲、儿子、女儿同步*/if (semid_mutex = semget(SEMKEY_MUTEX,1,
9、0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST)printf("The SEMKEY_MUTEX Has Existed!n");elseprintf("Fail To Create SEMKEY_MUTEX!n");return -1;if (semid_s1 = semget(SEMKEY_S1,1, 0777|IPC_CREAT|IPC_EXCL)=-1)if (errno = EEXIST)printf( "The SEMKEY_S1 Has Existed!n");elsepr
10、intf( "Fail To Create SEMKEY S1!n");return -1;if (semid_s2 = semget(SEMKEY_S2,1, 0777|IPC_CREAT|IPC_EXCL)=-1)if (errno = EEXIST)printf(else"The SEMKEY_S2 Has Existed!n");printf( "Fail To Create SEMKEY_S2!n" ); return -1;if (semid_empty = semget(SEMKEY_EMPTY,1,0777|IPC_C
11、REAT|IPC_EXCL)=-1) if (errno = EEXIST)printf("The SEM_EMPTY Has Existed!n");elseprintf("Fail To Create SEM_EMPTY!n");return -1;/*给信号量赋初值*/set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/semop(semid_empty, & sem_tmp,1);set_sembuf_struct (&sem_tmp, 0, 0, 0); sem
12、op(semid_s1, &sem_tmp,1);/*0*/set_sembuf_struct (&sem_tmp, 0, 0, 0); semop(semid_s2, &sem_tmp,1);/*0*/set_sembuf_struct (&sem_tmp, 0, 1,0); semop(semid_mutex, & sem_tmp,1);/*1*/return 0;2. Father.c/*下面的p,v是对系统调用的简单封装 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p buf.
13、sem op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop参见课件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf参见课件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)per
14、ror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存储区地址*/unsigned char in; /*生产者存放产品的指针:它的值存放在全局缓冲区第一个字节*/int shmid; /*共享存储区id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信号量集合id*/shmid = shmget(SHMKEY, BUFF_LEN *FRUIT_LEN, 0777);/* 连接共享存储区:2 存放 in,out 的值
15、 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存储区地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 获取全局信号量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*进入临界区*/P(semid_empty); /*对私有信号量作F操作*/P(semid_mutex); /*对公有信号量作F操作*/*二者顺
16、序不能换*/in = ( unsigned char )(*p_buffer);int j=0;"apple" )&&(*(p_buffer + in * FRUIT_LEN)!=);"apple""orange" )for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)!= printf("father put a apple!n"*(p_buffer + in * FRUIT_LEN)= break;in = (in + 1) % BUFF_LEN
17、;shmdt(p_buffer); /* 离开缓冲区 */*离开临界区*/V(semid_s1);V(semid_mutex);3. Mother.c/*下面的p,v是对系统调用的简单封装 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop参见课件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn
18、(0);int V( int semid)struct sembuf v_buf; /*struct sembuf 参见课件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存储区地址*/unsigned char in; /*生产者存放产品的指针:它的值存放在全局缓冲区第一个字节
19、*/int shmid; /*共享存储区id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信号量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 连接共享存储区:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存储区地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 获取全局信号量 id*/semid_empty = semget(SEMKEY
20、_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*进入临界区*/P(semid_empty); /*对私有信号量作F操作*/P(semid_mutex); /*对公有信号量作F操作*/*二者顺序不能换*/in = ( unsigned char )(*p_buffer);int j=0;for (j=0;j<5;j+)"apple" )&&(*(p_buffer + in * FRUIT_LEN)!= "orange
21、" );"orange"if (*(p_buffer + in * FRUIT_LEN)!= printf("mother put a orange!n"*(p_buffer + in * FRUIT_LEN)= break;in = (in + 1) % BUFF_LEN; shmdt(p_buffer); /* 离开缓冲区 */*离开临界区*/V(semid_s2);V(semid_mutex);4.S on .c/*下面的p,v是对系统调用的简单封装 */int P( int semid)struct sembuf p buf;p_buf
22、.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop参见课件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf 参见课件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &
23、amp;v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存储区地址*/unsigned char in; /*生产者存放产品的指针:它的值存放在全局缓冲区第一个字节*/int shmid; /*共享存储区id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信号量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 连
24、接共享存储区:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存储区地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 获取全局信号量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*进入临界区*/P(semid s2);/*对私有信号量作P操作*/P(semid_mutex); /
25、*对公有信号量作F操作*/*二者顺序不能换*/in = ( unsigned char )(*p_buffer);int j=0;printf( "son get a orange!n" );for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)= "orange" )*(p_buffer + in * FRUIT_LEN)='0'break;in = (in + 1) % BUFF_LEN;shmdt(p_buffer); /* 离开缓冲区 */*离开临界区*/V(semid_empty)
26、;V(semid_mutex);/*下面的p,v是对系统调用的简单封装 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop参见课件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf参见
27、课件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存储区地址*/unsigned char in; /*生产者存放产品的指针:它的值存放在全局缓冲区第一个字节*/int shmid; /*共享存储区id*/int semid_empty, semid_s1,semid_s2,
28、semid_mutex; /*信号量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 连接共享存储区:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存储区地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 获取全局信号量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2
29、= semget(SEMKEY_S2,1,0777);/*进入临界区*/P(semid_s1); /*对私有信号量作P操作*/P(semid_mutex); /*对公有信号量作F操作*/*二者顺序不能换*/in = ( unsigned char )(*p_buffer);int j=0;printf( "daughter get a apple!n" );for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)= "apple")*(p_buffer + in * FRUIT_LEN)='0'
30、;break;in = (in + 1) % BUFF_LEN;shmdt(p_buffer);/* 离开缓冲区 */*离开临界区*/V(semid_empty);V(semid_mutex);五、实验结果及分析放入了 5个水果,在执行父亲进程,则该进程被阻塞roolLoci Ihast pu t an ang?!Irooiloca Ehost put an g r;)ngf 1rtjoiiocj I h()s tkc shef kt sbe | # k<? she Ji.Zin丄 /i:i./input mi crnngc!I rool tloca Ihos t k.e she#: .
31、 / fpm an apple!rnoiioca Iho? tkeihell JfIO此时执行儿子进程,吃掉一个橘子,缓冲区空位增1,唤醒了等待中的父亲进程,此时父亲可以放入一个橘子?raar>lci Itios t kcshe ./mc-a i an o r dngc pit jn nr jrtge !(ruotlocd Ihosi k-e 5 tie 1 fftoo I -Moca Etic it t keshe fl . /mea t an c range Jpy 1 3n orange I(root 1 nc itioi | ke shr 1, / srooiloea Itios
32、 t keihe ./mI an orange!put jn ot'je !root®locM Ihost heihe# ./sroo LCL'Iuca Itiu i t kt? tht fl . f fcat an oijIpu t s n pp 1 e !1 roollLho l k-E s tie | JtrooiInra Ihos t ke<;he A Vfput an app 1 e!'rooiicta Itios t./fput an appLe!rao ls t ke the fl此时橘子被吃完,再执行儿子进程,则被阻塞| 1Qi -rao
33、tloca Ihos I kestie# Nw ea t <1 n OTane !raa tPloca Itios L上KenL jn oTane!rootlocsIhoi ieshellea t a n oranp*1!raot$>loc3 llios I keshp# . /<i执行一次母亲进程,放入一个橘子,来唤醒儿子进程,此时刚才的儿子进程执行,吃掉一个橘子root loca Lhostkeshejjt/mpu t an Grange I rn« t lfK3 Iho s tkr s-hej#./mpu L an orange I tool s'lu
34、ca Ihos tkc&he./mpul an orang*J ruu L 5'Iucj Ihu $ tke thefl./mpu 1 an orange J roo t loca 1 ha s Ikeshe>u a. i_b a h ur a_a. 打 V_I *mo t 讥 oca I ho s t e-a t an orange!roo t Moca Ihos t c-a t un or Jiigf !roa t laca I Ik)s t cji t aw orange !|roo tlocalho(t an orajige 'rcot 训oca I he
35、 stke she /i kp vhe # k(Mh£ #Re 血 1#ke she J1缓冲区满,执行母亲进程,被阻塞ke she |U .Jc ke she J fl . / fke h he J Jikc shv H .Jit keshe# ./m 临 xhp# Jrti ke she# . JmrooItic troo ib!1l)ca Jtiu s i put Jan 叩卩Ie !i QQtpu t an apple' rao pMcca Itic s t pul 3n Qrange J roollocalhos t put 汕 oraige roo i'l
36、oca I boat pu i aii of jne roo l'loca Jtiu s t执行儿子进程,吃掉一个橘子,此时唤醒刚才的母亲进程,放入一个橘子3 run mji i iu ut ic lc lire nui icn i r - ytsrT覽枷巴 编种目 直和里巽谕I) 转一f rooltQca lhoji l kcshr# *7cI rootloca Ihod I root ?t cd /honEruoiLceulhusL kcshtl# ./frooii:=locu host horn?“ cd shengput an app le !(roDl ioca Itiusi
37、 I shcii|t cd kc sihe;roollocaIhos! ke she=/fI root'ioca Ihos l ke sheM5put an apple1ea t an orange!rooiJor JhoK t keshf*lfl ./mroo tlDca Itios. l ke shelfiput an orange!rrnolloca lhos l kc sh<- Jt , /mput an orange!ruolloca Ihus i kc she jl =fmput an orange-rootloca Ihos l ke shefl a./mput a
38、n orange!rooiioca JhoK t kcshflJJ女儿吃完了苹果,在执行女儿进程,则被阻塞eu I ait upp I e ! ruuihos?a I an app le ! Eroot 'Irca 】ho$eu I an appIe! rou t iJura ihu £&a! an nppI亡! Eroo t Ircai keslie I ./d I lie fie 1 # Vd I kehe Jdl1#执行父亲进程,增加一个苹果,唤醒刚才等待中的女儿进程,女儿吃掉一个苹果pul an omnue!roo t 'Incs Ihn l ke s.he5 pul an upph!rootloca IbosLpul jn app Ie J| roo t .loca lh?!i E ke shejj./f"puI an a pp1e!too tloca Ihosi kc she4 J pul aji ppi亡!(fud t 'loca Ihus I kc she |droot <lDca I hu tea t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权转让协议(海景酒店)
- 2025广东职工劳务合同
- 商品房认购合同
- 2025年门面租赁合同模板
- 护士辞职申请协议书
- 个人提成协议书范本
- 大庆医学高等专科学校《专业导学(物流管理)》2023-2024学年第一学期期末试卷
- 河南省郑州市登封市重点中学2025年初三第二次(4月)调研考试化学试题试卷含解析
- 河南林业职业学院《结构力学2》2023-2024学年第二学期期末试卷
- 四川文理学院《生物制药工程原理和技术》2023-2024学年第二学期期末试卷
- 妇女营养保健培训
- 时间序列的平稳性测试题及答案
- 2025-2030中国数据要素市场发展前景及趋势预测分析研究报告
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 2025年华润燃气投资中国有限公司招聘笔试参考题库含答案解析
- 2022年《跟徐老师学汉语》新HSK六级词汇词
- 妊娠剧吐诊断以及临床处理专家共识
- [PPT]桥梁工程桩基施工超全解析(41页 配图丰富)_ppt
- 叉车定期检验研究分析报告
- 光缆和管道的施工规范标准
- MDK5软件入门
评论
0/150
提交评论