《操作系统课程实验报告3.docx》由会员分享,可在线阅读,更多相关《操作系统课程实验报告3.docx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、中央民族大学操作系统实验报告姓名:黄越.伶学号:21011656年级:2021级院系:信息工程学.院专业:软件工程2023年4月6日exit(O);/正常结束)else/父进程(if(fork()=0)创建进程,第2个子进程,执行if写进程 /writer 写semop(semid,&pwmutex, 1);/1. val=0printf(nI am writer:n);for(k=0;k30;k+)(ak=3*k;printf(H write ak=%dnH,ak);/sleep(l);)printf(nwrite finish! !nn);semop(semid,&vwmutex, 1);
2、/1 .val= 1exit(O);正常退出else /父进程 if(fork()=0) /reader读,创建进程读进程(semop(semid,&prmutex);/*读操作 P 操作 O.val=2*/P 操作addr2=shmat(shmid,0,0); 附接,取共享内存区 shmid pint2=(int*)addr2; /O.val= 1if(*pint2=0) semop(semid,&pwmutex, 1 );/*,资源被使用时,堵塞写进程*/ *pint2=*pint2+1 ;/* 读者数 +1,0.val=2*/printf(HRead 2 enter+ count=%dn
3、,*pint2);/ printf(HRead 2 count=%dnH,count);count=2;/* 读者数*/printf(ncount=%dnn,count);semop(semid,&vrmutex, 1 );/0.val=3V 操作for(j=0;j30;j+) (printf(n reader 2 %dnn,aj);/sleep(l);)semop(semid,&prmutex, 1);P 操作coun匚count-1;*pint2=*pint2-l ;/*0.val= 1 */printf(nRead 2 exit+count=%dn”,*pin;O.val=l/print
4、f(HRead 2count=%dnn,count);V操作P操作堵塞写进程*/V操作P操作if(*pint2=0) semop(semid,&vwmutex,l);/* 唤醒写进程*/ semop(semid,&vrmutex, 1 );/0. val=2释放资源exit(O);)else /writer/writer 写if(fork()=0)创建进程写进程 /writer 写semop(semid,&pwmutex, 1);/1 .val=0printf(nI am writer:H);for(k=0;k30;k+)(ak=3*k;printf(nwrite ak=%dnH,ak);/s
5、leep(l);printf(nwrite finish! !nH);semop(semid,&vwmutex,l);/l.val= 1 exit(O);/正常退出) elsesemop(semid,&prmutex/);/*读操作 p 操作 O.val=2*/ addr2=shmat(shmid,0,0); 附接,取共享内存区 shmid pint2=(int*)addr2; /O.val= 1if(*pint2=0) semop(semid成pwmutex/);/*,资源被使用时,*pint2=*pint2+l;/* 读者数+l,0.val=2*/printf(HRead 2 enter+
6、 count=%dnn,*pint2);0.val=2/ printf(nRead 2count=%dnH,count);count=2;/* 读者数*/printf(ncount=%dnn,count);semop(semid,&vrmutex, 1 );/0. val=3 for(j=0;j18 wrttel akx21 wrttel aks24 wrttel (k27 wrttel akx30 wrttel ak33 wrttel ak36 wrttel k39 wrttel ak:42 wrttel ak45 wrltel a(ks48 wrttel aks$l wrttel ak)5
7、4 wrttel a(k)-57 wrttel wrttel akp63 wrttel ak66 wrttel akx69 wrttel ajkj=72 wrttel tk7S wrttel ak78 wrttel ak81 wrttel ak-84 wrttel tk87 write finish!Wrtter2 I an writer:wrtte2 ak-6 wrtte2 t(k)3 wrtteZ ak6 wrtte2 ak9 wrtteZ ak12 wrtt2 4k15 wrtte2 aksl8 wrtte2 ak21 wrtte2 “kj.24 wrtteZ ak=27 wrtte2
8、ak30 wrtteZ ak33 wrtt87 write finish!111 deROtdeno-virtual-machine: defiodeno-virtual-machine:reader 1 enter reader 1 eRead 2 enter* reader 2 e reader 1 1 reader 2 1 reader 2 2 reader 1 2 reader 1 3 redder 2 3 redder 1 4 reader 2 4 reader 1 5 reader 2 5 reader 2 6 reader 1 6 reader 2 7 reader 1 7 re
9、ader 2 8 reader 1 8 reader 2 9 reader 1 9 reader 2 10 reader 1 16 reader 2 11 reader 1 11 reader 2 12 reader 1 12 reader 2 13 reader 1 13 reader 2 14 reader 1 14 reader 2 IS reader 1 15 reader 2 16 reader 1 16 reader 2 17 reader 1 17 reader 2 18countslcount2$ gcc dx.c -o dx.exe $ ./dx.exereader 1 re
10、ader 2 reader 1reader 2 reader 11819192020reader 2 21 reader 1 21 reader 2 22 reader 1 22 reader 2 23 redder 1 23 reader 2 24 reader 1 24 reader 2 25 reader 1 2S reader 2 26 reader 1 26 reader 2 27reader 1 28reader 2 29reader 1 29Read 2 exit* countl reader 1 exit- countswriters rlte2 wrtte2 wrtteZ w
11、rtte2 wrtte2 wrtte2 wrtU2 wrtteZ wrtte2 wrtte2 wrtte2 wrtteZ wrtte2 wrlte2 wrtte2 wrlte2 wrtte2 wrtte2 wrtteZ wrtte2 wrtte2 wrtte2 wrtteZ wrtte2 wrtte2 wrltt2 wftte2 wrtte2 wrtte2 write wrtterl wrltel wrttel wrttel write!rltelI ar wrlter:wrlte2 ak6”k6 ak=9【k】12 ak=15 ak18 (N-21 a(k-24 ak27 ak=30(M-3
12、3 dk36 a(M-39 ak=42k4S ak=484M-54 “力” akx66 aks63 d(k66 dke69 ak”72 arkl=75(M-78 akx81 ak-84 akx87 finish!I1 an writer:wrttel ak=0 a(M-3 dk-6 “9 ak=12writer 1 I an writer:wrttel akO wrttel ak)3 wrttel ak)6 wrttel ak9 wrttel ak-12 wrltel aklS wrttel a(kxi8 wrttel (k)21 wrttel ak24 wrttel (k27 wrttel
13、akx30 wrttel ak33 wrttel “k=36 wrttel ajkj.39 wrttel a(k)42 wrttel d(k)45 wrttel k48 wrttel ak=51 wrttel 4(ka54 wrttel akj=57 wrttel ak60 wrttel ak-63 wrttel 4(k66 wrttel aks69 wrttel aks72 wrttel ak7S wrttel aks78 wrttel ak)81 wrttel d(k)-84 wrttel k87 write finish!denofdeRo-vtrtual-RAchtne:$ |4、两个
14、读者,两个写者,读者2执行sleep(l)操作,读者1不执行demo)demo-vlrtual-fnachine: -/lab3Read 2 exit* count=6dtRO*defio-vtrtual-nachiM:SdRO*dcfio-vtrtual-nchtne:$gcc dx.c-o dx.exedMOfdMO-vtrtual-machine:$./dx.exereader 1 enter- countslreader 1 o reader 1 1 reader 1 2 reader 1 3 reader 1 4 reader 1 5 reader 1 6 reader 1 7 re
15、ader 1 8 reader 1 9 reader 1 10 reader 1 11 reader 1 12 reader 1 13 reader 1 14 reader 1 exit- counted Wrtterl I a writer:wrttel “k=e wrttel ak3 wrttel d(k6 wrttel ak=9 wrttel kal2 wrttel ak=lS wrttel ak18 wrttel ak21 wrttel ak*24 wrttel ak=27 wrttel akj30 wrttel ak33 wrttel ak-36 wrltel ka39 wrttel
16、 a(k=42 write ftntshlllI WriterZ I aw writer:wrtte2 ak=e wrlte2 ak3 wrtte2 a(ks6 wrtte2 “kj9 wrtte2 ak12 wrtte2 aklS wrtt18 wrlteZ ak21 wrtteZ ak24 wrtte2 ak27 wrtte2 ak30 wrtte2 a(k)33 wrtte2 dk36 write? ak39 wrtte2 ak=42 write ftntihl111 Redd 2 enterww countlreader 2 0writerzI d writer:write2ak0wr
17、tteZ ak3 wrtteZ ak6 wrtte2 akB9 wrtte2 ak-12 write? ak=15 wrtteZ dk18 writeZ ak=21 wrtte2 ak24 wrtteZ a(k27 wrtte2 ak=3 wrtt2 ak33 wrtteZ ak=36 wrtte2 ak39 wrtte2 ak=42 write finish!I!Read 2 enter* countl reader 2 0:$ reader 2 1reader 2 2 reader 2 3 reader 2 4 reader 2 S reader 2 6 reader 2 7 reader
18、 2 8 reader 2 9 reader 2 10 reader 2 11 reader 2 12 reader 2 13 reader 2 14Read 2 exit* counted5、3个读者3个写者AdemoOdemo-vktuAl-fnMhlne: /Ub9Q E -oxtf9RO*dwiovtrtuiX.Rchtn3 wrttel ak=6 wrttel ak9 wrttel ak=12 wrttel ak)15 wrttel a(k18 wrttel d(k21 write: “k=24 wrttel akx27 wrttel Jkj3e wrttel a(kj33 wrtt
19、el ak36 wrttel ak=39 wrttel ak42 wrttel finish!I!Read 2 enter* countaldemoOdmo-vktual-mchine: /leb3reader 2 0 reader 2 1 reader 2 2 reader 2 3 reader 2 4 reader 2 5 reader 2 6 reader 2 7 reader 2 8 reader 2 9 reader 2 10 reader 2 11 reader 2 12 reader 2 13 reader 2 14 Read 3 enter* count2 redder 3 6
20、 reader 3 1 reader 3 2 reader 3 3 reader 3 4 reader 3 5 reader 3 6 reader 3 7Aredder2 5reader2 6reader2 7reader2 8reader2 9redder2 10reader2 11reader2 12reader2 13reader2 14Read 3 icounts?reader reader3 ereader3 2reader3 3reader3 4reader3 5reader3 6reader3 1reader3 8reader3 9reader3 16reader3 11read
21、er3 12reader3 13reader3 14Read 2 ,countalRead 3 ,count-0Writer 3I writer:wrtt3wrtte3a(k=3write!ak6write)*k=9wrtte3ak-12wrtte3a(k-15wrtte3a(kj18wrttelwrtte3ak=24write!k27writerak=36wrttelak33write)a(k36writerak=39write)k.42wrtte3ftntshl!11Writer?I s writer:wrtt2write?ak=3wrtte2k 卜6wrtte2*k=9wrtte2ak=
22、12wrlte2(k-15wrtte2akxl8wrtte2(k-21wrtte2ak-24wrtte2“k27write2k-30wrtte2ak=33writeak36wrtte2ak-39writewrtteJftntshl 1Uachtne:“kje“k。五、实验结果分析分析:代码以读者优先的方式进行(读者读的时候写者不能写,多个读者可以同时读,)该代码通过创建3个信号量来实现读写进程间的互斥和同步,以防止并发读写造成的数据不 一致问题。无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。程序中的主函数通过创建4个字节的共享内存区,并将一个信号量记得的首地址赋值给指
23、针pinto在后续读写进程中,通过附接共享内存区,即将共享内存区映射到进程的虚拟地址空间 中,实现进程间的数据共享。同时,在读进程中,为了实现互斥和同步,需要对共享资源(即共 享内存区)加锁和解锁,通过信号量来实现。具体来说,通过对semid信号量集中的3个信号量 进行初始化,其val都为1,其中前两个信号量实现对读者写着互斥使用,第一个信号量记录读 者是否使用资源,并且多个读者可以一起使用资源,当没有读者占用资源时就可以唤醒写者使用 资源;第2个信号量记录写者是否使用资源,当写着使用资源时其它读者、写者都不能使用资 源。在主函数中,先创建了 30 (可修改)个整型数组,然后创建了 4个进程,
24、其中两个读进程 代表两个读者、两个写进程代表两个写着,通过调用semopO函数实现对互斥锁和读写锁的控 制。进程执行时对整型数组中的元素重新赋值或者打印实现写、读的功能。六、实验总结和心得通过实验我掌握读者写者进程同步原理、掌握Linux系统的system V信号量机制,学 会了利用system V信号量机制,实现读者写者进程同步问题,虽然接受新的知识不太好理 解,但是通过实验,已经能掌握好一些了,实验的成功增加了我对知识掌握程度的信心。实验三:进程同步实验一、实验目的1、掌握读者写者进程同步原理2、掌握Linux系统的system V信号量机制3、利用system V信号量机制,实现读者写者
25、进程同步问题二、实验基本原理1、在计算机操作系统中,PV操作是进程管理中的难点。首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过 程),对信号量进行操作,具体定义如下:P(S):将信号量S的值减1, BP S=S-1;如果S,则该进程继续执行;否则该进程置为等待状态,排入等待队列。V (S):将信号量S的值加1,即S=S+1;如果S0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。PV操作属于进程的低级通 信。什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向
26、等待该信号量的 下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于。时,表示当前可用资源的数 量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操 作来改变。一般来说,信号量S20时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资 源,因此S的值减1;当SvO时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源, 它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若SW0,表示有某 些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。2 linux的进程同步原语(1) wait。;阻塞父进程
27、,子进程执行(2) #include #include key_t ftok (char*pathname, char proj);它返回与路径pathname相对应的一个键值。(3) int semget(key_t key, int nsems, int semflg)(System V 信号量)参数key是一个键值,由ftok获得,唯一标识一个信号灯集,用法与msgget()中的key相同;参数 nsems指定打开或者新创建的信号灯集中将包含信号灯的数目;semflg参数是一些标志位。参数key 和semflg的取值,以及何时打开已有信号灯集或者创建一个新的信号灯集与msgget()中的
28、对应部分相 同,不再祥述。该调用返回与健值key相对应的信号灯集描述字。调用返回:成功返回信号灯集描述 字,否则返回-1。注:如果key所代表的信号灯已经存在,且semget指定了 IPC_CREAT|IPC_EXCL标志,那么即使参 数nsems与原来信号灯的数目不等,返回的也是EEXIST错误;如果semget只指定了 IPC_CREAT标 志,那么参数nsems必须与原来的值一致,在后面程序实例中还要进一步说明。(4) int semop(int semid, struct sembuf *sops, unsigned nsops) (System V 信号量)semid是信号灯集ID,
29、 sops指向数组的每一个sembuf结构都刻画一个在特定信号灯上的操作。nsops 为sops指向数组的大小。此系统调用实现信号量加1、减1操作。(5) int semctl(int semid, int semnum, int cmd, union semun arg)(System V 信号量)该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类 型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信 号灯信息。该系统调用详细信息请参见其手册页,这里只给出参数cmd所能指定的操作。IPC_STAT获取信号灯
30、信息,信息由arg上uf返回;IPC_SET设置信号灯信息,待设置信息保存在arg上uf中(在manpage中给出了可以设置哪些信 息);GET ALL 返回所有信号灯的值,结果保存在arg.array中,参数sennum被忽略;返回等待semnum所代表信号灯的值增加的进程数,相当于目前有多少进程在等待 semnum代表的信号灯所代表的共享资源;GETPID返回最后一个对semnum所代表信号灯执行semop操作的进程ID;GETVAL返回semnum所代表信号灯的值;GETZCNT返回等待semnum所代表信号灯的值变成0的进程数;_ 通过arg.array更新所有信号灯的值;同时,更新与
31、本信号集相关的semid_ds结构的 SET ALL.4 口sem_ctime 成贝;S ETV AL 设置semnum所代表信号灯的值为arg.val;3.UNIX SystemV 共享内存:a. int shmget(key_t key,int size,int shmflg);该函数会在内存中创建一个指定大小的共享缓冲区,并返回缓冲区的ID标识值若失败则返回-1.Key:系统关键字,一般用IPC_PRIVATE。Size:指定缓冲区大小。Shmflg:共享标志,一般用Oo用法:shmid=shmget(IPC_PRIVATE, 1024,0);创建一个1K的共享缓冲区。b. void *shmat(int shmid,const void shmaddr,int shm