A操作系统课程设计Word格式.docx
- 文档编号:6228764
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:26
- 大小:137.19KB
A操作系统课程设计Word格式.docx
《A操作系统课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《A操作系统课程设计Word格式.docx(26页珍藏版)》请在冰点文库上搜索。
设计一个多道程序完成上述操作。
图1Buffer操作
(1)可以随机产生字符数据,由put操作放入Buff1,buffer中容量单位是字符。
(2)提供良好图形界面,显示Buffer的操作过程。
(3)可以设定各Buffer的容量、PUT、GET、Move操作的个数;
(4)可以设定PUT、GET、Move操作的速度;
(5)实时显示每个Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;
(6)实时显示线程、进程所处于等待(阻塞)状态的个数
(7)程序运行结束,显示汇总数据:
总的运行时间;
Buffer中数据的个数;
已放入BUFFER的数据个数;
已放已取的数据个数;
平均每个buffer中的数据个数。
1.3课程设计使用的开发语言和工具
语言:
C++
开发环境:
VisualStudio2008及其开发环境下的MFC平台。
1.4解决的主要问题
(1)MFC界面设计
(2)模拟生产者消费者的互斥操作
(3)各信号量的使用
2使用的基本概念和原理
2.1MFC
MFC是Windows下程序设计的最流行的一个类库,它合理的封装了WIN32API函数,并设计了一套方便的消息映射机制。
2.2MFC的消息实现机制
在MFC的框架结构下,可以进行消息处理的类的头文件里面都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声明。
所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。
CCmdTarget类是MFC处理命令消息的基础和核心。
2.3线程
线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作。
2.4信号量
信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务。
3总体设计
确定基本技术路线为面向对象程序设计,使用MFC编写程序,建立基本对话框。
在对话框中设立生产者、MOVE、消费者板块,各板块内的按钮能控制各自线程的建立、暂停以及相关数据的设定。
通过创建生产者线程往BUFFER1中投放随机产生的字符,创建MOVE1线程将BUFFER1中的字符移动到BUFFER2中,创建MOVE2线程将BUFFER2中的字符移动到BUFFER3中,创建消费者线程从BUFFER3中取出字符消费。
建立信号量,因为生产者线程和MOVE1线程共同使用临界资源BUFFER1,所以用Mutex信号量来协调生产者线程和MOVE1线程;
因为MOVE1线程和MOVE2线程共同使用临界资源BUFFER2,所以用Mutex1信号量来协调MOVE1线程和MOVE2线程,因为MOVE2线程和消费者线程共同使用临界资源BUFFER3,所以用Mutex3信号量来协调MOVE2线程和消费者线程。
4详细设计
4.1ThreadInfo结构体
typedefstructThreadInfo{
CListBox*pList;
}thread,*lpthread;
此结构体用来保存在线程建立时往线程中传送的参数信息(如该线程指定的操作控件),以供在本线程中使用。
4.2线程操作函数
4.2.1执行函数的声明
分别声明生产者、MOVE1、MOVE2、消费者函数,格式为:
DWORDWINAPIthreadFIFO(LPVOIDlparam);
//声明3个不同的生产者线程,主要区别是能分别输出该生产的字符是哪个生产者生产的。
DWORDWINAPIProductor1(LPVOIDpthread)
DWORDWINAPIProductor2(LPVOIDpthread)
DWORDWINAPIProductor3(LPVOIDpthread)
//声明MOVE1线程。
DWORDWINAPIMove1(LPVOIDpthread)
//声明MOVE2线程。
DWORDWINAPIMove2(LPVOIDpthread)
//声明3个不同的消费者线程,主要区别是能分别输出该消费的字符是哪个消费者消费的。
DWORDWINAPIConsumer1(LPVOIDpthread)
DWORDWINAPIConsumer2(LPVOIDpthread)
DWORDWINAPIConsumer3(LPVOIDpthread)
4.2.2定义12个线程
//3个生产者线程
hThread1=CreateThread(NULL,0,Productor1,&
thread1,0,&
ProducterID);
hThread2=CreateThread(NULL,0,Productor2,&
hThread7=CreateThread(NULL,0,Productor3,&
//3个MOVE1线程
hThread5=CreateThread(NULL,0,Move1,&
thread3,0,&
MoveID[0]);
hThread9=CreateThread(NULL,0,Move1,&
hThread10=CreateThread(NULL,0,Move1,&
//3个MOVE2线程
hThread6=CreateThread(NULL,0,Move2,&
thread4,0,&
MoveID[1]);
hThread11=CreateThread(NULL,0,Move2,&
hThread12=CreateThread(NULL,0,Move2,&
4.2.3各信号量的定义
Mutex=CreateMutex(NULL,false,NULL);
Mutex1=CreateMutex(NULL,false,NULL);
Mutex2=CreateMutex(NULL,false,NULL);
BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);
BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);
/
Buffer1Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);
Buffer1Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);
Buffer2Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);
Buffer2Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);
4.2.4各线程的函数接口的定义及算法描述
生产者线程函数接口:
DWORDWINAPIProductor1(LPVOIDpthread)
{
lpthreadtemp=(lpthread)pthread;
CStringstr=_T("
生产者:
"
);
while(control){
WaitForSingleObject(BufferFull,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
buffer[in%BUFFER_SIZE1]=(char)('
Z'
-rand()%26);
temp->
pList->
AddString(str+buffer[in%BUFFER_SIZE1]);
c_Buffer.AddString(buffer[in%BUFFER_SIZE1]);
in=in+1;
Sleep(t1);
ReleaseMutex(Mutex);
ReleaseSemaphore(BufferEmpty,1,NULL);
}
returntrue;
}
MOVE1线程函数接口:
intflag;
while(control){WaitForSingleObject(BufferEmpty,INFINITE);
WaitForSingleObject(Buffer1Full,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
WaitForSingleObject(Mutex1,INFINITE);
buffer1[mov1%BUFFER_SIZE1]=buffer[mov1%BUFFER_SIZE1];
temp->
AddString(str+buffer1[mov1%BUFFER_SIZE1]);
flag=c_Buffer.FindString(0,(LPCTSTR)buffer[mov1%BUFFER_SIZE1]);
if(flag!
=CB_ERR)
{
c_Buffer.DeleteString(flag);
}
buffer[mov1%BUFFER_SIZE1]="
0"
;
mov1=mov1+1;
Sleep(t2);
ReleaseMutex(Mutex1);
ReleaseSemaphore(BufferFull,1,NULL);
ReleaseSemaphore(Buffer1Empty,1,NULL);
}
MOVE2线程函数接口:
while(control){
WaitForSingleObject(Buffer1Empty,INFINITE);
WaitForSingleObject(Buffer2Full,INFINITE);
WaitForSingleObject(Mutex2,INFINITE);
buffer2[mov2%BUFFER_SIZE1]=buffer1[mov2%BUFFER_SIZE1];
AddString(str+buffer2[mov2%BUFFER_SIZE1]);
flag=c_Buffer1.FindString(0,(LPCTSTR)buffer1[mov2%BUFFER_SIZE1]);
c_Buffer1.DeleteString(flag);
buffer1[mov2%BUFFER_SIZE1]="
mov2=mov2+1;
ReleaseMutex(Mutex2);
ReleaseSemaphore(Buffer1Full,1,NULL);
ReleaseSemaphore(Buffer2Empty,1,NULL);
消费者线程函数的接口:
消费者:
WaitForSingleObject(Buffer2Empty,INFINITE);
AddString(str+buffer2[out%BUFFER_SIZE1]);
flag=c_Buffer2.FindString(0,(LPCTSTR)buffer2[out%BUFFER_SIZE1]);
c_Buffer2.DeleteString(flag);
buffer2[out%BUFFER_SIZE1]="
out=out+1;
Sleep(t3);
ReleaseSemaphore(Buffer2Full,1,NULL);
4.3其他辅助函数
//创建线程响应函数
voidCConsuProduThreadDlg:
:
OnCreateThread()
GetDlgItem(IDC_DESTROY_THREAD)->
EnableWindow(true);
GetDlgItem(IDC_PRODUCTOR1)->
GetDlgItem(IDC_PRODUCTOR2)->
GetDlgItem(IDC_PRODUCTOR3)->
GetDlgItem(IDC_MOVE1)->
GetDlgItem(IDC_MOVE2)->
GetDlgItem(IDC_MOVE3)->
GetDlgItem(IDC_CONSUMER1)->
GetDlgItem(IDC_CONSUMER2)->
GetDlgItem(IDC_CONSUMER3)->
GetDlgItem(IDC_CREATE_THREAD)->
EnableWindow(false);
ct1=CTime:
GetCurrentTime();
((CComboBox*)GetDlgItem(IDC_COMBO1))->
GetWindowText(buff);
control=true;
BUFFER_SIZE1=_wtoi(buff.GetBuffer());
((CEdit*)GetDlgItem(IDC_EDIT1))->
GetWindowText(T1);
t1=(_tstoi(T1))*1000;
((CEdit*)GetDlgItem(IDC_EDIT2))->
GetWindowText(T2);
t2=(_tstoi(T2))*1000;
((CEdit*)GetDlgItem(IDC_EDIT3))->
GetWindowText(T3);
t3=(_tstoi(T3))*1000;
Mutex=CreateMutex(NULL,false,NULL);
BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);
/
BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);
//结束线程响应函数
OnDestroyThread()
DWORDcode;
control=false;
intgct1,gct2,gct3,gct4,gct5,gct6,gct7,gct8,gct9,gct10,gct11,gct12;
gct1=GetExitCodeThread(hThread1,&
code);
gct2=GetExitCodeThread(hThread2,&
gct3=GetExitCodeThread(hThread3,&
gct4=GetExitCodeThread(hThread4,&
gct5=GetExitCodeThread(hThread5,&
gct6=GetExitCodeThread(hThread6,&
gct7=GetExitCodeThread(hThread7,&
gct8=GetExitCodeThread(hThread8,&
gct9=GetExitCodeThread(hThread9,&
gct10=GetExitCodeThread(hThread10,&
gct11=GetExitCodeThread(hThread11,&
gct12=GetExitCodeThread(hThread12,&
if(gct1&
&
code==STILL_ACTIVE){
TerminateThread(hThread1,0);
CloseHandle(hThread1);
if(gct2&
TerminateThread(hThread2,0);
CloseHandle(hThread2);
if(gct3&
TerminateThread(hThread3,0);
CloseHandle(hThread3);
if(gct4&
TerminateThread(hThread4,0);
CloseHandle(hThread4);
if(gct5&
TerminateThread(hThread5,0);
CloseHandle(hThread5);
if(gct6&
TerminateThread(hThread6,0);
CloseHandle(hThread6);
if(gct7&
TerminateThread(hThread7,0);
CloseHandle(hThread7);
if(gct8&
TerminateThread(hThread8,0);
CloseHandle(hThread8);
if(gct9&
TerminateThread(hThread9,0);
CloseHandle(hThread9);
if(gct10&
TerminateThread(hThread10,0);
CloseHandle(hThread10);
if(gct11&
TerminateThread(hThread11,0);
CloseHandle(hThread11);
if(gct12&
TerminateThread(hThread12,0);
CloseHandle(hThread12);
CTimect2=CTime:
intct11=ct1.GetSecond();
intct22=ct2.GetSecond();
intct33=ct22-ct11;
CStringStr=_T("
总的运行时间:
CStringStr1;
intt;
Str1.Format(TEXT("
%d"
),ct33);
Str+=Str1;
c_End.AddStri
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计