华工操作系统实验_第1页
华工操作系统实验_第2页
华工操作系统实验_第3页
华工操作系统实验_第4页
华工操作系统实验_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华工操作系统实验华工操作系统实验华工操作系统实验xxx公司华工操作系统实验文件编号:文件日期:修订次数:第1.0次更改批准审核制定方案设计,管理制度一、实验步骤:在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行:Thoseoutputcomefromchild,[系统时间]另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。这个程序不断地输出如下行:Thoseoutputcomefromchild,[系统时间]观察程序运行的结果,并对你看到的现象进行解释。在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var的值。主线程在循环中不断地对shared_var进行加1操作,即每次循环shared_var被加1;而新创建的线程则不断地对shared_var进行减1操作,即每次循环shared_var被减1。观察程序运行的结果,并对你看到的现象进行解释。二、实验数据:文件:#include<iostream>#include<string>#include<>#include<>#include<>usingnamespacestd;stringgetTime()an_ch2_1b");return0;}文件:#include<sys/>#include<>#include<>#include<>intshared_var=0;void*thread(void*arg){while(1){printf("inthethreadshared_var:%d\n",--shared_var);}}intmain(){pthread_tpt;intret=pthread_create(&pt,NULL,(void*)thread,NULL);if(ret!=0)printf("failtocreatethread\n");while(1){printf("inthemainshared_var:%d\n",++shared_var);}pthread_join(pt,NULL);return0;}生产者消费者问题(信号量)参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。用线程实现睡觉的理发师问题,(同步互斥方式采用信号量或mutex方式均可)理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。读者写者问题教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。生产者消费者问题()#include<>#include<>#include<>#include<>#include<>#include<>#include<>#defineN10...%d个顾客正在接待室等待。\n",--waiting);sleep(2);printf("一名顾客理发完成。\n");work=0;sem_post(&barber);if(waiting==0)printf("无顾客,理发师睡觉\n");}}void*Customer(void*arg){int*p=(int*)arg;intx=*p;pthread_mutex_lock(&mutex);if(chairs>0){chairs--;sem_post(&customer);if(waiting==0&&work==0){printf("第%d个顾客进来,唤醒理发师...\n",++x);waiting++;}elseprintf("第%d个顾客进来,%d个顾客正在接待室等待...\n",x+1,++waiting);pthread_mutex_unlock(&mutex);sem_wait(&barber);}else{pthread_mutex_unlock(&mutex);printf("第%d个顾客进来,没有座位而离开!\n",x+1);}}intmain(){sem_init(&customer,0,0);sem_init(&barber,0,1);chairs=N;pthread_tbar;pthread_tcus[N*100];intcus_id[N*100];pthread_create(&bar,NULL,Barber,NULL);inti;srand(time(0));for(i=0;i<N*100;i++){usleep(100000*(rand()%30));cus_id[i]=i;pthread_create(&cus[i],NULL,Customer,&cus_id[i]);}pthread_join(bar,NULL);for(i=0;i<N*100;i++){pthread_join(cus_id[i],NULL);}}读者写者问题()#include<>#include<>#include<>#include<sys/>#include<>#include<>#include<>#include<>sem_tRWMutex,mutex1,mutex2,mutex3,wrt;intwriteCount,readCount;structdata{ intid; intlastTime;};void*Reader(void*param){ intid=((structdata*)param)->id; intlastTime=((structdata*)param)->lastTime; printf("读进程%d等待读入\n",id); sem_wait(&mutex3); sem_wait(&RWMutex); sem_wait(&mutex2); readCount++; if(readCount==1)sem_wait(&wrt); sem_post(&mutex2); sem_post(&RWMutex); sem_post(&mutex3); printf("读进程%d开始读入,%d秒后完成\n",id,lastTime); sleep(lastTime); printf("读进程%d完成读入\n",id); sem_wait(&mutex2); readCount--; if(readCount==0)sem_post(&wrt); sem_post(&mutex2); pthread_exit(0);}void*Writer(void*param){ intid=((structdata*)param)->id; intlastTime=((structdata*)param)->lastTime; printf("写进程%d等待写入\n",id); sem_wait(&mutex1); writeCount++; if(writeCount==1)sem_wait(&RWMutex); sem_post(&mutex1); sem_wait(&wrt); printf("写进程%d开始写入,%d秒后完成\n",id,lastTime); sleep(lastTime); printf("写进程%d完成写入\n",id); sem_post(&wrt); sem_wait(&mutex1); writeCount--; if(writeCount==0)sem_post(&RWMutex); sem_post(&mutex1); pthread_exit(0);}intmain(){ pthread_ttid; pthread_attr_tattr; pthread_attr_init(&attr);sem_init(&mutex1,0,1);sem_init(&mutex2,0,1);sem_init(&mutex3,0,1);sem_init(&wrt,0,1);sem_init(&RWMutex,0,1);readCount=writeCount=0; intid=0;srand(time(0)); while(1){ introle=rand()%100;intlastTime=rand()%10;id++; structdata*d=(structdata*)malloc(sizeof(structdata)); d->id=id; d->lastTime=lastTime; if(role<50)continue;inti;if(p_dirent->d_type==DT_DIR){intcurDirentNameLen=strlen(direntName2)+1;backupDirName=(char*)malloc(curDirentNameLen);memset(backupDirName,0,curDirentNameLen);memcpy(backupDirName,direntName2,curDirentNameLen);strcat(direntName2,"/");strcat(direntName2,p_dirent->d_name);findfile(fileName1,direntName1,direntName2);memcpy(direntName2,backupDirName,curDirentNameLen);free(backupDirName);backupDirName=NULL;}elseif(!strcmp(fileName1,p_dirent->d_name)){charFileDirName[256];strcpy(FileDirName,direntName2);intcurDirentNameLen=strlen(direntName2)+1;backupDirName=(char*)malloc(curDirentNameLen);memset(backupDirName,0,curDirentNameLen);memcpy(backupDirName,FileDirName,curDirentNameLen);strcat(FileDirName,"/");strcat(FileDirName,p_dirent->d_name);strcat(command,direntName1);strcat(command,"");strcat(command,FileDirName);printf("%s%s\n",p_dirent->d_name,"文件相同,比较:");system(command);}}closedir(p_dir);}voidcomparefile(chardirentName1[],chardirentName2[]){charcommand[512];DIR*p_dir=NULL;structdirent*p_dirent=NULL;p_dir=opendir(direntName1);if(p_dir==NULL){my_error("opendirerror");}while((p_dirent=readdir(p_dir))!=NULL){char*backupDirName=NULL;if(p_dirent->d_name[0]=='.'){continue;}inti;if(p_dirent->d_type==DT_DIR){intcurDirentNameLen=strlen(direntName1)+1;backupDirName=(char*)malloc(curDirentNameLen);memset(backupDirName,0,curDirentNameLen);memcpy(backupDirName,direntName1,curDirentNameLen);strcat(direntName1,"/");strcat(direntName1,p_dirent->d_name);comparefile(direntName1,direntName2);memcpy(direntName1,backupDirName,curDirentNameLen);free(backupDirName);backupDirName=NULL;}else{charFileDirName[256];strcpy(FileDirName,direntName1);intcurDirentNameLen=strlen(direntName1)+1;backupDirName=(char*)malloc(curDirentNameLen);memset(backupDirName,0,curDirentNameLen);memcpy(backupDirName,FileDirName,curDirentNameLen);strcat(FileDirName,"/");strcat(FileDirName,p_dirent->d_name);findfile(p_dirent->d_name,FileDirName,direntName2);}}closedir(p_dir);}voidPrintDirentStruct(chardirentName[],intlevel){DIR*p_dir=NULL;structdirent*p_dirent=NULL;p_dir=opendir(direntName);if(p_dir==NULL){my_error("opendirerror");}while((p_dirent=readdir(p_dir))!=NULL){char*backupDirName=NULL;if(p_dirent->d_name[0]=='.'){continue;}inti;for(i=0;i<level;i++){printf("│");printf("");}printf("├───");printf("%s\n",p_dirent->d_name);,_PC_PATH_MAX); if((buf=(char*)malloc((size_t)size))!=NULL) cwd=getcwd(buf,(size_t)size); printf("%s$",cwd);}voidgetcmd(char*cmd){ while((cmd[0]=getchar())==''); inti=0; do{ i++; cmd[i]=getchar()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论