华工操作系统实验Word格式文档下载.docx
《华工操作系统实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华工操作系统实验Word格式文档下载.docx(25页珍藏版)》请在冰豆网上搜索。
unistd.h>
time.h>
usingnamespacestd;
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();
cout<
<
"
Thoseoutputcomefromchild,"
<
tmn<
endl;
sleep
(1);
//为了便于截屏使用sleep()函数延迟输出
return0;
an_ch2_1a.cpp文件:
sys/types.h>
cstdio>
pid_tpid;
pid=fork();
if(pid==-1)cout<
failtocreate"
elseif(pid==0)system("
./an_ch2_1b"
);
Consoleapp.c文件:
stdio.h>
pthread.h>
intshared_var=0;
void*thread(void*arg)
while
(1)
printf("
inthethreadshared_var:
%d\n"
--shared_var);
pthread_tpt;
intret=pthread_create(&
pt,NULL,(void*)thread,NULL);
if(ret!
=0)printf("
failtocreatethread\n"
inthemainshared_var:
++shared_var);
pthread_join(pt,NULL);
return0;
1.生产者消费者问题(信号量)
参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。
一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。
3个消费者不断地从缓冲中读取一个字符并输出。
为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。
可选的实验:
在上面实验的基础上实现部分消费者有选择地消费某些产品。
例如一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。
消费者要消费的产品没有时,消费者进程被阻塞。
注意缓冲的管理。
2.用线程实现睡觉的理发师问题,(同步互斥方式采用信号量或mutex方式均可)
理发师问题的描述:
一个理发店接待室有n张椅子,工作室有1张椅子;
没有顾客时,理发师睡觉;
第一个顾客来到时,必须将理发师唤醒;
顾客来时如果还有空座的话,他就坐在一个座位上等待;
如果顾客来时没有空座位了,他就离开,不理发了;
当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
3.读者写者问题
教材中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。
编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
1.生产者消费者问题(pro_con.c)
semaphore.h>
malloc.h>
#defineN10//缓冲区大小为100
char*buffer;
intcapacity=N;
sem_tmutex,empty,full;
void*produce_1()
while
(1)
{
sem_wait(&
empty);
mutex);
intr1=rand()%26;
intju=0;
for(inti=0;
i<
N;
i++)
if(buffer[i]=='
0'
)
{
buffer[i]='
A'
+r1;
printf("
生产者1号生产一个产品:
%c剩余容量为:
buffer[i],--capacity);
ju=1;
break;
}
}
if(ju==0)printf("
没有足够容量!
\n"
sem_post(&
full);
usleep(r1*100000);
void*produce_2()
intr2=rand()%26;
a'
+r2;
生产者2号生产一个产品:
usleep(r2*100000);
void*consume_1()
intju=0;
for(inti=0;
{
if(buffer[i]>
='
&
buffer[i]<
Z'
消费者1号消费一个产品:
buffer[i],++capacity);
buffer[i]='
;
}
if(ju==0)printf("
没有消费者1号所需的产品!
intr3=rand()%26;
usleep(r3*100000);
void*consume_2()
z'
消费者2号消费一个产品:
ju=1;
break;
没有消费者2号所需的产品!
intr4=rand()%26;
usleep(r4*100000);
void*consume_3()
if((buffer[i]>
&
buffer[i]<
)||(buffer[i]>
))
消费者3号消费一个产品:
没有产品可以消费!
intr5=rand()%26;
usleep(r5*100000);
buffer=(char*)malloc(N*sizeof(char*));
buffer[i]='
sem_init(&
mutex,1,1);
empty,0,N);
full,0,0);
srand(time(0));
pthread_ttid[5];
pthread_at