操作系统课程设计Word文档格式.docx
《操作系统课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计Word文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
WPARAMwParam,
LPARAMlParam
)
{
HDChdc;
staticPCSTRoutPut="
"
;
PAINTSTRUCTps;
switch(uMsg)
{
caseWM_PAINT:
hdc=BeginPaint(hwnd,&
ps);
TextOut(hdc,0,0,"
这是一个win32程序"
strlen("
));
EndPaint(hwnd,&
break;
caseWM_LBUTTONDOWN:
MessageBox(hwnd,"
mouse"
"
张晓磊"
MB_OK);
hdc=GetDC(hwnd);
TextOut(hdc,0,40,"
您单击了鼠标"
ReleaseDC(hwnd,hdc);
break;
caseWM_COMMAND:
switch(LOWORD(wParam))
{
caseFILE_MENU1:
hdc=GetDC(hwnd);
outPut=fun1(hInst);
//从dll文件里获得字符串
TextOut(hdc,0,80,outPut,strlen(outPut));
TextOut(hdc,0,60,"
点击了menu1"
caseFILE_MENU2:
hdc=GetDC(hwnd);
outPut=fun2(hInst);
TextOut(hdc,0,100,outPut,strlen(outPut));
TextOut(hdc,0,120,"
点击了menu2"
caseHELP_ABOUT:
MessageBox(hwnd,"
这是一个win32测试程序"
帮助"
break;
caseFILE_EXIT:
if(IDYES==MessageBox(hwnd,"
是否真的要退出?
"
!
MB_YESNO))
DestroyWindow(hwnd);
}
caseWM_CLOSE:
if(IDYES==MessageBox(hwnd,"
caseWM_DESTROY:
PostQuitMessage(0);
default:
returnDefWindowProc(hwnd,uMsg,wParam,lParam);
}
return0;
}
2、intWINAPIDllMain(HINSTANCEhinstance,DWORDfdwreason,PVOIDpvreserved)
switch(fdwreason)
caseDLL_PROCESS_ATTACH:
caseDLL_THREAD_ATTACH:
caseDLL_PROCESS_DETACH:
caseDLL_THREAD_DETACH:
returnTRUE;
EXPORTPCSTRfun1(HINSTANCEhinstance)
PCSTRptr="
从fun1中得到dll.位置:
strcpy(lpszname,ptr);
intsize=101-strlen(ptr);
char*temp=&
lpszname[strlen(ptr)];
GetModuleFileName(hinstance,temp,size);
infor=lpszname;
returninfor;
EXPORTPCSTRfun2(HINSTANCEhinstance)
{PCSTRptr="
从fun2中得到dll.位置:
设计2读者写着问题
1、熟悉用信号量机制,实现读者优先与写者优先。
理解写者优先、读者优先算法
在Windows2000环境下,创建一个控制台进程,此进程包含n个线程。
用这n个线程来表示n个读者或写者。
每个线程按相应测试数据文件的要求进行读写操作。
用信号量机制分别实现读者优先和写者优先的读者-写者问题。
1、读者优先-读者线程的流程图:
2、读者优先-写者线程的流程图
3、写者优先-读者线程:
4、写者优先—写者线程:
1、建立文件thread.dat,在文件中写入:
1R35
2W45
3R52
4R65
5W5.13
2、程序运行的之后出现一个选择菜单(1:
ReaderPriority2:
WriterPriority3:
ExittoWindows)。
选择读者优先,结果:
选择写者优先,结果:
1、学会了互斥对象和临界区对象的使用方法。
2、当一个线程进入临界区后,其它线程若想进入必须等待。
读者优先:
除非有写者在写文件,否则读者不需要等待。
写者优先:
与读者优先类似。
不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。
1、//读者优先发展——读者线程
//P:
读者线程信息
voidRP_ReaderThread(void*p)
//互斥变量
HANDLEh_Mutex;
h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,false,"
metux_for_readcount"
);
DWORDwait_for_mutex;
//等待互斥变量所有权
DWORDm_delay;
//延迟时间
DWORDm_persist;
//读文件持续时间
intm_serial;
//线程序号
//从参数中获得信息
m_serial=((ThreadInfo*)(p))->
serial;
m_delay=(DWORD)(((ThreadInfo*)(p))->
delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo*)(p))->
persist*INTE_PER_SEC);
Sleep(m_delay);
//延迟等待
printf("
Readerthread%dsentsthereadingrequire.\n"
m_serial);
//等待互斥信号,保证对readcount的访问,修改和互斥
wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
//读者数目增多
readcount++;
if(readcount==1)
//第一个读者,等待资源
EnterCriticalSection(&
RP_Write);
ReleaseMutex(h_Mutex);
//释放互斥信号
//读文件
Readerthread%dbeginstoreadfile.\n"
Sleep(m_persist);
//退出进程
Readerthread%dfinishedreadingfile.\n"
//等待互斥信号,保证对readcount的访问,修改和互斥
//读者数目减少
readcount--;
if(readcount==0)
//如果所有读者读完,唤醒写者
LeaveCriticalSection(&
//释放互斥信号
//读者优先--写者线程
//p:
写者线程信息
voidRP_WriterThread(void*p)
//写文件持续时间
Writerthread%dsentsthewritingrequire.\n"
//等待资源
EnterCriticalSection(&
//写文件
Writerthread%dbeginstowritetothefile.\n"
Writerthread%dfinishedwritingtothefile.\n"
//释放资源
LeaveCriticalSection(&
2、//写者优先--读者线程
voidWP_ReaderThread(void*p)
//互斥变量
HANDLEh_Mutex1;
h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,false,"
metux1"
HANDLEh_Mutex2;
h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,false,"
metux2"
DWORDwait_for_mutex1;
//等待互斥变量所有权
DWORDwait_for_mutex2;
//延迟时间
//读文件持续时间
//线程序号
//延迟等待
wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);
//进入读者临界区
cs_read);
//阻塞互斥对象mutex2,保证对mutex1的访问、修改互斥
wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
//修改读者数目
//如果是第一个读者,等待写者写完
cs_Write);
ReleaseMutex(h_Mutex2);
//释放互斥信号Mutex2
//让其他读者进入临界区
ReleaseMutex(h_Mutex1);
//读文件
//阻塞互斥对象mutex2,保证对readcount的访问,修改和互斥
//最后一个读者,唤醒写者
//写者优先--写者线程
voidWP_WriterThread(void*p)
//写文件持续时间
DWORDwait_for_mutex3;
//互斥对象
HANDLEh_Mutex3;
h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,false,"
metux3"
//阻塞互斥对象mutex3,保证对writecount的访问,修改和互斥
wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
writecount++;
if(writecount==1)
//第一个写者,等待读者读完
ReleaseMutex(h_Mutex3);
//释放互斥信号Mutex3
//进入写者临界区
//离开临界区
writecount--;
if(writecount==0)
//写者写完,读者可以读
设计3内存管理
1、从不同侧面了解Windows2000/xp对用户进程的虚拟内存空间的管理、分配方法。
同时需要了解跟踪程序的编写方法。
2、对Windows分配虚拟内存、改变内存状态,以及对物理内存和页面文件状态查询的API函数的功能、参数限制、使用规则要进一步了解。
使用Windows2000/xp的API函数,编写一个包含连个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。
模拟内存活动的线程可以从一个文件中读出妖精性的内存操作,每个内存操作包括如下内容:
1、时间:
操作等待时间。
2、块数:
分配内存的粒度。
3、操作:
包括保留一个区域和加锁与解锁一个区域,可以将这些操作编写存放于文件。
4、大小:
块的大小。
5、访问权限:
可以将权限编号存放于文件中跟踪县城将页面大小、已使用的地址范围、以及内存总量等新型显示出来。
1、先编译memory1.cpp生成memory.exe,运行memory1.exe程序,生成openfile文件。
将penfile文件拷贝到memory2.cpp的目录中,编译并运行,可以出现如下结果:
1、通过内存分配活动模拟和跟踪的编程实现,从不同侧面了解Windows2000/XP对用户进程虚拟内存的管理,分配方法。
也使自己对课本上所讲的内存管理的知识有了更时刻的理解与认识,从试验结果中更直观的体会到内存的分配方法。
2、对页面文件状态查询的API函数的功能、参数限制、使用规则有了更多地了解。
3、通过本次实验了解了Windows操作系统对虚拟内存的管理与分配方法。
1、//生成openfile文件
#include<
fstream.h>
stdio.h>
stdlib.h>
time.h>
structoperation
inttime;
//起始时间
intblock;
//内存页数
intoper;
//操作
intprotection;
//权限
};
intmain()
FILE*file;
file=fopen("
opfile"
wb"
//"
为二进制用以确定内存操作
operationop;
for(intj=0;
j<
6;
j++)//0-保留;
1-提交;
2-锁;
3-解锁;
4-回收;
5-释放
for(inti=0;
i<
5;
i++)
//0-PAGE_READONLY;
//1-PAGE_READWRITE;
//2-PAGE_EXECUTE;
//3-PAGE_EXECUTE_READ;
//4-PAGE_EXECUTE_READWRITE;
op.time=rand()%1000;
//随即生成等待时间
op.block=rand()%5+1;
//随即生成块大小
op.oper=j;
op.protection=i;
fwrite(&
op,sizeof(operation),1,file);
//将生成的结构写入文件
return0;
2、#include<
windows.h>
iostream.h>
structtrace//跟踪每一次分配活动的数据结构
LPVOIDstart;
//起始地址
longsize;
//分配的大小
HANDLEallo,trac;
//信号量句柄
DWOR