操作系统试验报告
cout<<"请输入新的进程名:"; cin>>name; for(i=0;i<available;i++){ if(!strcmp(work[i].name,name)){ flag=1; break; } } if(flag){ cout<<"错误,进程已存在"<<endl; } else{ cout<<"该进程所需 a 类资源:"; cin>>needa; cout<<"该进程所需 b 类资源:"; cin>>needb; t=1; cout<<name; if(needa>banker.rea){ cout<<"错误,所需 a 类资源大于银行家所剩 a 类资源"<<endl; t=0; } if(needb>banker.reb){ cout<<"错误,所需 b 类资源大于银行家所剩 b 类资源"<<endl; t=0; } if(t){ strcpy(work[available].name,name); work[available].needa=needa; work[available].needb=needb; available++; cout<<"添加进程成功"<<endl<<endl; } else{ cout<<"添加进程失败"<<endl<<endl; } } }
std::cout
(i==out)
std::cout
//消费一个产品 void { std::cerr std::cerr } //生产者 DWORD { while(g_continue){ WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(5000); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); } return } //消费者 DWORD { while(g_continue){ WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(5000); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return } 5 0; WINAPI Consumer(LPVOID lpPara) 0; WINAPI Producer(LPVOID lpPara) << << "消费产品 "成功" << " << ConsumeID << " ... "; std::endl; Consume()
hThreads[PRODUCERS_COUNT]; producerID[CONSUMERS_COUNT]; consumerID[THREADS_COUNT]; //生产者线程的标识符 //消费者线程的标识符
//创建生产者线程 for (int if } //创建消费者线程 for (int j=0; j<CONSUMERS_COUNT; ++j){ i=0;i<PRODUCERS_COUNT;++i){ (hThreads[i]==NULL) return -1; hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
std::cout
ቤተ መጻሕፍቲ ባይዱ
(out+1)%SIZE_OF_BUFFER;
//输出缓冲区当前的状态 4
for if if } }
(int (i==in)
i=0;i<SIZE_OF_BUFFER;++i){ << i <<"区"<<": << << " " " << <-<-g_buffer[i]; 生产"; 消费"; std::cout std::cout std::endl; <<
(in+1)%SIZE_OF_BUFFER;
//输出缓冲区当前的状态 for if if } } //从缓冲区中取出一个产品 void { std::cerr ConsumeID out = std::cerr << = << "取出产品 ... "; g_buffer[out]; "成功" << std::endl; Take() (int i=0;i<SIZE_OF_BUFFER;++i){ << i <<"区"<<": << << " " " << <-<-g_buffer[i]; 生产"; 消费"; std::cout std::cout std::endl; << std::cout (i==in) (i==out)
3、 实验结果
4、 实验心得
调整生产者或消费者的个数后运行程序进行对比,当生产者个数多于消费者个数 时,生产速度快,生产者经常等待消费者;反之,消费者经常等待。
6
实验二 1、 程序流程图
死锁避免(银行家算法)
开
始
添加进程 删除进程 分配失败
分配资源 分 配 成 功
资 源
结
束
2、
源代码
#include<stdio.h> #include<string.h> #include<iostream.h> #include<stdlib.h> #include<iomanip.h> #include<conio.h> const int MAX_P=20; const int MAXA=10; //定义资源的数量 const int MAXB=7; typedef struct node{ int a; int b; int rea; int reb; }bank; typedef struct node1{ char name[20]; 7
9
//分配资源 void inputactpcb() { char name[20]; int i,p; int a,b; int flag; cout<<endl<<"【分配资源】"<<endl; cout<<"请输入要分配资源的进程名:"; cin>>name; p=-1; for(i=0;i<available;i++){ if(!strcmp(work[i].name,name)){ p=i; break; } } if(p!=-1){ cout<<"该进程要分配 a 类资源数量:"; cin>>a; cout<<"该进程要分配 b 类资源数量:"; cin>>b; flag=1; if((a>banker.rea)||(a>work[p].needa-work[p].a)){ cout<<"错误,所分配 a 类资源大于银行家所剩 a 类资源或该进程还需数量"<<endl; flag=0; } if((b>banker.reb)||(b>work[p].needb-work[p].b)){ cout<<"错误,所分配 b 类资源大于银行家所剩 b 类资源或该进程还需数量"<<endl; flag=0; } if(flag){ banker.rea-=a; banker.reb-=b; work[p].a+=a; work[p].b+=b; cout<<"为进程分配资源成功"<<endl<<endl; } 10
hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]); if (hThreads[j]==NULL) return 3 -1;
} while(g_continue){ if(getchar()){ } } return } //生产一个产品,输出新产品的 ID 号 void { std::cerr std::cerr } //把新生产的产品放入缓冲区 void { std::cerr g_buffer[in] in = std::cerr << << = "加入新产品 ProductID; "成功" << std::endl; ... "; Append() << << "正在生产 "成功" << " << ++ProductID << " ... "; std::endl; Produce() 0; //按回车后终止程序运行 = false; g_continue