操作系统原理试验报告.docx
- 文档编号:4945941
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:11
- 大小:31.09KB
操作系统原理试验报告.docx
《操作系统原理试验报告.docx》由会员分享,可在线阅读,更多相关《操作系统原理试验报告.docx(11页珍藏版)》请在冰豆网上搜索。
操作系统原理试验报告
操作系统原理试验报告
学生姓名:
曾强
所在院系:
计算机学院
班级:
0901
学号:
U200914886
指导教师:
阳富民
实验二进(线)程同步与通信
一、目的
1、掌握Linux系统用户界面中键盘命令的使用。
2、学会一种Linux下的编程环境。
3、掌握Linux下进(线)程的概念。
4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。
二、要求
两个线程,共享公共变量a
线程1负责计算(+1)
线程2负责打印
三、内容
在LINUX系统内,编写一个程序,含有两个线程,设置两个信号灯并定义好P,V操作,利用两个信号灯实现两个线程的互斥。
最后利用gcc进行编译。
四、程序描述
源程序:
#include
#include
#include
#include
#include
voidP(intsemid,intindex);
voidV(intsemid,intindex);
intsemid;inta=0;intLOOPS=10;
pthread_tp1,p2;
void*subp1();
void*subp2();
main()
{
unionsemunsemopts;intres;
semid=semget(10,2,IPC_CREAT|0666);
semopts.val=1;
res=semctl(semid,0,SETVAL,semopts);
pthread_create(&p1,NULL,subp1,NULL);
semopts.val=0;
res=semctl(semid,1,SETVAL,semopts);
pthread_create(&p2,NULL,subp2,NULL);
pthread_join(p1,NULL);
pthread_join(p2,NULL);
semctl(semid,0,IPC_RMID,0);
}
voidP(intsemid,intindex)
{structsembufsem;
sem.sem_num=index;
sem.sem_op=-1;
sem.sem_flg=0;//:
操作标记:
0或IPC_NOWAIT等
semop(semid,&sem,1);//1:
表示执行命令的个数
return;
}
voidV(intsemid,intindex)
{
structsembufsem;
sem.sem_num=index;
sem.sem_op=1;
sem.sem_flg=0;
semop(semid,&sem,1);
return;
}
void*subp1()
{
inti,j;
for(i=0;i P(semid,0); printf("subp1: a=%d\n",a); V(semid,1); } return; } void*subp2() { inti,j; for(i=0;i P(semid,1); a+=1; V(semid,0); } return; } 五、调试记录 运行结果及分析 实验结果如预期。 将a每次加一并打印。 实验三DOS系统调用的扩充 一、目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。 3、掌握Linux下进(线)程的概念。 4、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。 二、要求 两个线程,共享公共变量a 线程1负责计算(+1) 线程2负责打印 三、内容 在LINUX系统内,编写一个程序,含有两个线程,设置两个信号灯并定义好P,V操作,利用两个信号灯实现两个线程的互斥。 最后利用gcc进行编译。 四、程序描述 源程序: Main.c: #include #include #include #include #include #defineflagIPC_CREAT|0666 char*itoa(intnum,char*str,intradix); intsemid; intshmid1;//共享内存s intshmid2;//共享内存t intmain(intargc,char*argv[]) { unionsemunsemopts; intres,i; char*s[3]; for(i=0;i<3;i++){ s[i]=(char*)malloc(sizeof(char)*32); } pid_tp1,p2,p3; intpp1,pp2,pp3; semid=semget(1,4,flag); semopts.val=1;//第一个信号灯赋值,S是否为空 res=semctl(semid,0,SETVAL,semopts); semopts.val=0;//第二个信号灯赋值,S是否为满 res=semctl(semid,1,SETVAL,semopts); semopts.val=1;//第三个信号灯赋值,T是否为空 res=semctl(semid,2,SETVAL,semopts); semopts.val=0;//第四个信号灯赋值,T是否为满 res=semctl(semid,3,SETVAL,semopts); shmid1=shmget(IPC_PRIVATE,100,flag); shmid2=shmget(IPC_PRIVATE,100,flag); itoa(semid,s[0],10); itoa(shmid1,s[1],10); itoa(shmid2,s[2],10); if((p1=fork())==0){ execv("./get",s); } elseif((p2=fork())==0){ execv("./copy",s); } elseif((p3=fork())==0){ execv("./put",s); } pp1=wait(&pp1);//等待get/copy/put结束; pp2=wait(&pp2);//删除信号灯/共享内存 pp3=wait(&pp3); shmctl(shmid1,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); exit(0); } char*itoa(intnum,char*str,intradix) { charindex[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; unsignedunum; inti=0,j,k; if(radix==10&&num<0) { unum=(unsigned)-num; str[i++]='-'; } elseunum=(unsigned)num; do{ str[i++]=index[unum%(unsigned)radix]; unum/=radix; }while(unum); str[i]='\0'; if(str[0]=='-') k=1; else k=0; for(j=k;j<=(i-1)/2.0+k;j++) { num=str[j]; str[j]=str[i-j-1+k]; str[i-j-1+k]=num; } returnstr; } Get.c: #include #include #include #include #include voidP(intsemid,intindex) {structsembufsem; sem.sem_num=index; sem.sem_op=-1; sem.sem_flg=0;//: 操作标记: 0或IPC_NOWAIT等 semop(semid,&sem,1);//1: 表示执行命令的个数 return; } voidV(intsemid,intindex) { structsembufsem; sem.sem_num=index; sem.sem_op=1; sem.sem_flg=0; semop(semid,&sem,1); return; } intmain(intargc,char*argv[]) { intsemid=atoi(argv[0]); char*s; FILE*in1; if((in1=fopen("./source","rb"))==NULL)exit(-1); s=(char*)shmat(atoi(argv[1]),NULL,10); do{ P(semid,0); *s=fgetc(in1); V(semid,1); }while((*s! =EOF)); fclose(in1); return0; } copy.c: #include #include #include #include #include #include voidP(intsemid,intindex) {structsembufsem; sem.sem_num=index; sem.sem_op=-1; sem.sem_flg=0;//: 操作标记: 0或IPC_NOWAIT等 semop(semid,&sem,1);//1: 表示执行命令的个数 return; } voidV(intsemid,intindex) { structsembufsem; sem.sem_num=index; sem.sem_op=1; sem.sem_flg=0; semop(semid,&sem,1); return; } intmain(intargc,char*argv[]) { char*s1,*s2; intsemid=atoi(argv[0]); s1=(char*)shmat(atoi(argv[1]),NULL,10); s2=(char*)shmat(atoi(argv[2]),NULL,10); do{ P(semid,2); P(semid,1); *s2=*s1; V(semid,0); V(semid,3); }while(*s2! =EOF); return0; } Put.c #include #include #include #include #include //#defineSHM_R|SHM_W10 voidP(intsemid,intindex) {structsembufsem; sem.sem_num=index; sem.sem_op=-1; sem.sem_flg=0;//: 操作标记: 0或IPC_NOWAIT等 semop(semid,&sem,1);//1: 表示执行命令的个数 return; } voidV(intsemid,intindex) { structsembufsem; sem.sem_num=index; sem.sem_op=1; sem.sem_flg=0; semop(semid,&sem,1); return; } intmain(intargc,char*argv[]) { intsemid=atoi(argv[0]); intn; char*s; FILE*in2; if((in2=fopen("./target","wb"))==NULL)exit(-1); s=(char*)shmat(atoi(argv[2]),NULL,10); while (1){ P(semid,3); if(*s! =EOF){ fputc(*s,in2); V(semid,2); } else{ V(semid,2); break; } } fclose(in2); return0; } 五、调试记录 最后执行main程序,得到与源文件一样的目标文件,实验结果与预期的一样。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 试验报告