好文档 - 专业文书写作范文服务资料分享网站

华科操作系统实验报告要点

天下 分享 时间: 加入收藏 我要投稿 点赞

运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。

1.4 源代码

1:

#include #include #include #include #include int ticket=300; int mutex; void p(int semid,int semno) { struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid,&sop,1); } void v(int semid,int semno) { struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1); } void thread1(void) { int i; p(mutex,0); printf(\窗口1:本航班共有%d个座位,请问您需要买几张?\\n\ scanf(\ if(i>ticket) printf(\窗口1:剩余票数不够\ else ticket=ticket-i; v(mutex,0); } void thread2(void) { 1

第 4 页

int i; p(mutex,0); printf(\窗口2:本航班共有%d个座位,请问您需要买几张?\\n\ scanf(\ if(i>ticket) printf(\窗口2:剩余票数不够\ else ticket=ticket-i; v(mutex,0); } void thread3(void) { int i; p(mutex,0); printf(\窗口3:本航班共有%d个座位,请问您需要买几张?\\n\ scanf(\ if(i>ticket) printf(\窗口3:剩余票数不够\ else ticket=ticket-i; v(mutex,0); } int main() { pthread_t id1,id2,id3; int ret1,ret2,ret3; union semun arg; mutex =semget(IPC_PRIVATE,IPC_CREAT); arg.val = 1; semctl(mutex,0,IPC_RMID,0); ret1=pthread_create(&id1,NULL,(void*)thread1,NULL); ret2=pthread_create(&id2,NULL,(void*)thread2,NULL); ret3=pthread_create(&id3,NULL,(void*)thread3,NULL); if(ret1!=0){ printf(\ exit(1); } if(ret2!=0){ printf(\ exit(1); } if(ret3!=0){ printf(\ exit(1); } pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_join(id3,NULL); 1

第 5 页

return 0; } 2:

#include #include #include #include #include int q[100]; int m; int w=0; void P(int semid,int semno) { struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid,&sop,1); } void V(int semid, int semno){ struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1); } void pa(){ P(m,1); w++; q[w]+=1; V(m,0); } void pb (){ P(m,0); printf(\w--; V(m,1); } int main(void){ pthread_t id1; pthread_t id2; pthread_t id3; pthread_t id4; int i,ret1,ret2; union semun arg; arg.val=0; m=semget(IPC_PRIVATE,2,IPC_CREAT|066); semctl(m,0,SETVAL,arg); arg.val=1; 1

第 6 页

semctl(m,1,SETVAL,arg); ret1=pthread_create(&id1,NULL,(void*)pa,NULL); if(ret1!=0){ printf(\exit (1); } printf(\ret2=pthread_create(&id2,NULL,(void*)pb,NULL); if(ret2!=0){ printf(\exit (1); } printf(\ pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }

实验二 Linux进程及同步

2.1 实验目的与内容

2.1.1 实验目的

了解并掌握Linux进程及同步 2.2.2 实验内容

编程模拟实现誊抄; 创建三个誊抄进程; 基于共享内存建立缓冲区; 创建同步信号灯;

对各誊抄进程施加P、V操作;

2.2 实验过程 2.2.1 预备知识

①并发程序的誊抄:

1

第 7 页

get程序:负责从输入序列f中读取字符并送到缓冲区s中; copy程序:把缓冲区s中的数据复制到缓冲区t中去; put程序:从缓冲区t中取出数据打印;

②誊抄的实现:

在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有4个信号灯分别为0、1、2、3

在进程中对信号灯的控制可简写为: get() copy() put() { { { p(0); p(1); p(3); p(2); get操作; put操作; copy操作; v(2); v(1); } v(0); } v(3); } 通过设置信号灯0的初值和利用通过设置信号灯1、2的初值和利通过设置信号灯3的初值和利用copy对信号灯0做v操作,使得用put对信号灯1做v操作、利用copy对信号灯3做v操作,使得当信号灯0的资源个数>0时,可get对信号灯2做v操作,使得当当信号灯3的资源个数>0时,可以进行get操作 信号灯1和信号灯2的资源个数以进行put操作 均>0时,可以进行copy操作

2.2.2 实验测试与结果

运行结果:

1

第 8 页

华科操作系统实验报告要点

运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。1.4源代码1:#include#include#include#include#includeintticket=
推荐度:
点击下载文档文档为doc格式
4983e85gze5ap1c1kzfj507xn0uyq600qin
领取福利

微信扫码领取福利

微信扫码分享