您好,欢迎访问三七文档
一、实验步骤:1.在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行:Thoseoutputcomefromchild,[系统时间]另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。这个程序不断地输出如下行:Thoseoutputcomefromchild,[系统时间]观察程序运行的结果,并对你看到的现象进行解释。2.在linux环境下编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var的值。主线程在循环中不断地对shared_var进行加1操作,即每次循环shared_var被加1;而新创建的线程则不断地对shared_var进行减1操作,即每次循环shared_var被减1。观察程序运行的结果,并对你看到的现象进行解释。二、实验数据:an_ch2_1b.cpp文件:#includeiostream#includestring#includestdlib.h#includeunistd.h#includetime.husingnamespacestd;stringgetTime()//获取系统时间{time_ttimep;time(&timep);chartmp[64];strftime(tmp,sizeof(tmp),%Y-%m-%d%H:%M:%S,localtime(&timep));returntmp;}intmain(){while(true){stringtmn=getTime();coutThoseoutputcomefromchild,tmnendl;sleep(1);//为了便于截屏使用sleep()函数延迟输出}return0;}an_ch2_1a.cpp文件:#includeiostream#includesys/types.h#includeunistd.h#includecstdio#includestdlib.husingnamespacestd;intmain(){pid_tpid;pid=fork();if(pid==-1)coutfailtocreateendl;elseif(pid==0)system(./an_ch2_1b);return0;}Consoleapp.c文件:#includesys/types.h#includestdio.h#includeunistd.h#includepthread.hintshared_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;}1.生产者消费者问题(信号量)参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。可选的实验:在上面实验的基础上实现部分消费者有选择地消费某些产品。例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。注意缓冲的管理。2.用线程实现睡觉的理发师问题,(同步互斥方式采用信号量或mutex方式均可)理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。3.读者写者问题教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。1.生产者消费者问题(pro_con.c)#includepthread.h#includeunistd.h#includesemaphore.h#includestdio.h#includestdlib.h#includetime.h#includemalloc.h#defineN10//缓冲区大小为100char*buffer;intcapacity=N;sem_tmutex,empty,full;void*produce_1(){while(1){sem_wait(&empty);sem_wait(&mutex);intr1=rand()%26;intju=0;for(inti=0;iN;i++){if(buffer[i]=='0'){buffer[i]='A'+r1;printf(生产者1号生产一个产品:%c剩余容量为:%d\n,buffer[i],--capacity);ju=1;break;}}if(ju==0)printf(没有足够容量!\n);sem_post(&mutex);sem_post(&full);usleep(r1*100000);}}void*produce_2(){while(1){sem_wait(&empty);sem_wait(&mutex);intr2=rand()%26;intju=0;for(inti=0;iN;i++){if(buffer[i]=='0'){buffer[i]='a'+r2;printf(生产者2号生产一个产品:%c剩余容量为:%d\n,buffer[i],--capacity);ju=1;break;}}if(ju==0)printf(没有足够容量!\n);sem_post(&mutex);sem_post(&full);usleep(r2*100000);}}void*consume_1(){while(1){sem_wait(&full);sem_wait(&mutex);intju=0;for(inti=0;iN;i++){if(buffer[i]='A'&&buffer[i]='Z'){printf(消费者1号消费一个产品:%c剩余容量为:%d\n,buffer[i],++capacity);buffer[i]='0';ju=1;break;}}if(ju==0)printf(没有消费者1号所需的产品!\n);sem_post(&mutex);sem_post(&empty);intr3=rand()%26;usleep(r3*100000);}}void*consume_2(){while(1){sem_wait(&full);sem_wait(&mutex);intju=0;for(inti=0;iN;i++){if(buffer[i]='a'&&buffer[i]='z'){printf(消费者2号消费一个产品:%c剩余容量为:%d\n,buffer[i],++capacity);buffer[i]='0';ju=1;break;}}if(ju==0)printf(没有消费者2号所需的产品!\n);sem_post(&mutex);sem_post(&empty);intr4=rand()%26;usleep(r4*100000);}}void*consume_3(){intju=0;while(1){sem_wait(&full);sem_wait(&mutex);intju=0;for(inti=0;iN;i++){if((buffer[i]='A'&&buffer[i]='Z')||(buffer[i]='a'&&buffer[i]='z')){printf(消费者3号消费一个产品:%c剩余容量为:%d\n,buffer[i],++capacity);buffer[i]='0';ju=1;break;}}if(ju==0)printf(没有产品可以消费!\n);sem_post(&mutex);sem_post(&empty);intr5=rand()%26;usleep(r5*100000);}}intmain(){buffer=(char*)malloc(N*sizeof(char*));for(inti=0;iN;i++){buffer[i]='0';}sem_init(&mutex,1,1);sem_init(&empty,0,N);sem_init(&full,0,0);srand(time(0));pthread_ttid[5];pthread_attr_tattr;pthread_attr_init(&attr);pthread_create(&tid[0],&attr,produce_1,NULL);pthread_create(&tid[1],&attr,produce_2,NULL);pthread_create(&tid[2],&attr,consume_1,NULL);pthread_create(&tid[3],&attr,consume_2,NULL);pthread_create(&tid[4],&attr,consume_3,NULL);for(inti=0;i5;i++){pthread_join(tid[i],NULL);}return0;}2.用线程实现睡觉的理发师问题(barber.c)#includepthread.h#includestdio.h#includestdlib.h#includetime.h#includeunistd.h#includesemaphore.h#defineN5sem_tcustomer,barber;intchairs,waiting=0,work=0;pthread_mutex_tmutex;void*Barber(){printf(无顾客,理发师睡觉\n);while(1){sem_wait(&customer);pthread_mutex_lock(&mutex);chairs++;pthread_mutex_unlock(&mutex);work=1;printf(理发师正在给一名顾客理发.....%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(chairs0){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)
本文标题:华工操作系统实验
链接地址:https://www.777doc.com/doc-5651915 .html